Struts1.3——DispatchAction、DynamicForm和全局跳转

1.DispatchAction-分派Action

1.1 为什么需要DispatchAction

如果每个请求都对应一个Action,就会造成action过多,程序显得比较臃肿,所以可以把一类请求写到一个action中处理,即DispatchAction

在没有使用框架之前,当我们通过一个控制器处理多个请求的时候,我们是通过在URL后面跟上参数来区别不同的操作,比如,下述链接:

http://localhost:8080/UserManager/main?operateId=add&uid=123 
http://localhost:8080/UserManager/main?operateId=delete&uid=123

在这里,main是我们的一个控制器,后面我们通过传递operateId参数来让控制器区别不同的操作,那么,在main控制器中,我们可以得到operateId,再根据其不同使用if...else...语句来分别处理即可。

String operateId = request.getParameter("operateId");
if(operateId.equals("add")){
    ...
}else if(operateId.equals("delete")){
    ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

同样的,如果我们使用了Struts框架,我们也可以在调用一个Action的时候给它传递参数:(这里假设Action为ManageAction,它的访问路径为/manage

http://localhost:8080/UserManager/manage.do?operateId=add&uid=123

然后在这个ManageAction中,也根据operateId的不同来做不同的处理。

1.2 开发和配置DispatchAction

Struts框架为了我们处理这种情况,专门提供了DispatchAction,即分派Action。

开发DispatchAction需要继承DispatchAction类,而不是之前的Action类了。

特别要注意的是,这里一定要配置parameter参数,这个参数也就是我们用来区分不同操作的标志,和1.1中所介绍的一样。那么,这里我仍然使用operateId这个字段。

其实,它和我们之前使用的Action没有太多区别,就是在配置struts-config.xml文件的时候多了一个parameter参数:

<action
      parameter="operateId"
      path="/manage"
      type="com.gavin.struts.action.ManageAction"
      validate="false"
      cancellable="true" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

不同的地方在于:在ManageAction类中,我们不需要只在一个方法中根据operateId来区分不同的操作了,也就是说,我们不需要写哪些繁琐的if...else...语句了。我们要做的是针对每一个不同的operateId直接写一个方法,方法的名称就是你的URL链接中指定的operateId名称,这个方法就是将之前的execute方法改名字即可,参数以及返回值都保持一致。

比如,我们在程序中需要这两种链接:

http://localhost:8080/UserManager/manage.do?operateId=add&uid=123 
http://localhost:8080/UserManager/manage.do?operateId=delete&uid=123

那么我们的ManageAction中,就要有add和delete两个方法:

public class ManageAction extends DispatchAction {

    public ActionForward add(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        // your code
        return null;
    }

    public ActionForward delete(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
            // your code
        return null;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

很显然,使用DispatchAction可以使程序条理更加清晰,容易扩展。

【但要注意的是,如果使用DispatchAction,一定要去掉原来的execute方法】


2.DynamicForm-动态表单

使用动态表单可以更加灵活地使用表单。在某些不能确定表单属性个数和类型的情况下,可以使用动态表单(DynamicForm)来解决问题。

所谓动态表单,其实就是不需要单独写成Java类的表单,使用它只需要在struts-config.xml文件中配置即可。

<form-bean name="userForm" type="org.apache.struts.action.DynaActionForm">
    <!-- 该表单的属性是配置出来的 -->
    <form-property name="name" type="java.lang.String"/>
    <form-property name="password" type="java.lang.String"/>
    <form-property name="email" type="java.lang.String"/>
</form-bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

动态表单的type属性,要写为org.apache.struts.action.DynaActionForm,同时,它比普通表单多了form-property配置,该配置就是配置表单的属性,由于我们可以在这里动态增减form-property属性的配置,所以称之为动态表单。

另外,它与普通表单获取数据的方式也略有不同:

DynaActionForm userForm = (DynaActionForm) form;
// 从动态表单中取出数据
String name = userForm.getString("name");
String password = userForm.getString("password");
String email = userForm.getString("email");
  • 1
  • 2
  • 3
  • 4
  • 5

除此之外,都是相同的。也可以看到,动态表单在使用上更为方便。

我们可以通过MyEclipse工具,自动生成DynamicForm:

3.全局跳转

全局跳转区别于局部跳转,之前我们在Action中配置的forward字段,都是针对当前Action的跳转,称之为局部跳转:

<action-mappings >
    <action
      attribute="userForm"
      input="/WEB-INF/register.jsp"
      name="userForm"
      parameter="type"
      path="/register"
      scope="request"
      type="com.gavin.struts.action.RegisterAction" >
      <!--局部跳转-->
      <forward name="ok" path="/WEB-INF/ok.jsp" />
    </action>
  </action-mappings>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

也就是说,只有对于当前的Action,我们才能够通过”ok”跳转到ok.jsp.

那么,如果我们有一个公共的错误页面error.jsp,所有的Action都可以跳转到该Action,如果一个个地都配置,岂不是很麻烦,所以Struts框架也提供了全局跳转。

使用全局跳转,只需要在struts-config.xml中配置global-forwards即可:

<global-forwards >
    <forward name="error" path="/WEB-INF/error.jsp" />
</global-forwards>
  • 1
  • 2
  • 3

所有的Action如果想要跳转到这个错误页面,直接在Action的代码中跳转即可,无需再作其他配置。

使用MyEclipse的工具开发global-forward也很简单:

时间: 2024-08-01 20:26:37

Struts1.3——DispatchAction、DynamicForm和全局跳转的相关文章

struts1.3中使用DispatchAction的一个问题

最近做项目发现我们公司的项目是用struts1写的,在多方百度下,总有理解了struts1.3的DispatchAction的用法 一:struts.xml文件的配置 <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN&q

struts1.x入门

一 .第一个应用实例 1.简要介绍 Struts最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServer Pages .Servlet.标签库以及面向对象的技术水准.Structs 框架的核心是一个弹性的控制层, Struts的目的是为了减少在运用MVC设计模型来开发Web应用的时间.MVC:它除了能在C层发挥巨大的作用外,在其它层也提供了相应的支持. 2.实例 说明:在此不会对实例作任何解释,只是一步一步写出它的最终运行效果:当我

Struts 转发与跳转配置

配置自动跳转action <action name="addUI"> <result>/WEB-INF/addUI.jsp</result> </action> 当用户访问这个action的时候可以自动跳转到addUI.jsp页面. Struts1中的转发配置 <action path=”/control/addUI” forward=”WEB-INF/addUI.jsp” /> 转发类型控制 Struts1的转发: <

Struts1之logic标签

logic是Struts1中的逻辑标签 <%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic" %> logic:forward 请求跳转 Struts中的配置 <struts-config> <!-- 全局跳转 --> <global-forwards> <!--输入项目名后直接通过index.jsp中的logic:forward跳

Struts1 学习

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/8/8-146.html 1. Struts工作流程主要对象:Action.ActionForm.ActionServlet.ActionForward.ActionMapping 2. 工作流程:Register.do发送请求,找到web.xml从而找到ActionServlet,ActionServlet收到请求之后,进行请求的预处理,Locale,http请求头解析和基本响应头的封装等等,

struts1.3中&lt;struts-config&gt;报错

一个项目中struts-config.xml文件老是报错 在<struts-config>的标签中报错: The content of element type "struts-config" must match "(display-name?,description?,form-beans?,global-exceptions?,global-forwards?,action- mappings?,controller?,message-resources*,

struts2 的跳转方式

在struts2中有4中跳转方式 1. dispatcher        请求转发(默认),只跳到jsp页面 2. redirect         重定向到jsp 3. redirectAction        重定向到action 4. chain           转发到action 在说这之前,让我们说下请求转发和重定向的概念,如果你已经了解转发和重定向,可以跳过,直接看下面. 转发和重定向 1. 转发是服务器内部之间进行的 重定向是用户重新向服务器发送新的请求 2. 转发地址栏不

Struts2 笔记(2) --Struts传值/跳转/拦截器/注解等

1.action中如何接受页面传过来的参数 第一种情况:(同名参数) 例如: 通过页面要把id=1 name=tom age=20这三个参数传给action 1.action里面定义三个成员变量id name age,这个三个变量的名字一定要和所传变量的名字一致. 2.提供get/set方法 3.将来页面把这三个参数传过来的时候,struts2框架会自动的帮我们把这个三个参数值放action中的三个属性里面.(同时还做了类型的转换) 注意:这个工作其实是由defaultStack这个拦截器栈里面

传智博客(JavaWeb方面的所有知识)听课记录(经典)

一.       JavaWeb基础 第一天: 1.Eclipse详解: (1).Bad versionnumber in .class file:编译器版本和运行(JRE)版本不符合.高的JRE版本兼容低版本的编译器版本. (2).当程序有错误的时候,使用Debug as 运行程序.双击语句设置断点.程序运行到此处停止.点击跳入方法的内部代码.点击跳过,执行下一条代码,点击跳出,跳出方法.观察变量的值,选中变量右击 选择watch. 跳入下一个断点.查看断点,调试完后一定要清除断点.结束运行断