另类的Struts配置

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="*"则不调用任何一个方法,直接返回,配置的返回页面。

你可能感兴趣的:(jsp,bean,xml,struts,ibatis)