爲了讓web應用程序支持國際化,必須識別每一個用戶的首選區域,並根據這個區域顯示內容。web
在Spring MVC應用程序中,用戶的區域是經過區域解析器來識別的,它必須實現LocaleResolver接口。Spring MVC提供了幾個LocaleResolver實現,讓你能夠按照不一樣的條件來解析區域。除此以外,你還能夠實現這個接口,建立本身的區域解析器。spring
要定義一個區域解析器,只需在web應用程序上下文中註冊一個LocaleResolver類型的Bean就能夠了。你必須將區域解析器的Bean名稱設置爲localeResolver,這樣DispatcherServlet才能自動偵測到它。請注意,每DispatcherServlet只能註冊一個區域解析器。瀏覽器
1.按HTTP請求頭部解析區域cookie
Spring採用的默認區域解析器是AcceptHeaderLocaleResolver。它經過檢驗HTTP請求的accept-language頭部來解析區域。這個頭部是由用戶的web瀏覽器根據底層操做系統的區域設置進行設定。請注意,這個區域解析器沒法改變用戶的區域,由於它沒法修改用戶操做系統的區域設置。mvc
2.按會話屬性解析區域app
解析區域的另外一種方法是經過SessionLocaleResolver。它經過檢驗用戶會話中預置的屬性來解析區域。若是該會話屬性ide
不存在,它會根據accept-language HTTP頭部肯定默認區域。ui
Xml代碼
<bean id="localeResolver" class="org.springframewrok.web.servlet
.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="en"/>
</bean>
若是會話屬性不存在,能夠爲這個解析器設置defaultLocale屬性。請注意,經過修改保存該區域的會話屬性,這個區域this
解析器能夠改變用戶的區域設置。spa
3.按Cookie解析區域
你也能夠檢驗用戶瀏覽器中的Cookie,用CookieLocaleResolver來解析區域。若是Cookie不存在,它會根據accept-language HTTP頭部肯定默認區域。
Xml代碼
<bean id="localeResolver" class="org.springframework.web.servlet
.i18n.CookieLocaleResolver"/>
這個區域解析器所採用的Cookie能夠經過cookieName和cookieMaxAge屬性進行定製。cookieMaxAge屬性表示這個Cookie應該持續多少秒,-1表示這個Cookie在瀏覽器關閉以後就失效。
Xml代碼
<bean id="localeResolver" class="org.springframework.web.servlet
.i18n.CookieLocaleResolver">
<property name="cookieName" value="language"/>
<property name="cookieMaxAge" value="3600"/>
<property name="defaultLocale" value="en"/>
</bean>
若是用戶瀏覽器中不存在該Cookie,你也能夠爲這個解析器設置defaultLocale屬性。經過修改保存該區域的Cookie,這個區域解析器可以改變用戶的區域。
4.FixedLocaleResolver
一直使用固定的Local, 改變Local 是不支持的 。
5.修改用戶的區域
除了顯式調用LocaleResolver.setLocale()來修改用戶的區域以外,還能夠將LocaleChangeInterceptor攔截器應用處處理程序映射中,它會發現當前HTTP請求中出現的特殊參數。其中的參數名稱能夠經過攔截器的paramName屬性進行自定義。若是這種參數出如今當前請求中,攔截器就會根據參數值來改變用戶的區域。
Xml代碼
<beans...>
...
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language"/>
</bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
...
<ref bean="localeChangeInterceptor"/>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.support
.ControllerClassNameHandlerMapping">
<property name="interceptors">
<list>
...
<ref bean="localeChangeInterceptor"/>
</list>
</property>
</bean>
<beans>
LocaleChangeInterceptor只能爲啓用了它的那些處理程序映射偵測參數。所以,若是web應用程序上下文中配置了不止一個處理程序映射,就必須在全部處理程序映射中註冊這個攔截器,以便能在任意URL中改變它們的區域設置。
如今,利用language參數,能夠經過任意URL修改用戶的區域。例如,下面兩個URL分別將用戶的區域語言改爲了美式
英語和德語。
Java代碼
http://localhost:8080/court/welcome.htm?language=en_US
http://localhost:8080/court/welcome.htm?language=de
6.使用Spring MVC時, controller如何獲得請求的 Local
DispatchServlet 會在 processRequest(HttpServletRequest request, HttpServletResponse response) 方法中設置LocaleContext, 把LocalContext 和當前線程關聯起來. 代碼以下:
LocaleContextHolder.setLocaleContext (buildLocaleContext(request), this. threadContextInheritable );
DispatchServlet 中buildLocalContext代碼以下:
protected LocaleContext buildLocaleContext( final HttpServletRequest request) {
return new LocaleContext() {
public Locale getLocale() {
return localeResolver .resolveLocale(request);
}
@Override
public String toString() {
return getLocale().toString();
}
};
}
這裏的Local經過localResolver 解析獲得, localResolver 便是從Spring 配置文件配置的localResolver, 默認是"AcceptHeaderLocaleResolver".
若是你想要在 controller 中獲得當前請求的Local, 代碼能夠以下寫:
Locale locale = LocaleContextHolder.getLocale();
或者你能夠用Spring 中的RequestContextUtils 類方法getLocal獲得 request 中保存的localResolver, 並用localResolver 解析獲得Local. 代碼以下:
public static Locale getLocale (HttpServletRequest request) {
LocaleResolver localeResolver = getLocaleResolver (request);
if (localeResolver != null ) {
return localeResolver.resolveLocale(request);
}
else {
return request.getLocale();
}
}
localResolver 會在DispatcherServlet的doService 方法中,將localResolver保存到request 屬性中 代碼以下:
request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
---------------------
做者:rj042
來源:CSDN
原文:https://blog.csdn.net/rj042/article/details/23354225
版權聲明:本文爲博主原創文章,轉載請附上博文連接!
@ https://blog.csdn.net/qq924862077/article/details/52878507