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,这个没考证过。

 

 

时间: 2024-11-03 01:24:03

struts2的action之间的参数传递和结果类型的相关文章

后台-Struts1 action跳转参数传递

问题描述 Struts1 action跳转参数传递 struts1框架 实现页面之间的跳转 从一个action 调到另一个action 实现参数传递, 不使用js,不能在页面传参,只能从后台Java传参,应该怎么传? 解决方案 放到request域中 解决方案二: 可以在配置的Action路径后面跟?形式的参数 解决方案三: 你的意思是说用超链接直接带参数过去吧,可是不允许这样传参,不可以用超链接,不可用js,单纯的通过后台传参..

QTP多个Action之间传递参数的方法详解

 点击打开链接 脚本的朋友们都会碰到多个Action之间传递参数的问题,想当年我也是研究了好久才成功的,网上虽然有很多文章都在讲这个问题,但是大多都是雷同的抄来抄去不能解决实际问题,也有可能是我太笨了吧.下面我们来详细讲一下QTP多个Action之间传递参数的方法. 一.假设Action1调用Action2并且Action1传递参数给Action2 1.Action1的代码及设置 '定义两个变量 Dim strMessA:strMessA = "我是" Dim strMessB:str

struts2中action和field级别错误处理

在struts2中,一般的action都继承ActionSupport这个类,可以重写public void validate()来进行数据校验,对应提示信息来说一般有两个比较常用的方法就是this.addFieldError("field name","error message"); 和 this.addActionError("error message");两个方法. 由于在ActionSupport这个类实现了ValidationAwa

Struts2中Action接收参数的方法

Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数:     a.定义:在Action类中定义属性,创建get和set方法:     b.接收:通过属性接收参数,如:userName:     c.发送:使用属性名传递参数,如:user1!add?userName=Magci: 2.使用DomainModel接收参数:     a.定义:定义Model类,在Action中定义Model类的对象(不需要new),创建该对象的get和set方法:    

struts2.0-spring会自动代理Struts2的action

问题描述 spring会自动代理Struts2的action 我的struts的action全部被spring配置成了aop,我的action出现的全部是代理对象. 导致我的action不能调用自己定义的方法.为什么我没有配置struts的action为aop, 但是spring全部自动配置成了aop?这spring的配置文件 <?xml version="1.0" encoding="utf-8"?> <beans xmlns="htt

javaweb-关于struts2中action层的问题

问题描述 关于struts2中action层的问题 今天公司要我把实体entity复制一份,写在一个类中,查出来的数据通过BeanUtils.copyProperties放在复制的那个类中,action不实现modelDriven,而是get/set复制的这个类.前面这些只是今天遇到的,大概说一下. 主要想问的是,公司那边不让写这一句: 那我查到的东西,怎么在jsp页面写呢?我唯一能想到的是在action中写一个List属性,get/set.不过我觉得这样好麻烦,他为什么不让使用这一句呢?我搞不

struts2中action中的方法无故被提交两次

问题描述 struts2中action中的方法无故被提交两次 import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.hsp.book.domain.Book;import com.hsp.book.service.BookService;import c

struts2中Action到底是什么,怎么理解

问题描述 struts2中Action到底是什么,怎么理解 1.配置完web.xml 2.创建视图页面login.jsp 3.创建业务控制器LoginAction类 (解释说:创建业务控制器LoginAction类,该类为程序的Action类) 4.配置LoginAction类 (解释说:当Action处理完客户端请求后返回一个字符串,没个字符串对应一个视图) 那么这个Action到底是什么,是一个类吗?怎么理解它,它和用于标签的有什么区别. 解决方案 首先,你了解Servlet么?Servle

struts action跳转-不同namespace下的action之间如何跳转(使用注解,配置文件会)?

问题描述 不同namespace下的action之间如何跳转(使用注解,配置文件会)? 比如我要从@Action(value="user/login",results={@Result(name = "firstpage", location = ? ,type="redirectAction")跳转到@Action(value="/front/homepage/query") user/login 里面的loction该如何