2009-08-18 88 views
0

我已經實現了一個自定義的ActionMapper,它從URI(URI本身,而不是請求參數)獲取區域設置。從ActionMapper.getMapping()中,如何設置當前操作的區域設置?如何設置自定義的區域設置Struts 2 ActionMapper

這裏有一些想法,我認爲:

  • ActionContext.getCurrent()的setLocale()。不幸的是,當動作被調用時,似乎創建了新的ActionContext,並且區域設置被重置爲默認值。
  • 設置參數request_locale,由i18n攔截器處理。不幸的是,i18n攔截器堅持不僅爲當前操作設置語言環境,而且還爲當前會話設置語言環境,這會引發異常,因爲會話沒有爲我的應用程序啓用。
  • 通過實現setLocale(),設置一個參數並在動作本身中對其進行處理。直截了當,但這意味着沒有任何攔截器可以訪問區域設置。
  • 設置一個參數並編寫一個攔截器(基本上和i18n攔截器完全相同,而不需要假設會話支持)。對於這樣一個簡單的問題似乎過度殺傷,更不用說重新發明輪子。

有沒有簡單的方法來實現這一目標?

+0

如果您需要在您的攔截器的語言環境,我想你堅持重新發明用自定義的i18n攔截輪。令我驚訝的是ActionContext被重新創建 - 我想你的第一個想法也會起作用。 – Pat 2009-08-19 01:08:53

回答

0

我確實最終設置了一個參數「locale」,並重寫了i18n攔截器的使用方法。

由於Struts 2.1.1,ActionMapping中的參數與請求參數保持分開。 actionMappingParams攔截器使用這些參數並將它們應用於操作對象。不過,我想我的i18n攔截消費「區域設置」參數和其穿過的行動,我是這樣做的:

private static final String LOCALE_PARAMETER = "locale"; 

public String intercept(ActionInvocation invocation) throws Exception { 
    ActionMapping mapping = (ActionMapping) invocation.getInvocationContext() 
     .get(ServletActionContext.ACTION_MAPPING); 
    Map params = mapping.getParams(); 
    Locale locale = (Locale) params.remove(LOCALE_PARAMETER); 

    if(locale != null) { 
     ActionContext.getContext().setLocale(locale); 
    } 

    return invocation.invoke(); 
} 

這種定製的i18n攔截器必須走在了攔截器棧actionMappingParams前。只爲請求 request_only_locale的

代替 request_locale

request_only_locale存儲區域和不接觸會議:

1

當您設置帕拉姆,你可以使用提供I18nInterceptor。

乾杯, 基督教

+0

好的解決方案。我猜這在我問原始問題的時候使用的Struts2的任何版本都不可用(因爲我確定我經歷了I18nInterceptor源代碼)。 – 2011-04-21 02:00:13