一. SpringMVC 的国际化
关于国际化的重要性,这里就不说了。
可以与 Struts2的国际化进行比较性学习。 可以参考老蝴蝶以前写的Struts2 系列文章: Struts2实现国际化操作及中英文切换(九)
springmvc 实现国际化有两种方式:
1 . 在视图页面进行国际化, 需要使用 springmvc提供的标签库
2 . 在控制层实现国际化,需要使用 org.springframework.web.servlet.support.RequestContext 类 中的 getMessage() 方法。
springmvc 的国际化有三种表现形式
1 . 单个页面的国际化
2 . Session 域的国际化
3 . Cookie 域的国际化
其中, 单个页面的国际化 是读取页面的 浏览器 前端请求头的 accept-language 属性。 与浏览器的语言有关。
所使用的类是 : org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver,是默认的,也是最容易使用的,不需要设置。
Session 域的国际化, 所使用的类是: org.springframework.web.servlet.i18n.SessionLocaleResolver
Cookie 域的国际化,所使用的类是: org.springframework.web.servlet.i18n.CookieLocaleResolver
其中,Resolver 是解析器的意思。
先提供一下国际化的资源文件, 为login.properties(默认的), login_en_US.properties login_zh_CN.properties 文件。
放置在源文件夹 i18n 里面。
login.properties (默认是中文, I am china)
login.name=\u7528\u6237\u540D login.age=\u5E74\u9F84 login.description=\u63CF\u8FF0 login.submit=\u767B\u5F55 login.welcome=\u6B22\u8FCE{0}\u8BBF\u95EE
login_en_US.properites 美国的。
login.name=username login.age=age login.description=description login.submit=submit login.welcome=welcome to{0}
login_zh_CN.properties 中国的
login.name=\u7528\u6237\u540D login.age=\u5E74\u9F84 login.description=\u63CF\u8FF0 login.submit=\u767B\u5F55 login.welcome=\u6B22\u8FCE{0}\u8BBF\u95EE
放置目录为源文件下面。
二. AcceptHeaderLocaleResolver 实现国际化
二.一 创建 国际化资源文件
如上面的 三个资源文件。 文件名为 login
二.二 springmvc.xml 配置文件中,配置国际化ResourceBundleMessageSource 的Bean
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <value>login</value> <!-- 可依次写多个 <value>success</value>--> </property> </bean>
二.三 配置前端代码 login.jsp
1 .先引入 springmvc的标签库
<!-- 引入关于国际化的标签 --> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
2 . 前端页面 的标签显示 国际化
未国际化之间, 代码是这样:
<h2>两个蝴蝶飞,国际化的使用</h2> <form:form commandName="user" action="login.action" method="post"> <form:label path="name">姓名:</form:label> <form:input path="name"/><br/> <form:label path="age">年龄:</form:label> <form:input path="age"/><br/> <form:label path="description">描述:</form:label> <form:textarea path="description"/><br/> <form:button>提交</form:button> </form:form>
要国际化了,代码就变成了 这样:
<h2>两个蝴蝶飞,国际化的使用</h2> <!--这个标题,老蝴蝶就不国际化了--> <form:form commandName="user" action="login.action" method="post"> <form:label path="name"><spring:message code="login.name"></spring:message>:</form:label> <form:input path="name"/><br/> <form:label path="age"><spring:message code="login.age"></spring:message>:</form:label> <form:input path="age"/><br/> <form:label path="description"><spring:message code="login.description"></spring:message>:</form:label> <form:textarea path="description"/><br/> <form:button><spring:message code="login.submit"></spring:message></form:button> </form:form>
用了springmvc 标签的 spring:message 标签 里面的 code 属性。
spring:message 里面的常用属性有:
。
二.四 后端接收
//转到登录的页面 @RequestMapping(value="toLogin") public String toLogin(Model model){ model.addAttribute("user",new User()); return "user/login"; } //绑定到user对象。 @RequestMapping(value="login") public String login(@Validated User user,HttpServletRequest request,Model model){ System.out.println("接收值:"+user.toString()); RequestContext requestContext=new RequestContext(request); // getMessage 方法中的 key 是国际化 .properties 文件中的key String welcome=requestContext.getMessage("login.welcome"); System.out.println("输出名称值:"+welcome); //进行 MessageFormat进行填充 占位符 model.addAttribute("message",MessageFormat.format(welcome,user.getName())); model.addAttribute("user",user); return "user/list"; }
二.五 list.jsp 页面的展示
<body> <h4>前端展示后端的国际化,直接用 $ {} 从model中取出值</h4> ${message} <br> <h4>前端取出后端的值,用arguments 来接收参数</h4> <spring:message code="login.welcome" arguments="${requestScope.user.name}"></spring:message> </body>
注意,arguments 的用法。
二.六 重启服务器,进行测试
前端输入:
控制台打印:
数据展示:
二.七 切换浏览器语言,进行国际化验证
以Firebox 浏览器 为例。
右侧菜单栏, 选择选项, 在常规的选项卡里面,选择语言 为英语 美国, 如果没有该语言,可以先进行下载。 下载成功后,选择英语 美国,重启服务器。 然后输入访问路径,查看是否国际化了。
前台显示确实国际化了,并输入值:
控制台打印:
数据展示:
通过accept-language 属性进行国际化是正确的。
二.八 springmvc.xml 配置国际化 ResourceBundleMessageSource 的Bean 完全配置。
除了 二.二 的配置之外,还可以进行完全的配置。
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <value>login</value> <!-- 可依次写多个 <value>success</value>--> </property> </bean> <!-- 配置国际化的拦截器 --> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> </mvc:interceptors> <!-- 配置 AcceptHeaderLocaleResolver 国际化bean localeResolver 这个值不能改变--> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"></bean>