spring mvc 国际化的几种方案
spring mvc 国际化的几种方案
首先配置我们项目的service-servlet.xml文件添加的内容如下:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名,根据ResourceBundleMessageSource类加载资源文件.\src\main\resources\messages\messages_en_US.properties -->
<property name="basename" value="messages/messages" />
<!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
1. 一.基于浏览器请求的国际化实现:
使用Controller测试,
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public Result test(HttpServletRequest request){
public Result test(HttpServletRequest request,Model model){
//从后台代码获取国际化信息
RequestContext requestContext = new RequestContext(request);
String msg = requestContext.getMessage("msg");
return new Result(true, msg, "返回数据");
}
通过设置浏览器请求测试:http://localhost:8080/xxx/nation/test
- 注意: 上述基于浏览器设置,根据浏览器的本地来确定message
- 基于session的国际化
在项目中的源文件夹resources/messages中添加messages.properties、messages_zh_CN.properties、messages_en_US.properties三个文件,其中messages.properties、messages_zh_CN.properties里面添加msg="\u662F\u4E0D\u662F"为中文,messages_en_US.properties里面的为msg="ok"。
在项目的service-servlet.xml文件添加的内容如下,(之前ResourceBundleMessageSource的配置任然保留)
<mvc:interceptors>
<!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
使用controller测试
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public Result test(HttpServletRequest request, @RequestParam(value="langType", defaultValue="zh") String langType){
if(langType.equals("zh")){
Locale locale = new Locale("zh", "CN");
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
}
else if(langType.equals("en")){
Locale locale = new Locale("en", "US");
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
}else{
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());
}
//从后台代码获取国际化信息
RequestContext requestContext = new RequestContext(request);
String msg = requestContext.getMessage("msg");
return new Result(true, msg, "返回数据");
}
通过设置浏览器请求测试:http://localhost:8080/xxx/nation/test?langType=zh 或者 http://localhost:8080/xxx/nation/test?langType=en
- 基于cookie,与session类似
移除session国际化的设置
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
添加cookie设置
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<!-- 设置cookieName名称,可以根据名称通过js来修改设置,也可以像上面演示的那样修改设置,默认的名称为 类名+LOCALE(即:org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE-->
<property name="cookieName" value="lang"/>
<!-- 设置最大有效时间,如果是-1,则不存储,浏览器关闭后即失效,默认为Integer.MAX_INT-->
<property name="cookieMaxAge" value="100000" />
<!-- 设置cookie可见的地址,默认是“/”即对网站所有地址都是可见的,如果设为其它地址,则只有该地址或其后的地址才可见-->
<property name="cookiePath" value="/" />
</bean>
使用Controller测试
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public Result test(HttpServletRequest request, HttpServletResponse response,@RequestParam(value="langType", defaultValue="zh") String langType){
if(langType.equals("zh")){
Locale locale = new Locale("zh", "CN");
(new CookieLocaleResolver()).setLocale (request, response, locale);
}else if(langType.equals("en")){
Locale locale = new Locale("en", "US");
(new CookieLocaleResolver()).setLocale (request, response, locale);
}else
(new CookieLocaleResolver()).setLocale (request, response, LocaleContextHolder.getLocale());
//从后台代码获取国际化信息
RequestContext requestContext = new RequestContext(request);
String msg = requestContext.getMessage("msg");
return new Result(true, msg, "返回数据");
}
- 基于url国际化方式
配置如下,移除上述localeResolver的bean改为下面的:
<bean id="localeResolver" class="xx.xxx.xxx.UrlAcceptHeaderLocaleResolver"/>
UrlAcceptHeaderLocaleResolver为自定义实现,具体代码如下:
public class UrlAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver {
private Locale urlLocal;
public Locale resolveLocale(HttpServletRequest request) {
return urlLocal!=null?urlLocal:request.getLocale();
}
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
urlLocal = locale;
}
}
- 之后就可以在请求的URL后附上 locale=zh_CN 或 locale=en_US 如 http://xxxxxxxx?locale=zh_CN 来改变语言了
使用Controller测试,
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public Result test(HttpServletRequest request){
public Result test(HttpServletRequest request,Model model){
//从后台代码获取国际化信息
RequestContext requestContext = new RequestContext(request);
String msg = requestContext.getMessage("msg");
return new Result(true, msg, "返回数据");
}
5.总结下,以上几种其实都是基于
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="messages/messages" />
<!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
这里无非是读取messages目录下以messages开头的几种配置文件,借助MessageSource根据local读取相应的配置文件中的信息
Locale locale = new Locale("en", "US");
String message = msr.getMessage("msg",
new Object [] {"userDao"}, "Required", locale);
System.out.println(message);
所以其实控制local即选择相应的处理方式,而以上几种均是通过拦截器注入不同的local来实现,这里我们可以自己实现符合自己业务场景的实现方式
作者:勃列日涅夫
链接:https://www.jianshu.com/p/680fc53dc3cc
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
spring mvc 国际化的几种方案的更多相关文章
- Spring MVC(十六)--Spring MVC国际化实例
上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式.我的场景是这样的: 访问一个页面时,这个页面有个表格,对表头中的列名实现国际化. 第 ...
- spring mvc 国际化
spring mvc 国际化 使用CookieLocaleResolver实现国际化的步骤:1.注册 messageSource,localeResolver 两个bean2.调用localeReso ...
- Spring入门(十四):Spring MVC控制器的2种测试方法
作为一名研发人员,不管你愿不愿意对自己的代码进行测试,都得承认测试对于研发质量保证的重要性,这也就是为什么每个公司的技术部都需要质量控制部的原因,因为越早的发现代码的bug,成本越低,比如说,Dev环 ...
- Spring MVC国际化配置
Spring MVC国际化配置 前言 项目开发中要考虑支持国际化,框架选用的是Spring MVC框架,那么问题来了Spring MVC如何配置并实现国际化. 实现过程(Maven项目) 对于Spri ...
- spring MVC 拦截有几种实现方式
spring MVC 拦截有几种实现方式 实现HandelInterceptor接口方式 继承HandelInterceptor 的方式.一般有这两种方式 spring 如何走单元测式 ...
- Spring MVC国际化
本文基于Spring MVC 注解-让Spring跑起来.本文提到的国际化是Spring实现国际化的方案之一. (1) 在applicationContext.xml中添加以下配置信息: <!- ...
- spring mvc 参数传递的三种方式
springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- spring mvc和web-flow的整合方案
发现了一份整合spring MVC 和webflow的很好的资料,日后翻译出来发布.先记着. http://docs.spring.io/spring-webflow/docs/2.3.x/refer ...
- SpringBoot + Spring MVC国际化使用示例
项目中需要显示中英文两种语言,所以需要对显示的内容进行国际化,如下是一个示例程序. 程序文件结构,如下图,后面详细列出各文件的代码. 1. 编写maven的pom.xml文件,如下: <proj ...
随机推荐
- PHP nl_langinfo() 函数
定义和用法 nl_langinfo() 函数返回指定的本地信息. 注释:该函数无法在 Windows 平台上工作. 提示:与返回所有本地格式化信息的 localeconv() 函数不同,nl_lang ...
- Maven知识记录(一)初识Maven私服
Maven知识记录(一)初识Maven私服 什么是maven私服 私服即私有的仓库.maven把存放文件的地方叫做仓库,我们可以理解成我门家中的储物间.而maven把存放文件的具体位置叫做坐标.我们项 ...
- PV与UV你的网站也可以
个人博客网站分析 阅读前面的文章,有助于理解本文. 1.是时候来一个个人博客网站了 2.什么?你还没有自己的域名? 3.你的个人博客网站该上线了! 为什么需要流量分析? 各位小伙伴,请看下图,你们发现 ...
- 【NOIP2016】换教室 题解(期望DP)
前言:状态贼鸡儿多,眼睛快瞎了. ----------------------- 题目链接 题目大意:给定$n(课程数),m(可换次数),v(教室数),e(无向边数)$,同时给定原定教室$c[i]$和 ...
- 你不是说你会Aop吗?
一大早,小王就急匆匆的跑过来找我,说:周哥,那个记录日志的功能我想请教一下. 因为公司某个项目要跟别的平台做对接,我们这边需要给他们提供一套接口.昨天,我就将记录接口日志的工作安排给了小王. 下面是我 ...
- 关于bin文件写法及导入
正常的python项目,打开看到的应该是一个个文件包,不同的功能模块放在不同的包里面: 通常是bin目录下的bin.py是程序的入口,下面的bin.py如何导入main.py并执行呢:
- Python | 常见的反爬及解决方法,值得收藏
我们都知道Python用来爬数据,为了不让自家的数据被别人随意的爬走,你知道怎么反爬吗?今天播妞带着大家一起见识见识常见的反爬技术. 很多人学习python,不知道从何学起.很多人学习python,掌 ...
- LinuX操作系统基础------>软件的安装方式,chmod权限,vi编辑器的使用
RPM包管理 -rpm命令管理 RPM包管理 -yum在线管理 文件权限管理 vi编辑器的使用和常用的快捷键 1.RPM包管理: 一种用于互联网下载包的打包及安装工具,RPM包管理分为rpm命令管理和 ...
- js 事件对象相关笔记
事件对象 event就是一个事件对象 写到我们的监听函数的括号里面 当形参来看 事件对象只有有了事件才存在,他是系统给我们自动创建的 不需要我们传递参数 事件对象是我们事件的一 ...
- C#LeetCode刷题之#189-旋转数组(Rotate Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3700 访问. 给定一个数组,将数组中的元素向右移动 k 个位置, ...