springMVC源碼分析--國際化實現Session和Cookie(二)

上一篇博客 springMVC源碼分析--國際化LocaleResolver(一)中我們介紹了springMVC提供的國際化的解決方案,接下來我們根據springMVC提供的解決方案來簡單的實現一個多語言的支持。

一、基於Session的國際化實現

基於Session的國際化實現其實說來也簡單,就是在Session中保存語言信息Locale,這樣springMVC會從我們提供的多語言配置文件中讀取相關語言的信息。

(1)首先我們需要配置springMVC的多語言配置,因爲我們打算使用Session來實現,所有對於localeResolver我們要配置其實現類SessionLocaleResolver,在springMVC的配置文件中添加如下配置:

[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:14px;"><bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/></span>  

(2)這裏我們提供了一個多語言攔截器LanguageInterceptor,通過這個攔截器設置多語言信息,其實主要的代碼就是request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale),這樣springMVC會根據Locale的信息來獲得多語言。

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:14px;"public class LanguageInterceptor implements HandlerInterceptor{  
  2.   
  3.     @Override  
  4.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  
  5.             throws Exception {  
  6.         String language = request.getParameter("language");  
  7.         if (language != null&&language.equals("zh")) {  
  8.             Locale locale = new Locale("zh""CN");  
  9.             request.getSession()  
  10.                     .setAttribute(  
  11.                             SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,  
  12.                             locale);  
  13.             request.setAttribute("language", language);  
  14.         } else if (language != null&&language.equals("en")) {  
  15.             Locale locale = new Locale("en""US");  
  16.             request.getSession()  
  17.                     .setAttribute(  
  18.                             SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,  
  19.                             locale);  
  20.             request.setAttribute("language", language);  
  21.         } else {  
  22.             request.getSession().setAttribute(  
  23.                     SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,  
  24.                     LocaleContextHolder.getLocale());  
  25.             language = LocaleContextHolder.getLocale().getLanguage();  
  26.             request.setAttribute("language", language);  
  27.         }  
  28.         return true;  
  29.     }  
  30.     @Override  
  31.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,  
  32.             ModelAndView modelAndView) throws Exception {  
  33.     }  
  34.     @Override  
  35.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
  36.             throws Exception {  
  37.     }  
  38.   
  39. }</span>  

在springMVC的配置文件中配置攔截器

[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:14px;"><mvc:interceptors>  
  2.     <!-- 國際化操作攔截器 如果採用基於(請求/Session/Cookie)則必需配置 -->  
  3.     <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>  
  4.     <bean class="com.tianjunwei.interceptor.LanguageInterceptor"></bean>  
  5. </mvc:interceptors></span>  
在工程中添加多語言配置文件,在src/main/resources目錄下新建messages目錄,分別添加中英文的多語言配置文件message_en_US.properties和message_zh_CN.properties,文件中以key = value的形式保存多語言信息



運行結果圖:



二、基於Cookie的國際化實現

與上面類似,我們首先創建一個攔截器用來將多語言信息寫到Cookie中,這樣就可以通過cookie來切換多語言了。

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:14px;"public class LanguageCookieInterceptor implements HandlerInterceptor{  
  2.   
  3.     @Override  
  4.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  
  5.             throws Exception {  
  6.         String language = request.getParameter("language");  
  7.         if (language != null&&language.equals("zh")) {  
  8.             Locale locale = new Locale("zh""CN");  
  9.             (new CookieLocaleResolver()).setLocale (request, response, locale);  
  10.             request.setAttribute("language", language);  
  11.         } else if (language != null&&language.equals("en")) {  
  12.             Locale locale = new Locale("en""US");  
  13.             (new CookieLocaleResolver()).setLocale (request, response, locale);  
  14.             request.setAttribute("language", language);  
  15.         } else {  
  16.             (new CookieLocaleResolver()).setLocale (request, response,  
  17.                     LocaleContextHolder.getLocale());  
  18.             language = LocaleContextHolder.getLocale().getLanguage();  
  19.             request.setAttribute("language", language);  
  20.         }  
  21.         return true;  
  22.     }  
  23.   
  24.     @Override  
  25.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,  
  26.             ModelAndView modelAndView) throws Exception {  
  27.           
  28.     }  
  29.   
  30.     @Override  
  31.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
  32.             throws Exception {  
  33.           
  34.     }  
  35.   
  36. }</span>  
springMVC的配置文件如下:

[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:14px;"><mvc:interceptors>  
  2.     <!-- 國際化操作攔截器 如果採用基於(請求/Session/Cookie)則必需配置 -->  
  3.     <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>  
  4.     <!-- <bean class="com.tianjunwei.interceptor.LanguageInterceptor"></bean> -->  
  5.     <bean class="com.tianjunwei.interceptor.LanguageCookieInterceptor"></bean>  
  6. </mvc:interceptors>  
  7. <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/></span>  

這樣我們也可以實現通過Session實現的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章