第二个问题:
先对 strus2 的默认拦截器原理说下
官方文档这两行最能表达我的意思, excludeMethods 参数是设置该拦截器忽略哪些方法,下面反之。这简单原理相信您非常了解了,来看下我们这里出现的情况吧 !
这是最普遍的业务逻辑,
开始选中的被取消了,并且没有“用户名不能为空”的错误信息。
说明:
为什么会错误信息没了呢?同样经过 validate 、 workflow 拦截器后,跳转 input 试图,一但我们重定向,则 strus2 框架会为我们创建一个新的 UserAction 对象 ,则 fieldErrors 、 UserBean 的 hobby 数组都为 null 了,所以错误信息、开始选中的都显示不出来了。
情况三:
相信您已经有解决方案了 ,把 input 试图的 type 设为 chain 类型, chain 类型的作用是,让该请求重新被拦截器拦截,好我们来修改:
大概意思是 : 如果你要拷贝当前的 action 属性到当前 chain 上的 action ,你需要应用 Chaining 拦截器,该拦截器会拷贝请求上的 parameters 和 value stack 传递到目标 action 上 ,原始的 action 会保存 valueStack ,允许目标 action 访问前面所有 action 的 valueStack 作用域上的属性,同样对于 chain 的 result 结果试图如 jsp 、 velocity 界面同样可以访问这些属性。
=====================================================
所以当我们以 chain 方式访问 registerUserUI.action ,原先 action 的 valueStack 上的 fieldErrors 同样被拷贝到当前 UserAction 对象 fieldErrors 字段里,在经过 workflow 拦截器后,又发现有错误,同样调用 input 试图,进而又去调用 registerUserUI.action ,经过 workflow 拦截器后,又发现有错误,又去调用 input 试图,进而递归调用。
现在该怎样解决呢?我们要做的就是,让他调用 registerUserUI.action 时被 workflow 拦截器拦截后,不再验证是否有错误,前面说到过 excludeMethods 参数,我们查看 workflow 拦截器
虽然 chain 方式对于完成这种业务很方便,官方提示我们谨慎使用,过度使用会造成程序的代码混乱,到时还是根据业务来决定。
本文详细解析了Struts2框架中默认拦截器的工作原理,特别是针对workflow拦截器如何处理错误信息及用户输入的问题。并通过实例展示了在不同场景下如何配置拦截器以避免错误信息丢失,包括使用chain类型的解决方案。

被折叠的 条评论
为什么被折叠?



