基于Struts2 Result Type为chain 的Action之间数据传递.docxVIP

 基于Struts2 Result Type为chain 的Action之间数据传递.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
chain:基本用途是构造成一条动作链。前一个Action将控制权转交给后一个Action,而前一个Action的状态在后一个Action里仍然保持着。我现在有一个场景,FirstAction 通过chain的方式,将控制权交给 SecondAction。FirstAction对应的页面代码为first.ftl,SecondAction对应的页面代码为second.ftl。假设我们的FirstAction如下定义:public?class?SecondAction?extends?ActionSupport{?private?CustomUser?user?=?null;?public?String?execute()?throws?Exception?{?//?利用user做事情或显示在页面上?}?//?getter?setter}意思很明确了,通过first.ftl的输入,到DB中或其他,生成了我们的CustomUser对象,这个CustomUser对象将要在SecondAction使用。于是我们想到了要配置FirstAction 的 name为toSecond的 Result type为 chain,将 生成的CustomUser对象传递到 SecondAction中,我们也这样做了,但是 经过调试,发现在SecondAction中没有得到 FirstAction中的CustomUser对象。SecondAction是这样实现的:public?class?SecondAction?extends?ActionSupport{?private?CustomUser?user?=?null;?public?String?execute()?throws?Exception?{?//?利用user做事情或显示在页面上?}?//?getter?setter}看一下ChainingInterceptor.java的实现,发现有这样的注释:An?interceptor?that?copies?all?the?properties?of?every?object?in?the?value?stack?to?the?currently?executing?object.在 FirstAction 中CustomUser user 并没有在 value stack 中,所以没有拷贝到SecondAction中。知道了问题所在,就要解决。首先是想换一种方式去做,将我们要传递的参数通过 其他 Result type 如redirectAction去传递。例如:result?type=redirectAction?name=toSecond?param?name=actionNameSecondAction/param?param?name=methodexecute/param?param?name=user${user}/param/result但这样做的缺点是,1.我们要在浏览器上看到很长很乱的URL(如果超过URL长度限制那就更悲剧了)。2.暴露这些参数总感觉很不爽。3.自定义的对象不能用这种方式传递,要么传String、或JsonObject等。另外一个解决办法:因为Result type为chain时,在执行SecondAction时,它的上一个Action,也就是FirstAction的实例并没有被销毁,FirstAction的实例被加入到了ValueStack中。所以,实现的思路就是,增加一个拦截器,在执行Actioin前判断一下,当前Action是否需要从前面的Action实例中获取数据。这个可以通过注解的方式告诉拦截器,当前的action需要什么样的对象。思路明确了,来看看代码:注解类:ChainTransParam.javaimport?java.lang.annotation.Documented;import?java.lang.annotation.ElementType;import?java.lang.annotation.Retention;import?java.lang.annotation.RetentionPolicy;import?java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic?@interface?ChainTransParam?{?String?fieldName()?default?;}拦截器实现:ChainParameterInterceptor.java/**?*?Result?type?为chain时?可通过注解的方式实现参数

文档评论(0)

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档