2012-09-10 115 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>