`
sbpya
  • 浏览: 616898 次
  • 性别: Icon_minigender_1
  • 来自: 杭州,长沙
社区版块
存档分类
最新评论

struts2的action之间的参数传递和结果类型

阅读更多

action的默认结果类型是dispatcher,而action之间发送请求是不能直接用该结果类型的。一般来说,可选的结果有redirect、redirect-action、chain。前两种都是属于页面跳转,也就是说,发送请求以后,地址栏的地址会刷新为被请求的action的地址,而chain则不会更新地址。

redirect-action:“这个Result使用ActionMapperFactory提供的ActionMapper来重定位浏览器的URL来调用指定的action和(可选的)namespace. 这个Result比ServletRedirectResult要好.因为你不需要把URL编码成xwork.xml中配置的ActionMapper提供的模式. 这就是说你可以在任意点上改变URL模式而不会影响你的应用程序. 因此强烈推荐使用这个Result而不是标准的redirect result来解决重定位到某个action的情况.”---webwork2的说法。

redirect:“调用{@link HttpServletResponse#sendRedirect(String) sendRedirect}方法来转到指定的位置。HTTP响应被告知使浏览器直接跳转到指定的位置(产生客户端的一个新请求). 这样做的结果会使刚刚执行的action(包括action实例,action中的错误消息等)丢失, 不再可用。”

简单说,两者的共同点是,地址栏会变化,所有前一个action的请求参数都会丢失,当然也包括action的属性值也会丢失。路径写法稍有不同,redirect-action请求下一个action时,不带后缀.action,而redirect和普通URL写法一致。redirect-action支持param来附加请求参数,但是这往往会导致ServletActionRedirectResult报找不到xxx属性的警告,这大概是由于无法识别是IOC注入,还是参数附加URL导致的,虽然是WARN级别,不过宁可写成xxx?a=x&b=y的形式,而&还需要写作&的格式,否则会报xml格式错误。(另外,这种url形式,作为param的actionName的值也是可以正常使用的)

chain:相当于是forward,首先表现为地址栏不会改变,类似dispatcher,同时,它的特点是能够在多个action中共享表单传递过来的数据,同时,按照action链的顺序,相关action的属性值也会传递下去,这表示在最后的视图页,你可以得到前面所有action的属性值(如果有get方法的话)。对于多个action具有相同属性值的话,后续action会先使用前面的action的数据来进行赋值,然后再进行逻辑处理并传递下去。

看起来是很完美,可是却有很大的问题。如果后面的action需要调用前面action的属性值,他得保证具有同样的属性值,否则你无法接收到前面action的值。他无法像redirect-action一样通过附加参数获取,他不支持xxx?a=x&b=y的形式。这将导致很大的耦合性和无效参数的泛滥,无法通过配置文件传递参数也很麻烦。

另外,很困扰的一点就是,如果在action链靠前的action方法内出现错误(如action的hasError方法返回true)或者发生异常,他就会强迫你定义input结果,包括后面的action也要定义,否则就会报错。而实际上,即使符合了以上条件,他仍不会执行后面的action,而是直接跳到后面的action的input视图。除非发生错误的action返回input,并且type为“chain”,并且后一个action的方法必须为input,否则后续方法不会执行,而直接定位到了最后的物理视图。

这让我觉得chain的适用范围变的十分窄,据说webwork2已经不提倡使用chain,这个没考证过。

分享到:
评论

相关推荐

    struts2 action跳转action传参数

    通过以上两种方式,我们可以在Struts2框架中轻松地实现Action之间的跳转以及参数传递。使用`chain`类型的结果不仅能够实现跳转,还能够在不使用额外的HTTP请求的情况下传递参数,而使用`redirectAction`类型的结果...

    struts2 向结果传参数

    Struts2支持多种内置结果类型,如`dispatcher`(默认的,用于转发到JSP)、`stream`(用于处理文件下载)和`redirectAction`(用于重定向到另一个Action)。每个结果类型都有其特定的配置方式来传递参数。 1. **在...

    Struts2中Action接收参数的方法

    2. 在 JSP 页面中,使用表单或其他方式将参数传递给 Action。 3. 在 Action 中,使用设定的属性接收参数,例如 `userName`。 例如,在 Action 中定义了 `userName` 属性,可以在 JSP 页面中使用 `user1!add?...

    Struts2中的参数传递

    Struts2的核心之一就是它对于参数传递的支持能力,这一点主要依赖于OGNL(Object-Graph Navigation Language)和ValueStack。通过这两个组件,Struts2实现了动态的数据绑定和灵活的类型转换功能。 #### 二、OGNL与...

    struts2 使用action属性接收中文参数(post提交)

    在处理用户请求时,Struts2允许开发者通过Action类来接收和处理参数,包括中文参数。当我们需要通过POST方法提交包含中文字符的数据时,可能会遇到编码问题,因为HTTP请求默认使用的是ASCII编码,而中文字符需要UTF-...

    struts2自定义结果类型demo

    这个"struts2自定义结果类型demo"可能包含了上述所有步骤的代码示例,包括配置文件、自定义结果类型类以及相关的Action配置。对于初学者,这是一个很好的实践案例,可以帮助理解Struts2的扩展机制和控制流程。通过...

    struts2中action接收参数的方式

    总的来说,Struts2提供了一套灵活的参数接收机制,包括但不限于直接通过setter方法、使用注解和处理复杂类型。这种设计使得开发者可以根据实际需求自由选择最合适的参数处理方式,提高了代码的可读性和可维护性。在...

    AJAX和struts2传递JSON数组

    在本场景中,我们将探讨如何使用AJAX来传递JSON数组,并在Struts2的Action中接收和处理这些数据。 首先,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,同时也易于机器解析...

    struts2支持方法上传递参数

    总结来说,Struts2通过方法上传递参数是其强大的特性之一,它简化了Action类的编写,提高了代码的可读性和可维护性。开发者可以通过直接在方法签名中定义参数来处理用户请求,而无需额外的注解或配置。结合OGNL和...

    struts1.x 和 struts2.x向Action里填充jsp参数原理

    本篇文章将深入探讨Struts1.x和Struts2.x在向Action中填充JSP参数的原理。 Struts1.x的工作原理: Struts1的核心是ActionServlet,它是一个实现了Servlet接口的控制器。当用户发起HTTP请求时,请求会被Dispatcher...

    struts2 接收参数

    这篇博客文章可能深入探讨了Struts2如何在Action类中获取和管理这些参数。 首先,Struts2的核心是DispatcherServlet,它负责拦截所有的HTTP请求,并根据配置的拦截器栈来处理请求。在Struts2中,Action类是业务逻辑...

    Struts2 in action中文版

    8.1.1 页面上:如何使用自定义结果组件构建Struts 2 Ajax应用程序 171 8.1.2 实现JSON结果类型 173 8.2 常用的结果类型 180 8.2.1 RequestDispatcher,也叫做dispatcher 180 8.2.2 ServletRedirectResult,也叫做...

    struts2中Action获取参数的3种方式代码

    在Struts2中,Action类是处理用户请求的核心组件,它负责接收前端传递的参数并进行业务逻辑处理。本文将详细介绍Struts2中Action获取参数的三种主要方式,并通过实际代码示例来阐述每种方法的使用。 1. **通过...

    留言板留言板struts2留言板struts2

    5. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,用于在Action和视图之间传递数据。通过OGNL,可以在JSP页面中直接访问Action中的属性,或者在Action中动态设置模型数据。 6. ...

    使用struts2 和ajax进行传递json数据

    使用`@Result`注解或struts.xml配置文件,可以指定一个结果类型为`json`,这样Struts2会将Action的返回对象转换成JSON格式并返回给前端。 **Ajax请求与JSON数据** 前端JavaScript代码使用XMLHttpRequest对象或现代...

    Struts2接口文档

    此外,Struts2还支持OGNL(Object-Graph Navigation Language)表达式语言,用于在Action与视图之间传递数据。开发者可以通过OGNL在JSP页面上动态访问Action中的属性,或者在Action中设置模型数据。 “Struts2.3.1.2_...

    struts2传递参数及ModelDriven的使用示例

    11. **struts.xml**:这是Struts2的核心配置文件,定义了Action的映射、结果类型、拦截器栈等。在这里,你可以看到`DoAction`是如何与URL路径关联的,以及ModelDriven模式的配置。 综上所述,这个示例项目展示了...

    struts2 类型转换器

    标题中的“Struts2 类型转换器”主要指的是Struts2框架中处理请求参数到Action类属性绑定过程中的类型转换机制。在HTTP请求中,表单数据通常以字符串形式传递,而Action类的属性可能是各种类型,如整型、浮点型、...

    struts2核心文件

    6. **OGNL(Object-Graph Navigation Language)**: OGNL是Struts2的默认表达式语言,用于在Action和视图之间传递数据。例如,Action中的属性可以直接在JSP中通过OGNL表达式访问。 7. **FilterDispatcher(或...

    Struts2 的接受参数的几种方式

    例如,如果前端传递了 `name` 和 `age` 这两个参数,那么在 Action 类中就需要声明如下的变量: ```java private String name; private int age; ``` 并且必须提供相应的 getter 和 setter 方法。这是因为 Struts2...

Global site tag (gtag.js) - Google Analytics