第二个问题:
先对 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 方式对于完成这种业务很方便,官方提示我们谨慎使用,过度使用会造成程序的代码混乱,到时还是根据业务来决定。