上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式。我的场景是这样的:
访问一个页面时,这个页面有个表格,对表头中的列名实现国际化。
第一步:完成国际化配置
主要是配置用来定位资源文件的消息源和用来解析国际化的国际化解析器,都要配置在Spring的配置文件中
1 <!--Spring MVC实现国际化 --> 2 <!-- 第一步:配置消息源MessageSource用来加载对应的国际化属性文件:bean的ID名称只能是messageSource --> 3 <!--第一种方式:配置ResourceBundleMessageSource:这种方式只能把资源文件放到指定的路径下,不能热加载,需要重启系统才能加载它 --> 4 <!-- <bean id="messageResource" 5 class="org.springframework.context.support.ResourceBundleMessageSource"> 6 <property name="defaultEncoding" value="UTF-8" /> 7 <property name="basename" value="msg" /> 8 </bean> --> 9 10 <!--第二种方式:配置ReloadableResourceBundleMessageSource:这种方式只能把资源文件放到任何位置,不需要重启就能加载文件,并且可以设置刷新时间 --> 11 <bean id="messageSource" 12 class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 13 <!-- 默认编码方式 --> 14 <property name="defaultEncoding" value="UTF-8" /> 15 <!-- 资源文件的前缀:多了一个classpath,如果资源文件在一个文件夹下,还要加上文件夹路径,否则报错 --> 16 <property name="basename" value="classpath:message/msg" /> 17 <!-- 刷新时间 --> 18 <property name="cacheSeconds" value="3600" /> 19 </bean> 20 21 <!-- 第二步:配置国际化解析器,有cookie和session两种方式,一般用session比较保险 --> 22 <!--第一种:配置cookie国际化解析器 --> 23 <!-- <bean id="localeResolver" 24 class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> 25 cookie变量的名称 26 <property name="cookieName" value="lang" /> 27 cookie超时时间 28 <property name="cookieMaxAge" value="20" /> 29 默认使用简体中文 30 <property name="defaultLocale" value="zh_CN" /> 31 </bean> --> 32 33 <!--第一种:配置session国际化解析器 --> 34 <bean id="localResolver" 35 class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> 36 因为session有其自身定义的超时时间和编码,所以此处不需要设置 37 <property name="defaultLocale" value="zh_CN" /> 38 </bean>
上面代码中,我配置了两种消息源和两种国际化解析器,其中注释掉的是不会热加载的消息源和cookie国际化解析器,因为它们都有一些缺陷,上一篇中已经介绍过。
第二步:配置拦截器
拦截器是在Spring MVC的配置文件中配置:
1 <!-- 配置国际化拦截器 --> 2 <mvc:interceptors> 3 <mvc:interceptor> 4 <mvc:mapping path="/**" /> 5 <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 6 <property name="paramName" value="language" /> 7 </bean> 8 </mvc:interceptor> 9 </mvc:interceptors>
第三步:创建资源文件
我将这两个文件都放在src/main/resource下的message文件夹下,所以上面配置消息源时basename的值为classpath:message/msg,这一点需要注意。
1⃣️中文资源文件msg_zh_CN.properties
1 welcome=u4F60u597D u4E16u754CuFF01 2 3 param_param_id=u53C2u6570ID 4 param_param_name=u53C2u6570u540Du79F0 5 param_param_desc=u53C2u6570u63CFu8FF0 6 param_param_time=u5165u5E93u65F6u95F4
中文使用的是unicode编码,这个不需要管,显示时不会乱码。
2⃣️英文资源文件msg_en_US.properties
1 welcome=hello world! 2 param_param_id=Param ID 3 param_param_name=Param Name 4 param_param_desc=Param Describer 5 param_param_time=Save Time
第四步:创建页面
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 4 <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> 5 <%@ taglib prefix="mvc" uri="http://www.springframework.org/tags/form"%> 6 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 7 <html> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <% 11 String root = request.getContextPath(); 12 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() 13 + root + "/"; 14 %> 15 <script type="text/javascript" 16 src="<%=basePath%>jslib/jquery-1.8.3.min.js"></script> 17 <script type="text/javascript" src="<%=basePath%>jslib/jquery.form.js"></script> 18 <script type="text/javascript" src="<%=basePath%>js/param.js"></script> 19 <link href="<%=basePath%>css/param.css" type="text/css" rel="stylesheet"> 20 <title>参数列表</title> 21 </head> 22 <body> 23 <div> 24 <table> 25 <thead> 26 <tr> 27 <td><spring:message code="param_param_id" /></td> 28 <td><spring:message code="param_param_name" /></td> 29 <td><spring:message code="param_param_desc" /></td> 30 <td><spring:message code="param_param_time" /></td> 31 </tr> 32 </thead> 33 <tbody> 34 <c:forEach var="paramItem" items="${paramList }"> 35 <tr> 36 <td>${paramItem.paramId}</td> 37 <td>${paramItem.paramName }</td> 38 <td>${paramItem.paramDesc }</td> 39 <td>${paramItem.pramTime }</td> 40 </tr> 41 </c:forEach> 42 </tbody> 43 </table> 44 </div> 45 </body> 46 </html>
上面代码中加粗的红色部分是重点内容:
- 首先要导入spring标签库,因为jsp使用的是spring mvc国际化;
- 使用<spring:message>标签获取国际化文件中的值;
第五步:创建控制器
1 /* 2 * 测试Spring MVC中传递参数的方式 3 */ 4 5 @Controller 6 @RequestMapping("/param") 7 public class ParamController { 8 9 @Autowired 10 @Qualifier("paramService") 11 ParamService paramService = null; 12 13 @RequestMapping(value = "index", method = RequestMethod.GET) 14 public ModelAndView getParam() { 15 ModelAndView mView = new ModelAndView(); 16 List<Param> paramList = paramService.getAllParams(); 17 mView.addObject("paramList", paramList); 18 mView.setViewName("param/indexParam"); 19 return mView; 20 } 21 }
控制器中主要就是获取列表并渲染到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,并定义为英文,结果如下:
表格表头的列名变成英文,说明国际化成功。
以上就是完整的实例。