Spring MVC国际化
1)基于浏览器请求的国际化实现:
在配置文件applicationContext.xml中添加的内容如下:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="classpath:messages" />
<!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
当一个请求到达,DispatcherServlet就会寻找LocaleResolver,如果找到就会试图通过他进行本地化。通过RequestContext.getLocale()方法我们可以得到locale resolver解释的本地化语言
Locale resolver和拦截器定义在org.springframework.web.servlet.i18n包中,并且可以在applicationContext中进行配置。
然后写一个Controller
@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";
}
}
这里还需要添加配置文件
messages.properties、messages_zh_CN.properties、messages_en_US.properties三个文件
添加一个视图
<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>
2)基于Session的国际化实现
之前在applicationContext.xml中配置的要留下,即:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="classpath:messages" />
<!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
<mvc:interceptors>
<!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
视图层这里采用可选,中文和英文
<body>
<a href="test?langType=zh">中文</a> | <a href="test?langType=en">英文</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>
在Controller中加入一个判断
public String test(HttpServletRequest request,Model model, @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());
。。。。。
}
**关于Locale的一些讲解
public final class Locale extends Object 其中Locale对象表示了特定的地理、政治和文化地区
字段摘要:
Locale.CANADA 表示中国常量
Locale.US 表示美国常量
Locale.JAPAN 表示日本常量
。。。
三个构造方法
1)Locale(String language) 根据语言代码构造一个语言环境
2)Locale(String language,String country) 根据语言和国家构造一个语言环境
3)Locale(String language,String country,String variant)根据语言、国家和变量构造一个语言环境
3)基于Cookie的国际化实现
将Session在applicationContext.xml中配置的注释掉,换成
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
修改Controller
@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");
(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);
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>
4)基于URL请求的国际化
添加一个类
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;
}
}
将上面配置的localeResolver注释掉,换成
<bean id="localeResolver" class="xx.xxx.xxx.MyAcceptHeaderLocaleResolver"/>
此时可以在请求后附上locale=zh_CN
1)基于浏览器请求的国际化实现:
在配置文件applicationContext.xml中添加的内容如下:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="classpath:messages" />
<!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
当一个请求到达,DispatcherServlet就会寻找LocaleResolver,如果找到就会试图通过他进行本地化。通过RequestContext.getLocale()方法我们可以得到locale resolver解释的本地化语言
Locale resolver和拦截器定义在org.springframework.web.servlet.i18n包中,并且可以在applicationContext中进行配置。
然后写一个Controller
@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";
}
}
这里还需要添加配置文件
messages.properties、messages_zh_CN.properties、messages_en_US.properties三个文件
添加一个视图
<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>
2)基于Session的国际化实现
之前在applicationContext.xml中配置的要留下,即:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="classpath:messages" />
<!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
<mvc:interceptors>
<!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
视图层这里采用可选,中文和英文
<body>
<a href="test?langType=zh">中文</a> | <a href="test?langType=en">英文</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>
在Controller中加入一个判断
public String test(HttpServletRequest request,Model model, @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());
。。。。。
}
**关于Locale的一些讲解
public final class Locale extends Object 其中Locale对象表示了特定的地理、政治和文化地区
字段摘要:
Locale.CANADA 表示中国常量
Locale.US 表示美国常量
Locale.JAPAN 表示日本常量
。。。
三个构造方法
1)Locale(String language) 根据语言代码构造一个语言环境
2)Locale(String language,String country) 根据语言和国家构造一个语言环境
3)Locale(String language,String country,String variant)根据语言、国家和变量构造一个语言环境
3)基于Cookie的国际化实现
将Session在applicationContext.xml中配置的注释掉,换成
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
修改Controller
@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");
(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);
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>
4)基于URL请求的国际化
添加一个类
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;
}
}
将上面配置的localeResolver注释掉,换成
<bean id="localeResolver" class="xx.xxx.xxx.MyAcceptHeaderLocaleResolver"/>
此时可以在请求后附上locale=zh_CN