Struts 2中chain如果是在同一个Action中的不同方法之间跳转

在同一个Action类中的两个方法,第一个方法改变了Action中属性的值,这个值在页面上有对应的textfield,提交到第一个方法时里面是有值的,然后在这个方法里改变... 在同一个Action类中的两个方法,第一个方法改变了Action中属性的值,这个值在页面上有对应的textfield,提交到第一个方法时里面是有值的,然后在这个方法里改变了这个属性的值,然后从这个方法跳转到同一个类下的另一个方法进行处理,但是发现那个属性没有发生改变,也就是说在第一个方法中对这个属性的改变没有起作用。
配置文件如下
<action name="save" class="ComAction" method="save" >
<result type="chain">view</result>
<result name="input">/WEB-INF/pages/Form/AC012.jsp</result>
</action>

<action name="view" class="ComAction" method="view" >
<result name="success">/WEB-INF/pages/Form/AC012.jsp</result>
<result name="input">/WEB-INF/pages/Form/AC012.jsp</result>
</action>
chain究竟是怎么样的机制,是不是相当于forward。Struts 2通过chain跳转,是否会重新走一遍拦截器栈。
展开
 我来答
百度网友e82546a27
推荐于2016-10-08 · TA获得超过403个赞
知道小有建树答主
回答量:264
采纳率:100%
帮助的人:240万
展开全部
1、原理问题,struts2每个请求到来时都会实例化Action类,所以属性都是单独的,楼主理解错了,要是按你的理解,现在的Struts2根本没法工作了。
2、如果你使用的是Spring的MVC,那么因为action类只被实例化一次,所以当第一个方法改变该该Action类的属性的时候,第二个方法也会读到改变后的值,因为根本是同一个对象。
3、案例分析:
你的ComAction 存在一个属性property,两个方法 save 和 view
(1)当你com!save.action 的时候,这时候struts会new一个 ComAction,然后你调用其save方法,改变了其属性property的值 property=123;当save方法退出的时候刚才new出来的ComAction已经被销毁了。
(2)当你com!view.action的时候,这时候struts又new一个ComAction,这时候你读取property的值,肯定不是123,因为此时的ComAction 对象是全新的。

建议:save的时候,将对象序列化到数据库,文件。或者session中,view的时候 从序列化中读取,不要依赖ComAction的属性。

PS:码字好累,不知道是不是说清楚了。
更多追问追答
追问
框架是SSH,我debug看过,跳转以后Action的地址不同,但是Action中的属性的地址是相同的……我想知道chain以后,是不是会重新走一遍过滤器,如果重新走一遍,经过params时,就会将属性改回request中的值了啊
追答
我觉得理解偏差了,我不知道你怎么看的地址,这只能说明当第一个action被销毁后,JVM又重新分配了一块内存放新实例化的Action,这时候不管属性地址是什么,新实例化的action中的所有属性的值肯定是初始化的。内存就那么大,地址是可重用的。C语言里的一个变量初始化分配内存,然后销毁,然后又给另一个变量重新分配此内存,假设不手工初始化的话,那么读取到的数据确实是原来的数据,这也就是为什么,C语言里每个变量在使用前都必须由程序员手工初始化,而java不用的原因,java的这部分工作,由JVM代做了而已。

分割线:
对于type=“chain” 你的用法是错误的,针对你的代码你改成这样就对了

view
/WEB-INF/pages/Form/AC012.jsp

/WEB-INF/pages/Form/AC012.jsp

然后再save方法你,return “success” ,这样的话 chain的效果就出来了。
北京稳联技术有限公司
2024-10-22 广告
北京稳联技术是一家专注于工业通讯协议转换的公司,咨询热线:13661193815。公司以研发工业通信设备为主,专注于工业通讯中Modbus、RS232/485、Modbus TCP、CanOpen、Can等各种通讯协议接入Profibus/... 点击进入详情页
本回答由北京稳联技术有限公司提供
百度网友a668673
2012-11-29 · TA获得超过527个赞
知道小有建树答主
回答量:425
采纳率:0%
帮助的人:341万
展开全部
chain压根就不是这么用的,唉,又是你......

chain是按你设计的动作链自动调用的,才会共享结果值。
比如
<action name="1" class="a">
<result type="chain">2</result>

</action>
<action name="2" class="a">
<result type="chain">3</result>
</action>
<action name="3" class="a">
<result>result.jsp</result>
</action>
这是chain的机制,简单了一些,你能明白就好。

你这种情况,session最简单暴力....
追问
我那个难道不是形成一个动作链吗?
追答
我错了,看完你代码.......写了个跟你一样的例子.....这...

3
这里是命名空间

我觉得,如果java你还要刻意纠结什么内存、指针啥的,那比起c/c++,它真多余了......
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
rookie_R
2012-11-29 · TA获得超过125个赞
知道答主
回答量:91
采纳率:100%
帮助的人:41.9万
展开全部
你可以不可以这样呢:你跳转到第一个方法的时候,打印一下看看有没有值,如果有值的话,就返回一个视图,这个视图在struts中配置一下,或者说你这样配:
<action name="method_*" class="xx" method="{1}">
</action>
通过第一个方法有参数传递进来后然后在跳转到第二个视图,你看可以不?
追问
这两个方法返回的是同一个JSP啊,debug的时候是可以看到第一个方法执行完了以后,属性的值成功改变了。但是继续执行,进入第二个方法的时候,值有变成了request提交时候的值
追答
那你把第一次提交的值放到session中行不?第二次用request.getSession去取能得到么?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Oo海之蓝歌oO
2012-11-29 · 喜欢计算机有关的东东
Oo海之蓝歌oO
采纳数:244 获赞数:876

向TA提问 私信TA
展开全部
配置的有问题。
一个类内部方法间的跳转可以直接在类内部直接调用另外一个方法,干嘛还要跳转?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hanliwoyaoai
2012-11-29 · TA获得超过416个赞
知道小有建树答主
回答量:593
采纳率:0%
帮助的人:457万
展开全部
会不会 你进入 chain 这个之前 还要进入了一些过滤器。
然后重新进入赋值那个过滤 那里面的值是没有改变的。
追问
没有另外配过滤器啊,不过Action类实现了Prepare接口,但是在prepare方法里没有改变Action属性
追答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式