Struts2中执行<s:action>后值栈数据变更的根因咨询
Struts2值栈数据变更的根本原因分析
核心原因1:<s:action>标签默认触发params拦截器,覆盖表单Bean属性
<s:action>标签默认会执行目标Action的完整拦截器栈,其中params拦截器会自动从当前HttpServletRequest的参数中提取值,赋值给关联的表单Bean(这里是CasePostFormBean)。你最初提交表单时的subject=input value参数仍保存在request中,所以params拦截器会用这个原始值,覆盖掉你在CasePostAction中设置的success to send form。
核心原因2:值栈层级与表单Bean的作用域特性
你在CasePostAction中修改的CasePostFormBean,默认处于值栈顶层(作为Action的属性)。当<s:action>执行时,会将ServletHelperAction实例压入值栈顶层。如果ServletHelperAction和CasePostAction共享同一个CasePostFormBean实例(比如通过ModelDriven接口或属性注入),再加上表单Bean默认是request作用域,params拦截器会直接操作这个Bean的属性,导致值被覆盖。
简单来说:<s:action>默认会触发参数回写,把request里的原始表单值重新塞回Bean里,导致你之前修改的值被冲掉了。
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

