Struct控制器DispatchAction

Struct控制器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

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

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


其中list对应着UserAction中的list方法,传递的字符串与UserAction中的方法名相同

UserAction中的代码如下所示:

public class UserAction extends DispatchAction{<span style="font-family: Arial, Helvetica, sans-serif;">     protected ActionForward list(ActionMapping mapping, ActionForm form,</span><span style="font-family: Arial, Helvetica, sans-serif;">                 </span>
<span style="font-family: Arial, Helvetica, sans-serif;">  HttpServletRequestrequest, HttpServletResponse response)</span><span style="font-family: Arial, Helvetica, sans-serif;">                   throwsException {</span>
            //调用业务逻辑操作
            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");
     }
    
}</span>
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。


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值