springMVC源码分析--国际化实现Session和Cookie(二)
上一篇博客springMVC源码分析--国际化LocaleResolver(一)中我们介绍了springMVC提供的国际化的解决方案,接下来我们根据springMVC提供的解决方案来简单的实现一个多语言的支持。
一、基于Session的国际化实现
基于Session的国际化实现其实说来也简单,就是在Session中保存语言信息Locale,这样springMVC会从我们提供的多语言配置文件中读取相关语言的信息。
(1)首先我们需要配置springMVC的多语言配置,因为我们打算使用Session来实现,所有对于localeResolver我们要配置其实现类SessionLocaleResolver,在springMVC的配置文件中添加如下配置:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
(2)这里我们提供了一个多语言拦截器LanguageInterceptor,通过这个拦截器设置多语言信息,其实主要的代码就是request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale),这样springMVC会根据Locale的信息来获得多语言。
public class LanguageInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String language = request.getParameter("language");
if (language != null&&language.equals("zh")) {
Locale locale = new Locale("zh", "CN");
request.getSession()
.setAttribute(
SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
locale);
request.setAttribute("language", language);
} else if (language != null&&language.equals("en")) {
Locale locale = new Locale("en", "US");
request.getSession()
.setAttribute(
SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
locale);
request.setAttribute("language", language);
} else {
request.getSession().setAttribute(
SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
LocaleContextHolder.getLocale());
language = LocaleContextHolder.getLocale().getLanguage();
request.setAttribute("language", language);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
在springMVC的配置文件中配置拦截器
<mvc:interceptors> <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/> <bean class="com.tianjunwei.interceptor.LanguageInterceptor"></bean> </mvc:interceptors>
在工程中添加多语言配置文件,在src/main/resources目录下新建messages目录,分别添加中英文的多语言配置文件message_en_US.properties和message_zh_CN.properties,文件中以key = value的形式保存多语言信息
运行结果图:
二、基于Cookie的国际化实现
与上面类似,我们首先创建一个拦截器用来将多语言信息写到Cookie中,这样就可以通过cookie来切换多语言了。
public class LanguageCookieInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String language = request.getParameter("language");
if (language != null&&language.equals("zh")) {
Locale locale = new Locale("zh", "CN");
(new CookieLocaleResolver()).setLocale (request, response, locale);
request.setAttribute("language", language);
} else if (language != null&&language.equals("en")) {
Locale locale = new Locale("en", "US");
(new CookieLocaleResolver()).setLocale (request, response, locale);
request.setAttribute("language", language);
} else {
(new CookieLocaleResolver()).setLocale (request, response,
LocaleContextHolder.getLocale());
language = LocaleContextHolder.getLocale().getLanguage();
request.setAttribute("language", language);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
springMVC的配置文件如下:
<mvc:interceptors> <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/> <!-- <bean class="com.tianjunwei.interceptor.LanguageInterceptor"></bean> --> <bean class="com.tianjunwei.interceptor.LanguageCookieInterceptor"></bean> </mvc:interceptors> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
这样我们也可以实现通过Session实现的效果。
springMVC源码分析--国际化实现Session和Cookie(二)的更多相关文章
- springMVC源码分析--视图AbstractView和InternalResourceView(二)
上一篇博客springMVC源码分析--视图View(一)中我们介绍了简单介绍了View的结构实现及运行流程,接下来我们介绍一下View的实现类做的处理操作. AbstractView实现了rende ...
- springMVC源码分析--HttpMessageConverter参数read操作(二)
上一篇博客springMVC源码分析--HttpMessageConverter数据转化(一)中我们简单介绍了一下HttpMessageConverter接口提供的几个方法,主要有以下几个方法: (1 ...
- springMVC源码分析--国际化LocaleResolver(一)
springMVC给我们提供了国际化支持,简单来说就是设置整个系统的运行语言,然后根据系统的运行语言来展示对应语言的页面,一般我们称之为多语言.springMVC国际化机制就是可以设置整个系统的运行语 ...
- springMVC源码分析--HandlerInterceptor拦截器(一)
对SpringMVC有所了解的人肯定接触过HandlerInterceptor拦截器,HandlerInterceptor接口给我们提供了3个方法: (1)preHandle: 在执行controll ...
- springMVC源码分析--页面跳转RedirectView(三)
之前两篇博客springMVC源码分析--视图View(一)和springMVC源码分析--视图AbstractView和InternalResourceView(二)中我们已经简单的介绍了View相 ...
- springMVC源码分析--DispatcherServlet请求获取及处理
在之前的博客springMVC源码分析--容器初始化(二)DispatcherServlet中我们介绍过DispatcherServlet,是在容器初始化过程中出现的,我们之前也说过Dispatche ...
- 8、SpringMVC源码分析(3):分析ModelAndView的形成过程
首先,我们还是从DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response) throw ...
- 7、SpringMVC源码分析(2):分析HandlerAdapter.handle方法,了解handler方法的调用细节以及@ModelAttribute注解
从上一篇 SpringMVC源码分析(1) 中我们了解到在DispatcherServlet.doDispatch方法中会通过 mv = ha.handle(processedRequest, res ...
- springMVC源码分析--动态样式ThemeResolver(二)
在上一篇博客springMVC源码分析--动态样式ThemeResolver(一)中我们介绍了多样式ThemeResolver的使用方法,接下来我们对源码进行简单的分析一下. ThemeResolve ...
随机推荐
- hdu 5446(中国剩余+lucas+按位乘)
题意:c( n, m)%M M = P1 * P2 * ......* Pk Lucas定理是用来求 c(n,m) mod p,p为素数的值.得出一个存余数数组,在结合中国剩余定理求值 其中有个 ...
- bzoj 4710: [Jsoi2011]分特产
Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望 ...
- 使用python+requests+unittest实现接口自动化测试
这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下. 一.整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用. Common:公共方法:主要放 ...
- ubuntu 16.04常见错误--Could not get lock /var/lib/dpkg/lock解决
我的博客 ubuntu常见错误--Could not get lock /var/lib/dpkg/lock解决 通过终端安装程序sudo apt-get install xxx时出错: E: Cou ...
- 在 telnet 中利用HTTP协议传递GET、POST参数
HTTP协议不仅可以用在浏览器中,还可以用在任何支持它的地方,平时用浏览器访问网站时HTTP协议内容是隐藏起来看不到的,用 telnet 就能揭开它的神秘面纱.telnet 开启方法参考文章末尾——t ...
- jquery 元素控制(追加元素/追加内容)介绍及应用
http://blog.csdn.net/gisredevelopment/article/details/41126533 一.在元素内部/外部追加元素 append,prepend:添加到子元素 ...
- mac下怎么删除隐藏文件比如 .Trashes文件
U盘和移动硬盘接入Mac时会产生.Trashes,.Spotlight-V100,.fseventsd等文件 每插入Mac一次,都会检查是否有这些文件,如果没有,就会创建这些文件 特别是有时候,在文件 ...
- sqlserver 按照特定值排序查询结果
select * from t_ss_student order by case when xm like '林%' then 1 else 2 end asc; 姓林的会排在前面
- js页面刷新跳转的几种方式及区别
跳转常用方法: window.location.href="index.php"; window.history.back(-1);//类似于按钮,参数是负几,就后退几次. win ...
- 我与android的缘分
android的开始 本人是一名大三的学生,大一大二主要学习的是php后台开发,在大一的时候做过一些小的网站系统,也参加过一些大学生计算机相关的比赛.这次开始着手于安卓开发,也是一时的兴起.因为跟我们 ...