區域設定
Spring 架構的大部分都支援國際化,Spring Web MVC 框架也是如此。DispatcherServlet
允許您透過使用客戶端的區域設定自動解析訊息。這是透過 LocaleResolver
物件完成的。當請求進來時,DispatcherServlet
會查詢區域設定解析器,如果找到,則嘗試使用它來設定區域設定。透過使用 RequestContext.getLocale()
方法,您始終可以檢索由區域設定解析器解析的區域設定。
除了自動區域設定解析,您還可以向 handler mapping 附加一個攔截器(請參閱攔截瞭解更多關於 handler mapping 攔截器的資訊),以在特定情況下(例如,基於請求中的引數)更改區域設定。
區域設定解析器和攔截器定義在 org.springframework.web.servlet.i18n
包中,並以通常的方式在應用上下文中進行配置。Spring 中包含了以下幾種區域設定解析器。
時區
除了獲取客戶端的區域設定外,瞭解其時區也通常很有用。LocaleContextResolver
介面是 LocaleResolver
的一個擴充套件,它允許解析器提供更豐富的 LocaleContext
,其中可能包含時區資訊。
此區域設定解析器檢查客戶端(例如,Web 瀏覽器)傳送的請求中的 accept-language
頭部。通常,此頭部欄位包含客戶端作業系統的區域設定。請注意,此解析器不支援時區資訊。
此區域設定解析器檢查客戶端可能存在的 Cookie
,以檢視是否指定了 Locale
或 TimeZone
。如果指定,則使用指定的詳細資訊。透過使用此區域設定解析器的屬性,您可以指定 Cookie 的名稱以及最大生存期。以下示例定義了一個 CookieLocaleResolver
下表描述了 CookieLocaleResolver
的屬性
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<!-- in seconds. If set to -1, the cookie is not persisted (deleted when browser shuts down) -->
<property name="cookieMaxAge" value="100000"/>
</bean>
表 1. CookieLocaleResolver 屬性
預設值 | 描述 | cookieName |
---|---|---|
|
Cookie 的名稱 |
cookieMaxAge |
|
Cookie 在客戶端上保留的最長時間。如果指定 |
cookiePath |
|
/ |
SessionLocaleResolver
允許您從可能與使用者請求關聯的 session 中檢索 Locale
和 TimeZone
。與 CookieLocaleResolver
不同,此策略將本地選擇的區域設定儲存在 Servlet 容器的 HttpSession
中。因此,這些設定對於每個 session 都是臨時的,並在 session 結束時丟失。
透過將 LocaleChangeInterceptor
新增到某個 HandlerMapping
定義中,您可以啟用區域設定的更改。它檢測請求中的一個引數,並相應地更改區域設定,呼叫 dispatcher 應用上下文中的 LocaleResolver
的 setLocale
方法。下一個示例顯示,對所有包含名為 siteLanguage
引數的 *.view
資源的呼叫現在會更改區域設定。例如,請求 URL www.sf.net/home.view?siteLanguage=nl
會將網站語言更改為荷蘭語。以下示例顯示如何攔截區域設定
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="siteLanguage"/>
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/>
</list>
</property>
<property name="mappings">
<value>/**/*.view=someController</value>
</property>
</bean>