当前位置: 移动技术网 > IT编程>开发语言>Java > 深入解析Java的Struts框架中的控制器DispatchAction

深入解析Java的Struts框架中的控制器DispatchAction

2019年07月22日  | 移动技术网IT编程  | 我要评论

struts中的表单处理器为actionform,而struts中的控制器主要是action,以及dispatchaction控制器等。
action
在struts中,所有的用户都会经过actionservlet的处理,而实际的工作是交给action对象来处理的,actionservlet可以从配置文件中创建actionmapping对象,从actionmapping对象中找到对应使用的action,然后将用户请求转交给action。
对struts一个actionmapping只能生成一个action对象,当用户发起请求的时候会检查所需要的action对象是否存在,如果不存在就会生成一个action对象,在以后的处理过程中使用这个对象。
当我们使用action的时候需要继承arg.apache.struts.action.action这个类,在子类中加入所需要的业务逻辑处理,这些子类会返回actionforward对象,actionservlet接受这个对象,把页面转发到指定页面,从而把用户请求的结果发送到对应的页面。我们在struts-config.xml中进行配置。配置的主要属性如下:
(1)  path属性:访问action的url地址,当用户请求路径和url匹配时,actionservlet会把这个用户请求发送给action处理。
(2)  type属性:指定处理请求的action对应的类,需要写类文件的包路径。
(3)  name属性:指定我们的action用到的actionform名字,这个actionform必须是在<form-beans>中定义过的。
(4)  scope属性:指定actionform的使用范围,缺省值为session范围。
(5)  input属性:指定表单验证出错的时候转向页面。
(6)  validate属性:指明是否自动调用actionform中的validate方法对表单进行验证。
配置示例如下代码。

<struts-config> 
   <form-beans> 
      <form-bean name="loginform" type="com.bjpowernode.struts.loginactionform" /> 
   </form-beans> 
   
   <action-mappings> 
      <action path="/login" 
             type="com.bjpowernode.struts.loginaction" 
             name="loginform" 
             scope="request" 
             > 
             <forward name="success" path="/login_success.jsp"/> 
             <forward name="error" path="/login_error.jsp"/> 
      </action> 
   </action-mappings> 
   
</struts-config> 


问题
当我们完成用户增删改查操作时采用struts框架,我们需要为增删改查建立四个不同的action,如果有更多的增删改查操作,比如对物料增删改查也需要建立四个action,这样造成了大量的action。
问题的解决
在struts中的action类中,只提供了一个execute()方法,一个用户请求url只能对应一个servlet,在struts中提供了另一个控制器类org.apache.struts.actions.dispatchaction,这个类可以经完成相关业务逻辑所需方法几种在一个dispatchaction类中,我们继承dispatchaction类后不重写execute()方法,而是编写自己的方法,在不同的方法中处理不同的动作。删除用户增删改查对应的action,建立useraction。

20151211175605933.jpg (244×123)

界面中调用代码如下所示。

<body> 
<a href="user/user_maint.do?command=list"title="请点击访问用户管理系统">用户管理系统</a> 
</body> 


其中list对应着useraction中的list方法,传递的字符串与useraction中的方法名相同。
useraction中的代码如下所示:

packagecom.bjpowernode.drp.web.actions; 
  
importjava.util.date; 
importjava.util.list; 
  
importjavax.servlet.http.httpservletrequest; 
importjavax.servlet.http.httpservletresponse; 
  
importorg.apache.commons.beanutils.beanutils; 
importorg.apache.struts.action.actionform; 
importorg.apache.struts.action.actionforward; 
importorg.apache.struts.action.actionmapping; 
importorg.apache.struts.actions.dispatchaction; 
  
importcom.bjpowernode.drp.manager.usermanager; 
importcom.bjpowernode.drp.model.user; 
importcom.bjpowernode.drp.web.forms.useractionform; 
  
public classuseraction extends dispatchaction { 
  
   
  
  
   protected actionforward list(actionmapping mapping, actionform form, 
          httpservletrequestrequest, httpservletresponse response) 
          throwsexception { 
      //调用业务逻辑操作 
      list userlist = usermanager.getinstance().findalluserlist(); 
      request.setattribute("userlist",userlist); 
       
      returnmapping.findforward("list_success"); 
   } 
  
   
   /** 
   * 用户删除 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws exception 
   */ 
   public actionforward del(actionmapping mapping, actionform form, 
          httpservletrequestrequest, httpservletresponse response) 
          throws exception { 
      //获取从页面表单中提交过来的值 
      useractionform uaf = (useractionform)form; 
       
      //取得需要删除的userid的集合 
      string[] useridlist = uaf.getselectflag(); 
  
      //调用业务逻辑操作 
      usermanager.getinstance().deleteusers(useridlist); 
      return mapping.findforward("del_success"); 
   } 
   
   /** 
   * 用户添加 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws exception 
   */ 
   public actionforward add(actionmapping mapping, actionform form, 
          httpservletrequest request, httpservletresponse response) 
          throwsexception { 
       
      //获取从页面表单中提交过来的值 
      useractionform uaf = (useractionform)form; 
      useruser = new user(); 
      beanutils.copyproperties(user,uaf); 
      user.setcreatedate(newdate()); 
       
      //调用业务逻辑操作 
      usermanager.getinstance().adduser(user); 
      returnmapping.findforward("add_success");  } 
  
   /** 
   * 修改用户 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws exception 
   */ 
   public actionforward modify(actionmapping mapping, actionform form, 
          httpservletrequestrequest, httpservletresponse response) 
          throwsexception { 
      //获取从页面表单中提交过来的值 
      useractionform uaf = (useractionform)form; 
      user user = new user(); 
      beanutils.copyproperties(user,uaf); 
       
      //调用业务逻辑操作 
      usermanager.getinstance().modifyuser(user); 
      returnmapping.findforward("modify_success"); 
   } 
   
   /** 
   * 根据id查询用户 
   * 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws exception 
   */ 
   public actionforward find(actionmapping mapping, actionform form, 
          httpservletrequestrequest, httpservletresponse response) 
          throwsexception { 
      //获取从页面表单中提交过来的值 
      useractionform uaf = (useractionform)form; 
       
      string userid = uaf.getuserid(); 
       
      //调用业务逻辑操作 
      user user = usermanager.getinstance().finduserbyid(userid); 
       
      //将user对象从action传递到jsp页面 
      request.setattribute("user",user); 
       
      returnmapping.findforward("find_success"); 
   } 
   
} 

  


struts-config.xml配置文件代码如下所示。

<struts-config> 
   
  <form-beans> 
      <form-bean name="userform"type="com.bjpowernode.drp.web.forms.useractionform"/> 
  </form-beans> 
   
  <action-mappings> 
    <action path="/user/user_maint" 
           type="com.bjpowernode.drp.web.actions.useraction" 
           name="userform" 
           scope="request" 
           parameter="command" 
    > 
        
        <forward name="list_success" path="/user/user_list.jsp"/> 
        <forward name="del_success" path="/user/user_maint.do?command=list"redirect="true"/> 
        <forward name="add_success" path="/user/user_maint.do?command=list"redirect="true"/> 
        <forward name="modify_success" path="/user/user_maint.do?command=list"redirect="true"/> 
        <forward name="find_success" path="/user/user_modify.jsp"/> 
 </action-mappings>  
</struts-config> 


其中配置action的时候,配置了parameter属性,并且指定了parameter属性值为command,当用户单击添加或删除用户操作时,会以http://localhost:8080/struts_dispatchaction_usermgr/user/user_maint.do?command=list,这个请求会被映射到useraction控制器中,struts根据method参数的值把这个请求发送到控制器useraction的list方法。这样取得参数完成页面的调用。
从上述可以看出,dispatchaction可以通过command这个参数的值来决定调用dispatchaction的哪个方法,dispatchaction是从用户请求的url中提取parameter定义参数的值,从而决定调用哪个方法处理用户请求。所以dispatchaction不能通过actionform向服务器提交请求,因为提交表单的时候不能向服务器传递参数。
根据上述示例我们可以总结出dispatchaction与action区别:action是从表单中取得数据,并且自动转换为对应的类型。而dispatchaction取得配置文件中parameter,截取parameter定义的参数值。但是dispatchaction可以处理多个动作而不需要建立多个action。
dispatchaction可以在同一个控制器中处理多个动作,但只能通过url来调用控制器,根据用户提交的参数来决定调用哪个方法来处理用户请求。不能通过表单提交用户请求信息,在struts中如果要在同一个表单中处理不同的动作,可以使用lookupdispatchaction。在这里就不详细讲述了,有兴许的童鞋可以查找些资料来实现。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网