2012-09-10 120 views
0

我的问题有点基本,因为我仍然在学习Struts2和Spring以及它们的集成。当我们在struts.xml中定义一个拦截器时,例如Struts2拦截器和弹簧集成

<interceptors> 
    <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/> 

    <interceptor-stack name="simpleStack"> 
    <interceptor-ref name="validation"> 
     <param name="excludeMethods">input,back,cancel,execute</param> 
    </interceptor-ref> 
    </interceptor-stack> 
</interceptors> 

<default-interceptor-ref name="simpleStack"/> 

如果在applicationContext.xml我:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" 
      "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> 
<beans> 
<bean id="user" class="struts.model.User"/> 
    <bean id="registerUserAction" class="struts.actions.UserInformationAction"> 
     <property name="userBean" ref="user"/> 
    </bean> 

    <bean id="chooseUsernamePasswordAction" class="struts.actions.ChooseUsernameAction"> 
     <property name="userBean" ref="user"/> 
    </bean>  
</beans> 

没有拦截用户定义的bean是在这两个动作(registerUserAction - > JSP - > chooseUsernamePasswordAction)持久的,我可以访问属性。一旦拦截器被引入,它看起来像值被清除。

  1. 首先从我读到的看起来像我可能会做这一切都是错误的。即集成了Spring的所有这些项目都处于单例默认模式,这可能是不正确的,因为多个用户将注册,因此每个用户都必须拥有自己的操作/用户bean。
  2. 发生什么或需要做什么来传递信息并使拦截器正常工作。

回答

1

如果你是显式定义在必须将它们定义为scope="prototype" Spring配置你的行动。这是相对不寻常的,你需要手动定义它们,除非你特别想使用XML配置来处理所有事情,比如服务注入等等。

我不完全清楚你的意图是用户bean。您可以使用Spring会话范围的bean,可以使用Spring web上下文来访问可能会。我不确定这是多么必要;我通常手动完成它,并在实际需要时从会话中检索bean。可能没关系。

还要注意,你的栈基本上消除了所有的 Struts 2的功能,比如将表单参数转换为动作属性。这可能是你打算,但它不太可能。

+0

在应用程序上下文定义的动作,在我看来不错,但戴维说,你可能想他们的范围为__prototype__,你可能想SOPE用户bean作为__session__。同样如Dave所说,在设置拦截器堆栈之前,用户的属性会按照您的预期注入。但随着你的堆栈,因为你删除了参数注入,用户的属性保持不变 – Alban

+0

感谢戴夫和奥尔本。 – user1111871

+0

谢谢大家。为了澄清我的意图,可以将userbean视为包含所有用户相关信息(例如名称,地址,用户名)的bean。随着注册流程的进行,这些会被填充,即首先输入基本信息做一些验证的东西,然后在另一个页面中选择用户名和东西等等。所以我基本上是在我走的时候填充bean - 因此会话。你们可以详细说明你的意思吗,当你说我的堆栈消除了所有的struts2功能和关于参数注入。如果我有多个拦截器,例如CreateSession,定制拦截器 – user1111871

0

看一看struts-default.xml。现在查看名为defaultStack的拦截器堆栈。在文档的末尾,这个堆栈被设置为默认的拦截器堆栈。正如Dave Newton所解释的,struts 2的所有魔力都来自它的拦截器。

基本上,当你将你的堆栈设置为默认堆栈时,将包含17个拦截器的堆栈替换为只包含1个拦截器的堆栈。通过这样做,你放弃了许多struts 2功能,例如拦截器提供的参数注入param

另外,请注意验证拦截器包括在defaultStack,但使用不同的参数excludeMethods

0

我们也使用相同的项目结构

的Struts2 + Spring + Hibernate的

使用Struts拦截之前,我们可以能够通过参数

但使用拦截后,我们是不是可以发送参数(值为空)

为了避免这种情况,使用params拦截器,那么你可以通过参数

例如: -

<action name="doUpload_valid1" method="importExcel" class="validationAction"> 
    <interceptor-ref name="params"/> 
    <interceptor-ref name="fileUpload"/> 

    <result name="error">jsp/cmdbValidPage.jsp</result> 
    <result name="success">jsp/testJob.jsp</result> 
</action>