`
Elvis_Wu
  • 浏览: 52251 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

另类的Struts配置

    博客分类:
  • JAVA
阅读更多
JPetStore-5.0程序中不一样的struts
关键字: struts
平常我们使用struts会定义form,写Action,设置struts-config.xml文件,然后页面的数据是以form对象传给Action,然后调用Service层,完成业务,再返回struts-config.xml配置的页面。
而JPetStore-5.0的struts不同,例如:
页面是这样的
<html:form method="post" action="/shop/editAccount.shtml">   
    <html:hidden name="accountBean" property="validation" value="edit"/>   
    <html:hidden name="accountBean" property="username"/>   
    <h3>User Information</h3>   
    <table>   
      <tr>   
        <td>User ID:</td><td><bean:write name="accountBean" property="username"/></td>   
      </tr><tr>   
      <td>New password:</td><td><html:password name="accountBean" property="password"/></td>   
    </tr><tr>   
      <td>Repeat password:</td><td><html:password name="accountBean" property="repeatedPassword"/></td>   
    </tr>   
    </table>   
    <%@ include file="IncludeAccountFields.jsp" %>   
    <input type="submit" name="submit" value="Save Account Information"/>   
</html:form> 
 
  

<html:form method="post" action="/shop/editAccount.shtml">
    <html:hidden name="accountBean" property="validation" value="edit"/>
    <html:hidden name="accountBean" property="username"/>
    <h3>User Information</h3>
    <table>
      <tr>
        <td>User ID:</td><td><bean:write name="accountBean" property="username"/></td>
      </tr><tr>
      <td>New password:</td><td><html:password name="accountBean" property="password"/></td>
    </tr><tr>
      <td>Repeat password:</td><td><html:password name="accountBean" property="repeatedPassword"/></td>
    </tr>
    </table>
    <%@ include file="IncludeAccountFields.jsp" %>
    <input type="submit" name="submit" value="Save Account Information"/>
</html:form>


struts-config.xml的配置文件是这样的
 
<form-beans>   
    <form-bean name="accountBean" type="com.ibatis.jpetstore.presentation.AccountBean"/>   
</form-beans>   
<action path="/shop/editAccount" type="org.apache.struts.beanaction.BeanAction" 
            name="accountBean" scope="session" 
            validate="true" input="/account/EditAccountForm.jsp">   
      <forward name="success" path="/shop/index.shtml"/>   
</action> 

<form-beans>
    <form-bean name="accountBean" type="com.ibatis.jpetstore.presentation.AccountBean"/>
</form-beans>
<action path="/shop/editAccount" type="org.apache.struts.beanaction.BeanAction"
            name="accountBean" scope="session"
            validate="true" input="/account/EditAccountForm.jsp">
      <forward name="success" path="/shop/index.shtml"/>
</action>


AccountBean是这样的:
public String editAccount() {   
    try {   
      accountService.updateAccount(account);   
      account = accountService.getAccount(account.getUsername());   
      myList = catalogService.getProductListByCategory(account.getFavouriteCategoryId());   
      return SUCCESS;   
    } catch (Exception e) {   
      throw new BeanActionException ("There was a problem updating your Account Information. Cause: "+e, e);   
    }   
} 

public String editAccount() {
    try {
      accountService.updateAccount(account);
      account = accountService.getAccount(account.getUsername());
      myList = catalogService.getProductListByCategory(account.getFavouriteCategoryId());
      return SUCCESS;
    } catch (Exception e) {
      throw new BeanActionException ("There was a problem updating your Account Information. Cause: "+e, e);
    }
}



jsp把页面form提交给了/shop/editAccount.shtml,其实所有的数据都提到了一个类里org.apache.struts.beanaction.BeanAction,这个类其实就是一个我们平常写的Action,里面是这样的:

public final ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {   
    String forward = SUCCESS_FORWARD;   
    try {   
      if (!(form instanceof BaseBean)) {   
        if (form != null) {   
          throw new BeanActionException("The form for mapping '" + mapping.getPath() + "' named '" + mapping.getName() + "' was not an instance of BaseBean. BeanAction requires an BaseBean instance.");   
        } else {   
          throw new BeanActionException("The form for mapping '" + mapping.getPath() + "' named '" + mapping.getName() + "' was null. BeanAction requires an BaseBean instance.");   
        }   
      }   
      BaseBean bean = (BaseBean) form;   
      ActionContext.initCurrentContext(request, response);   
      if (bean != null) {   
        // Explicit Method Mapping   

        Method method = null;   
        String methodName = mapping.getParameter();   
        if (methodName != null && !NO_METHOD_CALL.equals(methodName)) {   
          try {   
            method = bean.getClass().getMethod(methodName, null);   
            synchronized (bean) {   
              forward = bean.getInterceptor().intercept(new ActionInvoker(bean, method));   
            }   
          } catch (Exception e) {   
            throw new BeanActionException("Error dispatching bean action via method parameter ('" + methodName + "'). Cause: " + e, e);   
          }   
        }   
    
        // Path Based Method Mapping   

        if (method == null && !NO_METHOD_CALL.equals(methodName)) {   
          methodName = mapping.getPath();   
          if (methodName.length() > 1) {   
            int slash = methodName.lastIndexOf("/") + 1;   
            methodName = methodName.substring(slash);   
            if (methodName.length() > 0) {   
              try {   
                method = bean.getClass().getMethod(methodName, null);   
                synchronized (bean) {   
                  forward = bean.getInterceptor().intercept(new ActionInvoker(bean, method));   
                }   
              } catch (Exception e) {   
                throw new BeanActionException("Error dispatching bean action via URL pattern ('" + methodName + "'). Cause: " + e, e);   
              }   
            }   
          }   
        }   
      }   
    } catch (Exception e) {   
      forward = "error";   
      request.setAttribute("BeanActionException", e);   
    }   
    return mapping.findForward(forward);   
} 


也就是说,在这个类里,程序会取配置文件里的 parameter 属性是否定义,如果定义了,则就用反射调用com.ibatis.jpetstore.presentation.AccountBean里的相应方法;如果没有定义,则就会去配置文件里的path="/shop/editAccount" 属性,取最后一个斜杠后的单词,再用反射调用相应方法;如果parameter 定义了且是parameter="*"则不调用任何一个方法,直接返回,配置的返回页面。
分享到:
评论

相关推荐

    struts2绕过waf读写文件及另类方式执行命令1

    首先,我们注意到标题提到的"struts2绕过waf读写文件及另类方式执行命令1",这表明我们将讨论Struts2框架中的一种或多种漏洞,这些漏洞可能导致攻击者能够绕过WAF的保护措施,执行命令或进行文件操作。 在描述中,...

    struts2绕过waf读写文件及另类方式执行命令.doc

    对于网站所有者来说,重要的是要保持Struts2框架及其依赖库的最新状态,并配置有效的WAF规则,以防止这类攻击。同时,对输入数据进行严格的验证和过滤也是预防此类攻击的关键措施。 总之,这篇文章揭示了Struts2...

    Struts+Hibernate实现MVC

    1. `struts-config.xml`:这是Struts的配置文件,定义了Action和ActionMapping,以及ActionForm和视图的映射。 2. `hibernate.cfg.xml`:这是Hibernate的配置文件,包含了数据库连接信息以及实体类和数据库表的映射...

    j2ee翻页自定义标签+sturts

    在“strpageEmp”这个文件中,可能包含了Struts的配置文件(struts.xml)、Action类、JSP页面以及相关的Java源码。通过配置Action,开发者可以指定处理分页请求的方法;在JSP页面中,使用Struts提供的标签来显示数据...

    tapestry实例(betterstore)

    标签中的“另类其它”可能意味着Tapestry在Web开发领域相对于更常见的框架(如Spring MVC、Struts等)而言,是一种不太常见的选择,但它提供了独特的解决方案。“控件”指的是Tapestry的组件系统,这些组件可以是...

    J2EE开发架构小结.doc

    相比之下,重量级J2EE实现充分利用了EJB容器的能力,能够自动或通过配置实现事务控制、远程访问、线程安全、资源管理和安全性等功能,支持分布式应用。实体Bean、会话Bean等组件的引入,使得业务逻辑和服务接口的...

    《Java Web应用开发技术实用教程》-王红-电子教案

    "另类其它"标签可能意味着教材中可能包含了一些独特的视角或实践方法,使得学习体验更为丰富多元。 在压缩包内,"《Java Web应用开发技术实用教程》-王红-电子教案-5124"很可能是主文件名,其中"5124"可能是一个...

Global site tag (gtag.js) - Google Analytics