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

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。

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

<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。在这里就不详细讲述了,有兴许的童鞋可以查找些资料来实现。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
struts
struts2控制器、struts2的控制器组件、struts2控制器组件、struts2前端控制器、struts控制器,以便于您获取更多的相关知识。

时间: 2024-07-29 02:30:02

深入解析Java的Struts框架中的控制器DispatchAction_java的相关文章

Java的Struts框架中配置国际化的资源存储的要点解析_java

1.资源文件命名 国际化资源文件命名格式如下: basename_language_country.properties basename_language.properties basename.properties 其中basename为资源文件的基本名称,language和country必须是java支持的语言和国家.获取java支持的语言和国家代码如下: Locale[] locales = Locale.getAvailableLocales(); for(Locale locale:

Java的Struts框架中&amp;lt;results&amp;gt;标签的使用方法_java

<results>标签在Struts2的MVC框架的视图中所扮演的角色.动作是负责执行业务逻辑.执行业务逻辑后,接下来的步骤是使用<results>标签显示的视图. 经常有一些附带导航规则的结果.例如,如果在操作方法是对用户进行验证,有三种可能的结果. (一)成功登录:(二)不成功的登录,用户名或密码错误:(三)帐户锁定. 在这种情况下的动作方法将被配置呈现的结果有三种可能的结果字符串和三个不同的看法.我们已经看到在前面的例子. 但是,Struts2 不配合使用JSP作为视图技术.

Java的Struts框架中的if/else标签使用详解_java

这些标签执行可在每一种语言找到的一种基本条件流程. 'If'标签可用于本身或与"Else If''标签和/或单/多'Else'标签,如下图所示: <s:if test="%{false}"> <div>Will Not Be Executed</div> </s:if> <s:elseif test="%{true}"> <div>Will Be Executed</div>

详解Java的Struts框架中栈值和OGNL的使用_java

值栈:值栈是一个集合中的几个对象保持下列对象提供的顺序: 值栈可以通过JSP,Velocity或者Freemarker的标签.有各种不同的标签在单独的章节中,我们将学习,用于获取和设置Struts 2.0 的值栈. ValueStack的对象里面可以得到动作如下: ActionContext.getContext().getValueStack() 一旦拥有了值对象,就可以用下面的方法来操纵该对象: OGNL:对象图形导航语言(OGNL)是一个功能强大的表达式语言是用来参考值栈上的数据和操纵.

Java的Struts框架中的主题模板和国际化设置_Mysql

主题模板 如果不指定一个主题,然后Struts2中会使用默认的XHTML主题.例如Struts 2中选择标签: <s:textfield name="name" label="Name" /> 生成HTML标记: <tr> <td class="tdLabel"> <label for="empinfo_name" class="label">Name:<

在Java的Struts框架中ONGL表达式的基础使用入门_java

首先了解下OGNL的概念:OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能. 此外,还得先需弄懂OGNL的一些知识: 1.OGNL表达式的计算是围绕OGNL上下文进行的. OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示.它里面可以存放很多个JavaBean对象.它

Java的Struts框架中Action的编写与拦截器的使用方法_java

Struts2 Action/动作动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架.每个URL将被映射到一个特定的动作,它提供了来自用户的请求提供服务所需的处理逻辑. 但动作也提供其他两个重要的能力.首先,操作从请求数据的传输中起着重要的作用,通过向视图,无论是一个JSP或其它类型的结果.二,动作必须协助的框架,在确定结果应该渲染视图,在响应该请求将被退回. 创建动作:在Struts2的动作,唯一的要求是必须有一个无参数的方法返回String或结果的对象,必

简单说明Java的Struts框架中merge标签的使用方法_java

merge标签合并标记需要两个或两个以上的列表作为参数,并把它们合并在一起,如下所示: <s:merge var="myMergedIterator"> <s:param value="%{myList1}" /> <s:param value="%{myList2}" /> <s:param value="%{myList3}" /> </s:merge> <

解析Java的Hibernate框架中的持久化类和映射文件_java

持久化类Hibernate的整个概念是采取从Java类属性的值,并将持久到数据库表.一个映射文件Hibernate的帮助确定如何从拉动类的值,并将它们映射与表和相关的域. 其对象或实例将存储在数据库表中的Java类在Hibernate中称为持久化类. Hibernate的效果最好,如果这些类遵循一些简单的规则,也称为普通Java对象(POJO)编程模型.有下列持久化类的主要规则,但是,这些规则并不是必需的. 将所有的持久化Java类需要一个默认的构造函数. 所有类应该包含为了让容易识别对象内Hi