详解SpringMVC学习系列之国际化
在系列(7)中我们讲了数据的格式化显示,spring在做格式化展示的时候已经做了国际化处理,那么如何将我们网站的其它内容(如菜单、标题等)做国际化处理呢?这就是本篇要将的内容—>国际化。
一.基于浏览器请求的国际化实现:
首先配置我们项目的springservlet-config.xml文件添加的内容如下:
<bean id="messagesource" class="org.springframework.context.support.resourcebundlemessagesource"> <!-- 国际化信息所在的文件名 --> <property name="basename" value="messages" /> <!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 --> <property name="usecodeasdefaultmessage" value="true" /> </bean>
在com.demo.web.controllers包中添加globalcontroller.java内容如下:
package com.demo.web.controllers; import java.util.date; import javax.servlet.http.httpservletrequest; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.servlet.support.requestcontext; import com.demo.web.models.formatmodel; @controller @requestmapping(value = "/global") public class globalcontroller { @requestmapping(value="/test", method = {requestmethod.get}) public string test(httpservletrequest request,model model){ if(!model.containsattribute("contentmodel")){ //从后台代码获取国际化信息 requestcontext requestcontext = new requestcontext(request); model.addattribute("money", requestcontext.getmessage("money")); model.addattribute("date", requestcontext.getmessage("date")); formatmodel formatmodel=new formatmodel(); formatmodel.setmoney(12345.678); formatmodel.setdate(new date()); model.addattribute("contentmodel", formatmodel); } return "globaltest"; } }
这里展示模型还用系列(7)中的作为演示。
在项目中的源文件夹resources中添加messages.properties、messages_zh_cn.properties、messages_en_us.properties三个文件,其中messages.properties、messages_zh_cn.properties里面的"money", "date",为中文,messages_en_us.properties里面的为英文。
在views文件夹中添加globaltest.jsp视图,内容如下:
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd"> <%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>insert title here</title> </head> <body> 下面展示的是后台获取的国际化信息:<br/> ${money}<br/> ${date}<br/> 下面展示的是视图中直接绑定的国际化信息:<br/> <spring:message code="money"/>:<br/> <spring:eval expression="contentmodel.money"></spring:eval><br/> <spring:message code="date"/>:<br/> <spring:eval expression="contentmodel.date"></spring:eval><br/> </body> </html>
运行测试:
更改浏览器语言顺序,刷新页面:
二.基于session的国际化实现:
在项目的springservlet-config.xml文件添加的内容如下(第一种时添加的内容要保留):
<mvc:interceptors> <!-- 国际化操作拦截器 如果采用基于(请求/session/cookie)则必需配置 --> <bean class="org.springframework.web.servlet.i18n.localechangeinterceptor" /> </mvc:interceptors> <bean id="localeresolver" class="org.springframework.web.servlet.i18n.sessionlocaleresolver" />
更改globaltest.jsp视图为如下内容:
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd"> <%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>insert title here</title> </head> <body> <a href="test?langtype=zh" rel="external nofollow" >中文</a> | <a href="test?langtype=en" rel="external nofollow" >英文</a><br/> 下面展示的是后台获取的国际化信息:<br/> ${money}<br/> ${date}<br/> 下面展示的是视图中直接绑定的国际化信息:<br/> <spring:message code="money"/>:<br/> <spring:eval expression="contentmodel.money"></spring:eval><br/> <spring:message code="date"/>:<br/> <spring:eval expression="contentmodel.date"></spring:eval><br/> </body> </html>
更改globalcontroller.java为如下内容:
package com.demo.web.controllers; import java.util.date; import java.util.locale; import javax.servlet.http.httpservletrequest; import org.springframework.context.i18n.localecontextholder; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.requestparam; import org.springframework.web.servlet.i18n.sessionlocaleresolver; import org.springframework.web.servlet.support.requestcontext; import com.demo.web.models.formatmodel; @controller @requestmapping(value = "/global") public class globalcontroller { @requestmapping(value="/test", method = {requestmethod.get}) public string test(httpservletrequest request,model model, @requestparam(value="langtype", defaultvalue="zh") string langtype){ if(!model.containsattribute("contentmodel")){ 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); model.addattribute("money", requestcontext.getmessage("money")); model.addattribute("date", requestcontext.getmessage("date")); formatmodel formatmodel=new formatmodel(); formatmodel.setmoney(12345.678); formatmodel.setdate(new date()); model.addattribute("contentmodel", formatmodel); } return "globaltest"; } }
运行测试:
三.基于cookie的国际化实现:
把实现第二种方法时在项目的springservlet-config.xml文件中添加的
<bean id="localeresolver" class="org.springframework.web.servlet.i18n.sessionlocaleresolver" />
注释掉,并添加以下内容:
<bean id="localeresolver" class="org.springframework.web.servlet.i18n.cookielocaleresolver" />
更改globalcontroller.java为如下内容:
package com.demo.web.controllers; import java.util.date; import java.util.locale; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.springframework.context.i18n.localecontextholder; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.requestparam; import org.springframework.web.servlet.i18n.cookielocaleresolver; //import org.springframework.web.servlet.i18n.sessionlocaleresolver; import org.springframework.web.servlet.support.requestcontext; import com.demo.web.models.formatmodel; @controller @requestmapping(value = "/global") public class globalcontroller { @requestmapping(value="/test", method = {requestmethod.get}) public string test(httpservletrequest request, httpservletresponse response, model model, @requestparam(value="langtype", defaultvalue="zh") string langtype){ if(!model.containsattribute("contentmodel")){ /*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());*/ if(langtype.equals("zh")){ locale locale = new locale("zh", "cn"); //request.getsession().setattribute(sessionlocaleresolver.locale_session_attribute_name,locale); (new cookielocaleresolver()).setlocale (request, response, locale); } else if(langtype.equals("en")){ locale locale = new locale("en", "us"); //request.getsession().setattribute(sessionlocaleresolver.locale_session_attribute_name,locale); (new cookielocaleresolver()).setlocale (request, response, locale); } else //request.getsession().setattribute(sessionlocaleresolver.locale_session_attribute_name,localecontextholder.getlocale()); (new cookielocaleresolver()).setlocale (request, response, localecontextholder.getlocale()); //从后台代码获取国际化信息 requestcontext requestcontext = new requestcontext(request); model.addattribute("money", requestcontext.getmessage("money")); model.addattribute("date", requestcontext.getmessage("date")); formatmodel formatmodel=new formatmodel(); formatmodel.setmoney(12345.678); formatmodel.setdate(new date()); model.addattribute("contentmodel", formatmodel); } return "globaltest"; } }
运行测试:
关于<bean id="localeresolver" class="org.springframework.web.servlet.i18n.cookielocaleresolver" />3个属性的说明(可以都不设置而用其默认值):
<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>
四.基于url请求的国际化的实现:
首先添加一个类,内容如下:
import java.util.locale; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.springframework.web.servlet.dispatcherservlet; import org.springframework.web.servlet.localeresolver; public class myacceptheaderlocaleresolver extends acceptheaderlocaleresolver { private locale mylocal; public locale resolvelocale(httpservletrequest request) { return mylocal; } public void setlocale(httpservletrequest request, httpservletresponse response, locale locale) { mylocal = locale; } }
然后把实现第二种方法时在项目的springservlet-config.xml文件中添加的
<bean id="localeresolver" class="org.springframework.web.servlet.i18n.sessionlocaleresolver" />
注释掉,并添加以下内容:
<bean id="localeresolver" class="xx.xxx.xxx.myacceptheaderlocaleresolver"/>
“xx.xxx.xxx”是刚才添加的myacceptheaderlocaleresolver 类所在的包名。
保存之后就可以在请求的url后附上 locale=zh_cn 或 locale=en_us 如 http://xxxxxxxx?locale=zh_cn 来改变语言了,具体这里不再做演示了。
国际化部分的内容到此结束。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: vue 对象添加或删除成员时无法实时更新的解决方法
下一篇: C#泛型类创建与使用的方法