Spring的體系結構的大多數部分都支持國際化,就像Spring Web MVC框架一樣。 DispatcherServlet可以使用客戶端的區域設置自動解析消息。這是通過LocaleResolver對象完成的。
當請求進入時,DispatcherServlet會查找區域設置解析器,如果找到它,則會嘗試使用它來設置區域設置。使用RequestContext.getLocale()方法,始終可以檢索由區域設置解析器解析的區域設置。
除了自動locale解析之外,還可以將攔截器附加到處理器映射以在特定情況下更改locale,例如,基於請求中的參數。
Locale解析器和攔截器在org.springframework.web.servlet.i18n包中定義,並以正常方式在應用程序上下文中進行配置。以下是Spring中包含的區域設置解析器的選擇。
1. 獲取時區信息
除了獲取客戶端的區域外,瞭解其時區通常也很有用。 LocaleContextResolver接口提供LocaleResolver的擴展,允許解析器提供更豐富的LocaleContext,其中可能包含時區信息。
可以使用RequestContext.getTimeZone()方法獲取用戶的TimeZone。時區信息將由Spring的ConversionService註冊的Date/Time Converter和Formatter對象自動使用。
2. AcceptHeaderLocaleResolver
該區域設置解析器檢查客戶端(例如,Web瀏覽器)發送的請求中的accept-language請求頭。通常,此請求頭字段包含客戶端操作系統的區域設置信息。此解析程序不支持時區信息。
3. CookieLocaleResolver
此區域設置解析器檢查客戶端上可能存在的Cookie,以查看是否指定了Locale或TimeZone。如果是,則使用指定的詳細信息。使用此區域設置解析器的屬性,可以指定cookie的名稱以及最大存活時間。在下面找到定義CookieLocaleResolver的示例。
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<!-- 單位:秒,假如設置爲-1, 則cookie不會持久化(當瀏覽器關閉時被刪除) -->
<property name="cookieMaxAge" value="100000"/>
</bean>
CookieLocaleResolver屬性
屬性 | 默認值 | 描述 |
---|---|---|
cookieName |
classname + LOCALE |
cookie的名稱 |
cookieMaxAge |
Servlet container default |
Cookie在客戶端上存在的最長時間。 如果指定-1,則不會保留cookie;它只有在客戶端關閉瀏覽器之後纔可用。 |
cookiePath |
/ |
限制cookie對網站某個部分的可見性。 指定cookiePath時,cookie只對該路徑及其下方的路徑可見。 |
4. SessionLocaleResolver
SessionLocaleResolver允許從可能與用戶請求關聯的會話中檢索Locale和TimeZone。 與CookieLocaleResolver相比,此策略將本地選擇的區域設置存儲在Servlet容器的HttpSession中。 因此,這些設置對於每個會話來說都是臨時的,因此在每個會話終止時都會丟失。
請注意,與Spring Session項目等外部會話管理機制沒有直接關係。 此SessionLocaleResolver將簡單地針對當前的HttpServletRequest評估和修改相應的HttpSession屬性。
5. LocaleChangeInterceptor
可以通過將LocaleChangeInterceptor添加到其中一個處理器映射來更改區域設置。 它將檢測請求中的參數並更改區域設置。 它在LocaleResolver上調用setLocale(),它也存在於上下文中。
以下示例顯示所有請求*.view資源,同時也包含名爲siteLanguage的參數時,將更改區域設置。 因此,例如,對以下URL的請求http://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>