上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式。我的场景是这样的:

访问一个页面时,这个页面有个表格,对表头中的列名实现国际化。

第一步:完成国际化配置

主要是配置用来定位资源文件的消息源和用来解析国际化的国际化解析器,都要配置在Spring的配置文件中

 <!--Spring MVC实现国际化 -->
<!-- 第一步:配置消息源MessageSource用来加载对应的国际化属性文件:bean的ID名称只能是messageSource -->
<!--第一种方式:配置ResourceBundleMessageSource:这种方式只能把资源文件放到指定的路径下,不能热加载,需要重启系统才能加载它 -->
<!-- <bean id="messageResource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="defaultEncoding" value="UTF-8" />
<property name="basename" value="msg" />
</bean> --> <!--第二种方式:配置ReloadableResourceBundleMessageSource:这种方式只能把资源文件放到任何位置,不需要重启就能加载文件,并且可以设置刷新时间 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 默认编码方式 -->
<property name="defaultEncoding" value="UTF-8" />
<!-- 资源文件的前缀:多了一个classpath,如果资源文件在一个文件夹下,还要加上文件夹路径,否则报错 -->
<property name="basename" value="classpath:message/msg" />
<!-- 刷新时间 -->
<property name="cacheSeconds" value="3600" />
</bean> <!-- 第二步:配置国际化解析器,有cookie和session两种方式,一般用session比较保险 -->
<!--第一种:配置cookie国际化解析器 -->
<!-- <bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
cookie变量的名称
<property name="cookieName" value="lang" />
cookie超时时间
<property name="cookieMaxAge" value="20" />
默认使用简体中文
<property name="defaultLocale" value="zh_CN" />
</bean> --> <!--第一种:配置session国际化解析器 -->
<bean id="localResolver"
class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
因为session有其自身定义的超时时间和编码,所以此处不需要设置
<property name="defaultLocale" value="zh_CN" />
</bean>

上面代码中,我配置了两种消息源和两种国际化解析器,其中注释掉的是不会热加载的消息源和cookie国际化解析器,因为它们都有一些缺陷,上一篇中已经介绍过。

第二步:配置拦截器

拦截器是在Spring MVC的配置文件中配置:

 <!-- 配置国际化拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language" />
</bean>
</mvc:interceptor>
</mvc:interceptors>

第三步:创建资源文件

我将这两个文件都放在src/main/resource下的message文件夹下,所以上面配置消息源时basename的值为classpath:message/msg,这一点需要注意。

1⃣️中文资源文件msg_zh_CN.properties

 welcome=\u4F60\u597D \u4E16\u754C\uFF01

 param_param_id=\u53C2\u6570ID
param_param_name=\u53C2\u6570\u540D\u79F0
param_param_desc=\u53C2\u6570\u63CF\u8FF0
param_param_time=\u5165\u5E93\u65F6\u95F4

中文使用的是unicode编码,这个不需要管,显示时不会乱码。

2⃣️英文资源文件msg_en_US.properties

 welcome=hello world!
param_param_id=Param ID
param_param_name=Param Name
param_param_desc=Param Describer
param_param_time=Save Time

 第四步:创建页面

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="mvc" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%
String root = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ root + "/";
%>
<script type="text/javascript"
src="<%=basePath%>jslib/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="<%=basePath%>jslib/jquery.form.js"></script>
<script type="text/javascript" src="<%=basePath%>js/param.js"></script>
<link href="<%=basePath%>css/param.css" type="text/css" rel="stylesheet">
<title>参数列表</title>
</head>
<body>
<div>
<table>
<thead>
<tr>
<td><spring:message code="param_param_id" /></td>
<td><spring:message code="param_param_name" /></td>
<td><spring:message code="param_param_desc" /></td>
<td><spring:message code="param_param_time" /></td>
</tr>
</thead>
<tbody>
<c:forEach var="paramItem" items="${paramList }">
<tr>
<td>${paramItem.paramId}</td>
<td>${paramItem.paramName }</td>
<td>${paramItem.paramDesc }</td>
<td>${paramItem.pramTime }</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</body>
</html>

上面代码中加粗的红色部分是重点内容:

  • 首先要导入spring标签库,因为jsp使用的是spring mvc国际化;
  • 使用<spring:message>标签获取国际化文件中的值;

第五步:创建控制器

 /*
* 测试Spring MVC中传递参数的方式
*/ @Controller
@RequestMapping("/param")
public class ParamController { @Autowired
@Qualifier("paramService")
ParamService paramService = null; @RequestMapping(value = "index", method = RequestMethod.GET)
public ModelAndView getParam() {
ModelAndView mView = new ModelAndView();
List<Param> paramList = paramService.getAllParams();
mView.addObject("paramList", paramList);
mView.setViewName("param/indexParam");
return mView;
}
}

控制器中主要就是获取列表并渲染到indexParam视图中,这样在页面就能获取到列表数据了,下面进行测试;

第六步:测试

在浏览器输入URL:http://127.0.0.1:8080/mvc/param/index,结果如下:

因为模式是简体中文,所以不需要输入language参数就能获取资源文件内容实现国际化,下面将URL改为这样

http://127.0.0.1:8080/mvc/param/index?language=en_US,即加上参数language,并定义为英文,结果如下:

表格表头的列名变成英文,说明国际化成功。

以上就是完整的实例。

Spring MVC(十六)--Spring MVC国际化实例的更多相关文章

  1. Spring学习(十六)----- Spring AOP实例(Pointcut(切点),Advisor)

    在上一个Spring AOP通知的例子,一个类的整个方法被自动拦截.但在大多数情况下,可能只需要一种方式来拦截一个或两个方法,这就是为什么引入'切入点'的原因.它允许你通过它的方法名来拦截方法.另外, ...

  2. spring学习 十六 spring加载属性文件

    第一步:创建一个properties文件,以数据库链接作为实例db.properties jdbc.url=jdbc:mysql://192.168.153.128:3306/mybaties?cha ...

  3. Spring Boot(十六):使用Jenkins部署Spring Boot

    Spring Boot(十六):使用Jenkins部署Spring Boot jenkins是devops神器,介绍如何安装和使用jenkins部署Spring Boot项目 jenkins搭建 部署 ...

  4. Spring(十六)之MVC框架

    MVC 框架教程 Spring web      MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活.松散耦合的 web 应用程序的组件.MVC 模式导致了应用程序的不同方面(输入逻辑.业 ...

  5. Spring学习十四----------Spring AOP实例

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  6. Spring Boot2 系列教程(二十六)Spring Boot 整合 Redis

    在 Redis 出现之前,我们的缓存框架各种各样,有了 Redis ,缓存方案基本上都统一了,关于 Redis,松哥之前有一个系列教程,尚不了解 Redis 的小伙伴可以参考这个教程: Redis 教 ...

  7. spring boot(十五)spring boot+thymeleaf+jpa增删改查示例

    快速上手 配置文件 pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 <dependency> <groupId>org.springframework.b ...

  8. spring cloud学习(六)Spring Cloud Config

    Spring Cloud Config 参考个人项目 参考个人项目 : (希望大家能给个star~) https://github.com/FunriLy/springcloud-study/tree ...

  9. (转)Spring Boot(十六):使用 Jenkins 部署 Spring Boot

    http://www.ityouknow.com/springboot/2017/11/11/spring-boot-jenkins.html enkins 是 Devops 神器,本篇文章介绍如何安 ...

随机推荐

  1. systemctl命令的使用及服务状态的查看

    二.systemctl命令 systemctl list-units            ##列出当前系统服务的状态 systemctl list-unit-files       ##列出服务的开 ...

  2. dubbo入门之异步调用

    dubbo默认使用同步的方式调用.但在有些特殊的场景下,我们可能希望异步调用dubbo接口,从而避免不必要的等待时间,这时候我们就需要用到异步.那么dubbo的异步是如何实现的呢?下面就来看看这个问题 ...

  3. 深入浅出的Object.defineProperty()

    vue的原理 观察者模式和订阅-发布者模式. Vue实例被创建时,会遍历data属性,并通过Object.defineProperty将 这些属性转化为getter/setter,并进行追踪依赖.每当 ...

  4. join加入线程

    join线程会抢先拿到cup来执行线程,然后其他的线程再来执行. 案例: public static void main(String args[]){ //创建线程对象 Thread myThrea ...

  5. Java——方法的重写(覆盖)

    2.2方法的重写(覆盖)(override,orverwrite) 2.2.1 什么时候方法要进行重写? 如果父类中的方法已经无法满足当前子类的业务需求,需要将父类中的方法进行重新写一遍.就是要改变父 ...

  6. Android客户端转换php服务端获取的时间戳的转换

    今天在用JSON获取后台的数据的时候,发现一个奇怪的现象就是返回来的时间戳都是1970年这样的,很是纠结,最后发现时php和Java中时间的格式不一样造成的,所以我们本地客户端要做一个转换: /** ...

  7. 秒懂机器学习---分类回归树CART

    秒懂机器学习---分类回归树CART 一.总结 一句话总结: 用决策树来模拟分类和预测,那些人还真是聪明:其实也还好吧,都精通的话想一想,混一混就好了 用决策树模拟分类和预测的过程:就是对集合进行归类 ...

  8. P2004 领地选择

    P2004 领地选择 题目描述 作为在虚拟世界里统帅千军万马的领袖,小Z认为天时.地利.人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小T来说是非常重要的. 首都被认为是一个占地C*C的正方形. ...

  9. 9.RabbitMQ Topic类型交换机

    RabbitMQ消息服务中Topic类型交换机根据通配符路由消息,*代表一个单词,#代表代表0或多个单词.   生产者 消费者   代码 Producer.java   package com.tes ...

  10. nginx中reuqest_uri与uri的区别说明

    reuqest_uri:即客户端发送来的原生请求URI,包括请求参数 uri:请求URI,不包括任何请求参数 举例说明: 1.比如客户端以 get 方式请求 /admin 页面,并且带 id 和 na ...