Struts旅程(五)struts控制器DispatchAction(一)

2014-11-24 02:50:13 · 作者: · 浏览: 0

上篇演示了struts框架的由来,从而体现struts框架优点。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必须是在 中定义过的。

(4) scope属性:指定ActionForm的使用范围,缺省值为session范围。

(5) input属性:指定表单验证出错的时候转向页面。

(6) validate属性:指明是否自动调用ActionForm中的validate方法对表单进行验证。

配置示例如下代码。

  
     
    
     
   
    
     
    
     
      
      
     
   
    

  


问题

当我们完成用户增删改查操作时采用struts框架,我们需要为增删改查建立四个不同的Action,如果有更多的增删改查操作,比如对物料增删改查也需要建立四个Action,这样造成了大量的Action。

问题的解决

在struts中的Action类中,只提供了一个execute()方法,一个用户请求URL只能对应一个servlet,在struts中提供了另一个控制器类org.apache.struts.actions.DispatchAction,这个类可以经完成相关业务逻辑所需方法几种在一个DispatchAction类中,我们继承DispatchAction类后不重写execute()方法,而是编写自己的方法,在不同的方法中处理不同的动作。删除用户增删改查对应的Action,建立UserAction(如图5.1)。

\

图5.1

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

用户管理系统


其中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();
            Be