背景 :
1) Struts2会对每一个请求,产生一个Action的实例来处理.
2)Spring的Ioc容器管理的bean默认是单实例的.
当Struts2与Spring整合后,由spring来管理Struts2的Action,会遇到什么问题?如何解决 ?
----------------------------------------------------------------
会遇到什么问题?
Struts2与Spring整合后,由spring来管理Struts2的Action,
1)Action是单例,其中的FieldError,actionerror中的错误信息 会累加,即使再次输入了正确的信息,也过不了验证.
2)Struts2的Action是有状态的,他有自己的成员属性,所以在多线程下,会有问题.
----------------------------------------------------------------
如何解决?
方案一: 就是不用单例,spring中bean的作用域设为prototype,每个请求对应一个实例.
或者取消单例模式,如配置文件修改为(Spring版本的不同,在DTD文件约束也不同):
<beanid="authgroupact"class="com.skywalk.framework.web.struts.action.AuthoriseGroupAct" singleton="false">
方案二: spring中bean的作用域设为session,每个session对应一个实例,解决了多线程问题.
再写一个拦截器,
-
- public
class ClearFieldErrorIntercept or extends AbstractInterceptor { -
- @Override
- public
String intercept(ActionInvocation invocation) throws Exception { - ActionSupport
actionSupport = (ActionSupport)invocation.getAction(); - actionSupport.clearErrorsAndMessages();
- String
resultCode = invocation.invoke(); - return
resultCode; - }
-------------------------------------------------------------------------------------
总结 :
方案一 , bean的作用域设为prototype,
方案二: