0

我的问题有点基本,因为我仍在学习 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. 正在发生什么或需要做什么来传递信息并使拦截器正常工作。
4

3 回答 3

1

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

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

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

于 2012-09-10T14:45:18.883 回答
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>
于 2013-05-09T11:25:50.410 回答
0

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

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

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

于 2012-09-11T10:18:50.610 回答