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跳转,是否会重新走一遍拦截器栈。 展开
配置文件如下
<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跳转,是否会重新走一遍拦截器栈。 展开
5个回答
展开全部
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:码字好累,不知道是不是说清楚了。
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的效果就出来了。
展开全部
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最简单暴力....
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++,它真多余了......
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以不可以这样呢:你跳转到第一个方法的时候,打印一下看看有没有值,如果有值的话,就返回一个视图,这个视图在struts中配置一下,或者说你这样配:
<action name="method_*" class="xx" method="{1}">
</action>
通过第一个方法有参数传递进来后然后在跳转到第二个视图,你看可以不?
<action name="method_*" class="xx" method="{1}">
</action>
通过第一个方法有参数传递进来后然后在跳转到第二个视图,你看可以不?
追问
这两个方法返回的是同一个JSP啊,debug的时候是可以看到第一个方法执行完了以后,属性的值成功改变了。但是继续执行,进入第二个方法的时候,值有变成了request提交时候的值
追答
那你把第一次提交的值放到session中行不?第二次用request.getSession去取能得到么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
配置的有问题。
一个类内部方法间的跳转可以直接在类内部直接调用另外一个方法,干嘛还要跳转?
一个类内部方法间的跳转可以直接在类内部直接调用另外一个方法,干嘛还要跳转?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
会不会 你进入 chain 这个之前 还要进入了一些过滤器。
然后重新进入赋值那个过滤 那里面的值是没有改变的。
然后重新进入赋值那个过滤 那里面的值是没有改变的。
追问
没有另外配过滤器啊,不过Action类实现了Prepare接口,但是在prepare方法里没有改变Action属性
追答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询