【问题标题】:Struts2 Interceptors and Spring IntegrationStruts2 拦截器和 Spring 集成
【发布时间】:2012-09-03 10:50:30
【问题描述】:

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

<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 集成,所有这些项目都处于单例默认模式,这可能是不正确的,因为多个用户将注册,因此每个用户都必须有自己的 Action/User bean。
  2. 正在发生什么或需要做些什么来传递信息并使拦截器正常工作。

【问题讨论】:

    标签: spring struts2 interceptor interceptorstack


    【解决方案1】:

    如果您在 Spring 配置中明确定义您的操作,它们必须定义为 scope="prototype"。您需要手动定义它们是相对不寻常的,除非您特别想对所有内容使用 XML 配置,例如服务注入等。

    我并不完全清楚您对用户 bean 的意图是什么。您可以使用 Spring 会话范围的 bean,可用于 Spring Web 上下文。我不确定这是多么必要。我通常手动完成它,并在我真正需要它时从会话中检索 bean。可能没关系。

    还请注意,您的堆栈基本上消除了 所有 Struts 2 功能,例如将表单参数转换为操作属性。这可能是你想要的,但不太可能。

    【讨论】:

    • 在我看来,在应用程序上下文中定义动作是可以的,但正如 Dave 所说,您可能希望将它们限定为 prototype,并且您可能希望对您的用户 bean作为会话。同样正如 Dave 所说,在您设置拦截器堆栈之前,用户的属性会按照您的预期注入。但是使用您的堆栈,因为您删除了参数注入,所以用户的属性保持不变
    • 谢谢各位。为了澄清我的意图,将 userbean 视为包含所有用户相关信息的 bean,即名称、地址、用户名。随着注册流程的进行,这些会被填充,即首先输入基本信息做一些验证工作,然后在另一个页面中选择用户名和东西等。所以我基本上是在填充 bean - 因此会话。当你说我的堆栈消除了所有 struts2 功能和参数注入时,你们能否详细说明你的意思。如果我有多个拦截器,例如 CreateSession、自定义拦截器会怎样
    • @user1111871 没有什么可详细说明的;您创建并用作默认堆栈的"simpleStack" 仅包含一个拦截器。除了请求映射之外,大多数 S2 功能都来自堆栈中没有的拦截器。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      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>
      

      【讨论】:

        猜你喜欢
        • 2014-03-31
        • 2011-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多