區域設定

Spring 架構的大部分都支援國際化,Spring Web MVC 框架也是如此。DispatcherServlet 允許您透過使用客戶端的區域設定自動解析訊息。這是透過 LocaleResolver 物件完成的。當請求進來時,DispatcherServlet 會查詢區域設定解析器,如果找到,則嘗試使用它來設定區域設定。透過使用 RequestContext.getLocale() 方法,您始終可以檢索由區域設定解析器解析的區域設定。

除了自動區域設定解析,您還可以向 handler mapping 附加一個攔截器(請參閱攔截瞭解更多關於 handler mapping 攔截器的資訊),以在特定情況下(例如,基於請求中的引數)更改區域設定。

區域設定解析器和攔截器定義在 org.springframework.web.servlet.i18n 包中,並以通常的方式在應用上下文中進行配置。Spring 中包含了以下幾種區域設定解析器。

時區

除了獲取客戶端的區域設定外,瞭解其時區也通常很有用。LocaleContextResolver 介面是 LocaleResolver 的一個擴充套件,它允許解析器提供更豐富的 LocaleContext,其中可能包含時區資訊。

如果可用,可以透過 RequestContext.getTimeZone() 方法獲取使用者的 TimeZone。任何註冊到 Spring 的 ConversionService 的日期/時間 ConverterFormatter 物件都會自動使用時區資訊。

Header 解析器

此區域設定解析器檢查客戶端(例如,Web 瀏覽器)傳送的請求中的 accept-language 頭部。通常,此頭部欄位包含客戶端作業系統的區域設定。請注意,此解析器不支援時區資訊。

Cookie 解析器

下表描述了 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 屬性

SessionLocaleResolver 允許您從可能與使用者請求關聯的 session 中檢索 LocaleTimeZone。與 CookieLocaleResolver 不同,此策略將本地選擇的區域設定儲存在 Servlet 容器的 HttpSession 中。因此,這些設定對於每個 session 都是臨時的,並在 session 結束時丟失。

請注意,這與外部 session 管理機制(如 Spring Session 專案)沒有直接關係。此 SessionLocaleResolver 會根據當前的 HttpServletRequest 評估和修改相應的 HttpSession 屬性。

區域設定攔截器

透過將 LocaleChangeInterceptor 新增到某個 HandlerMapping 定義中,您可以啟用區域設定的更改。它檢測請求中的一個引數,並相應地更改區域設定,呼叫 dispatcher 應用上下文中的 LocaleResolversetLocale 方法。下一個示例顯示,對所有包含名為 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>