Spring MVC之LocaleResolver(解析用戶區域)


 

為了讓web應用程序支持國際化,必須識別每個用戶的首選區域,並根據這個區域顯示內容。

在Spring MVC應用程序中,用戶的區域是通過區域解析器來識別的,它必須實現LocaleResolver接口。Spring MVC提供了幾個LocaleResolver實現,讓你可以按照不同的條件來解析區域。除此之外,你還可以實現這個接口,創建自己的區域解析器。

要定義一個區域解析器,只需在web應用程序上下文中注冊一個LocaleResolver類型的Bean就可以了。你必須將區域解析器的Bean名稱設置為localeResolver,這樣DispatcherServlet才能自動偵測到它。請注意,每DispatcherServlet只能注冊一個區域解析器。

 

 

1.按HTTP請求頭部解析區域

Spring采用的默認區域解析器是AcceptHeaderLocaleResolver。它通過檢驗HTTP請求的accept-language頭部來解析區域。這個頭部是由用戶的web瀏覽器根據底層操作系統的區域設置進行設定。請注意,這個區域解析器無法改變用戶的區域,因為它無法修改用戶操作系統的區域設置。

 

 

2.按會話屬性解析區域

解析區域的另一種方法是通過SessionLocaleResolver。它通過檢驗用戶會話中預置的屬性來解析區域。如果該會話屬性

不存在,它會根據accept-language HTTP頭部確定默認區域。

Xml代碼  
<bean id="localeResolver" class="org.springframewrok.web.servlet  
    .i18n.SessionLocaleResolver">  
    <property name="defaultLocale" value="en"/>  
</bean>  
如果會話屬性不存在,可以為這個解析器設置defaultLocale屬性。請注意,通過修改保存該區域的會話屬性,這個區域

解析器可以改變用戶的區域設置。

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM