2016-02-28 101 views
0

我有一個使用Struts2的Freemarker模板和Spring4的Web應用程序。如何將對象暴露給我的所有Struts2視圖?

我有一些配置字符串存儲在.properties文件中,我需要在每個頁面上呈現(例如,我們的CDN路徑,其中包含版本字符串)。現在這些屬性被彈簧讀取並存儲在org.springframework.core.env.Environment的實例中。

有沒有簡單的方法讓我的環境實例可以訪問我的所有視圖?我們有另一個應用程序通過動作繼承來完成此操作,其中基類有一個getEnvironment()方法。我不喜歡這種方法,因爲每個動作都必須擴展基類。

回答

4

把你的邏輯放到一個bean中(例如Configuration.java),然後在需要它的所有操作中注入(通過Spring DI,Java EE CDI或其他),並通過Getter公開。

但我不會低估的繼承方法這裏,它爲你描述它不是那麼糟糕,因爲你可以建立自己的繼承樹中添加規格,同時遍歷它:一個BaseAction,某些子BaseActions ,一些子分...等Read more

如果稍後發現某些您放置在BaseAction上的東西是兄弟BaseActions所需要的,則只需將其上移一級(在父級BaseAction中,直到第一個級別,每個人都共用)。

+1

謝謝您的輸入。我選擇使用繼承。 – user636747

+1

我同意,很可能您的所有操作都共享一組常用的方法(db連接,從上下文中檢索對象,記錄日誌,公共資源路徑,用戶代理信息,IP等)。所有這些東西可能都會在您的BaseAction中結束。 – fustaki

+0

@fustaki隨時贊同更多的答案:) –

1

編寫攔截器,攔截每個動作並將此攔截器添加到自定義攔截器堆棧。這個堆棧你應該創建一個默認的攔截器堆棧。

<interceptors> 
    <interceptor name="myinterceptor" class="com.company.interceptor.MyInterceptor"/> 
    <interceptor-stack name="customStack"> 
    <interceptor-ref name="myinterceptor"/> 
    <interceptor-ref name="defaultStack"/> 
    </interceptor-stack> 
</interceptors> 
<default-interceptor-ref name="customStack"/> 

在執行myinterceptor從應用程序上下文獲取bean並將其放在值棧上。在每個JSP中,您都可以使用OGNL訪問值棧的對象。

1

嗯,我認爲繼承解決方案適合您的問題,所有的控制器都需要這些屬性,所以它是最好的和最合乎邏輯的方法。

你可以嘗試一下攔截器解決方案,就像羅馬剛告訴你的那樣,但我認爲攔截器配置有點棘手,而且當攔截器內的東西變壞並且你有一個大的應用時,Struts2錯誤日誌並沒有真正的幫助。在每一個動作開始時,你會放棄性能處理邏輯,而不是繼承使用它。