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
  1. 基于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

  1. 基于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, "返回数据");
}
  1. 基于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 国际化的几种方案的更多相关文章

  1. Spring MVC(十六)--Spring MVC国际化实例

    上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式.我的场景是这样的: 访问一个页面时,这个页面有个表格,对表头中的列名实现国际化. 第 ...

  2. spring mvc 国际化

    spring mvc 国际化 使用CookieLocaleResolver实现国际化的步骤:1.注册 messageSource,localeResolver 两个bean2.调用localeReso ...

  3. Spring入门(十四):Spring MVC控制器的2种测试方法

    作为一名研发人员,不管你愿不愿意对自己的代码进行测试,都得承认测试对于研发质量保证的重要性,这也就是为什么每个公司的技术部都需要质量控制部的原因,因为越早的发现代码的bug,成本越低,比如说,Dev环 ...

  4. Spring MVC国际化配置

    Spring MVC国际化配置 前言 项目开发中要考虑支持国际化,框架选用的是Spring MVC框架,那么问题来了Spring MVC如何配置并实现国际化. 实现过程(Maven项目) 对于Spri ...

  5. spring MVC 拦截有几种实现方式

    spring MVC 拦截有几种实现方式 实现HandelInterceptor接口方式        继承HandelInterceptor 的方式.一般有这两种方式 spring 如何走单元测式 ...

  6. Spring MVC国际化

    本文基于Spring MVC 注解-让Spring跑起来.本文提到的国际化是Spring实现国际化的方案之一. (1) 在applicationContext.xml中添加以下配置信息: <!- ...

  7. spring mvc 参数传递的三种方式

    springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  8. spring mvc和web-flow的整合方案

    发现了一份整合spring MVC 和webflow的很好的资料,日后翻译出来发布.先记着. http://docs.spring.io/spring-webflow/docs/2.3.x/refer ...

  9. SpringBoot + Spring MVC国际化使用示例

    项目中需要显示中英文两种语言,所以需要对显示的内容进行国际化,如下是一个示例程序. 程序文件结构,如下图,后面详细列出各文件的代码. 1. 编写maven的pom.xml文件,如下: <proj ...

随机推荐

  1. PHP timezone_name_get() 函数

    ------------恢复内容开始------------ 实例 返回时区的名称: <?php$tz=timezone_open("Europe/Paris");echo ...

  2. php getimagesize 函数 - 获取图像信息

    getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息. 语法格式:高佣联盟 www.cgewang.co ...

  3. PHP vsprintf() 函数

    实例 把格式化字符串写入变量中: <?php高佣联盟 www.cgewang.com$number = 9;$str = "Beijing";$txt = vsprintf( ...

  4. C/C++编程笔记:C++入门知识丨继承和派生

    本篇要学习的内容和知识结构概览 继承和派生的概念 派生 通过特殊化已有的类来建立新类的过程, 叫做”类的派生”, 原有的类叫做”基类”, 新建立的类叫做”派生类”. 从类的成员角度看, 派生类自动地将 ...

  5. IDEA、maven创建webapp项目

      maven官方入门指南:http://maven.apache.org/guides/getting-started/index.html 推荐跟着官方文档学习噢~   IDEA.maven创建w ...

  6. swagger2打开doc页面时报错

    <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2& ...

  7. C++ 中可调用的且有函数功能的东东

    第一个:函数     其实函数在声明的时候都有个名字: 这个名字可以看作是是指针,将其直接赋值给函数指针 也可以看作是可取指的对其& 再赋值给函数指针 第二个:函数指针   通过其被赋值的方式 ...

  8. PCL使用RANSAC拟合三位平面

    1.使用PCL工具 //创建一个模型参数对象,用于记录结果 pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); ...

  9. Spring Boot上传文件(带进度条)

    Spring Boot 上传文件(带进度条)# 配置文件 spring: freemarker: template-loader-path: classpath:/static/ ##Spring B ...

  10. cryptopp使用Qt mingw编译,以及海思平台交叉编译

    编译工程生成,使用qmake生成qt工程文件(海思平台时,要用海思平台的qmake),将 TEMPLATE = app 修改为: TEMPLATE = lib 添加如下: win32:LIBS += ...