SpringMVC国际化
程序员文章站
2022-05-24 14:38:18
...
Spring MVC国际化是建立在Java国际化的基础之上的,也是通过提供不同国家语言环境的消息资源,然后通过java.util.ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的内容。
SpringMVC国际化执行步骤:
- 给系统加载国际化资源文件
- 输出国际化(两种方式)
方式二:在Controller中输出国际化信息,使用org.springframework.web.servlet.support.RequestContext的getMessage()方法获取
在Spring MVC中选择语言区域,可以使用提供的语言区域解析器。语言解析器接口:org.springframework.web.servlet.LocaleResolver,该接口实现类在org.springframework.web.servlet.i18n包下,主要包括:
- AcceptHeaderLocaleResolver:默认的语言解析器,Spring MVC读取浏览器accept-language属性确定使用语言区域
- SessionLocaleResolver:Spring MVC从HttpSession中获取用户设置的语言区域,需要显示配置
- CookieLocaleResolver:Spring MVC从Cookie中获取用户设置的语言区域,需要显示配置
一.基于浏览器国际化
默认使用org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver解析器,可以不配置
1.springmvc配置文件
如果只有一个属性文件,则使用下面两种配置都可以:
- <property name="basename" value="message"/>:basename是普通成员变量
- <property name="basenames" value="message"/>:basenames是可变参数
如果需要使用多个属性文件,则使用:
<property name="basenames">
<list>
<value>message1</value>
<list>
<value>message1</value>
<value>message2</value>
</list>
</property>
</list>
</property>
配置如下:
<!-- 国际化资源 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="message"/>
</bean>
2.资源文件
配置文件中basename的值为message,所以国际化资源文件都需要以message_开头,如message_zh_CN.properties;资源文件需要放在src目录下
(1).message_en_US.properties
title=Title
loginname=LoginName
password=Password
title=标题
loginname=登录名
password=密码
3.页面
使用spring标签库,使用<spring:message code="xxx">输出国际化信息;也可以在程序中使用RequestContext的getMessage()方式获取
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<!-- 代码方式 -->
${title }
${loginname }
${password }
<!-- 标签方式 -->
<table>
<caption><spring:message code="title"/></caption>
<tr>
<th><spring:message code="loginname"/></th>
<td><input type="text" name="loginname"></td>
</tr>
<tr>
<th><spring:message code="password"/></th>
<td><input type="password" name="password"></td>
</tr>
</table>
4.Controller
@RequestMapping(value = "/page/login", method = RequestMethod.GET)
public String login(HttpServletRequest request, Model model) throws Exception {
// 从后台代码获取国际化信息
RequestContext requestContext = new RequestContext(request);
model.addAttribute("title", requestContext.getMessage("title"));
model.addAttribute("loginname", requestContext.getMessage("loginname"));
model.addAttribute("password", requestContext.getMessage("password"));
return "login";
}
5.测试
设置浏览器的语言,访问登录页面就可以根据语言显示国际化资源文件中配置的信息;页面就不贴出来啦,自行测试一下就好。二.基于Session的国际化
SessionLocaleResolver不是默认的语言区域解析器,需要进行配置。
1.springmvc配置文件
<!-- 国际化资源 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="message"/>
</bean>
<!-- SessionLocaleResolver配置 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
<mvc:interceptors>
<!-- 国际化操作拦截器,基于(Session、Cookie)必须配置 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
2.页面
传递requestLocale=zh_CN参数,后台取到参数后做判断,设置java.util.Locale信息
<div>
<a href="/springmvc/global/page/login2.do?requestLocale=zh_CN">中文</a> |
<a href="/springmvc/global/page/login2.do?requestLocale=en_US">英文</a>
</div>
<!-- 代码方式 -->
${title }
${loginname }
${password }
<!-- 标签方式 -->
<table>
<caption><spring:message code="title"/></caption>
<tr>
<th><spring:message code="loginname"/></th>
<td><input type="text" name="loginname"></td>
</tr>
<tr>
<th><spring:message code="password"/></th>
<td><input type="password" name="password"></td>
</tr>
</table>
3.Controller
@RequestMapping(value = "/page/login2", method = RequestMethod.GET)
public String login2(HttpServletRequest request, Model model, @RequestParam String requestLocale) throws Exception {
if (requestLocale.equals("zh_CN")) {
Locale locale = new Locale(Locale.SIMPLIFIED_CHINESE.getLanguage(), Locale.SIMPLIFIED_CHINESE.getCountry());
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);
} else if (requestLocale.equals("en_US")) {
Locale locale = new Locale(Locale.US.getLanguage(), Locale.US.getCountry());
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("title", requestContext.getMessage("title"));
model.addAttribute("loginname", requestContext.getMessage("loginname"));
model.addAttribute("password", requestContext.getMessage("password"));
return "ilogin2";
}
4.资源文件
资源文件同 基于浏览器的国际化文件
三.基于Cookie的国际化
CookieLocaleResolver不是默认的语言区域解析器,需要进行配置。
1.spring mvc配置文件
<!-- 国际化资源 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="message"/>
</bean>
<!-- CookieLocaleResolver配置 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"></bean>
<mvc:interceptors>
<!-- 国际化操作拦截器,基于(Session、Cookie)必须配置 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
2.页面
页面同上,改一下就行
3.Controller
根据提交的requestLocale参数值,创建CookieLocaleResolver对象,调用setLocale方法将语言环境设置在Cookie中
@RequestMapping(value = "/page/login3", method = RequestMethod.GET)
public String login3(HttpServletRequest request, HttpServletResponse response, Model model, String requestLocale) throws Exception {
if (requestLocale != null) {
if (requestLocale.equals("zh_CN")) {
Locale locale = new Locale(Locale.SIMPLIFIED_CHINESE.getLanguage(), Locale.SIMPLIFIED_CHINESE.getCountry());
(new CookieLocaleResolver()).setLocale(request, response, locale);
} else if (requestLocale.equals("en_US")) {
Locale locale = new Locale(Locale.US.getLanguage(), Locale.US.getCountry());
(new CookieLocaleResolver()).setLocale(request, response, locale);
} else {
// 当前线程或者系统默认国际化
(new CookieLocaleResolver()).setLocale(request, response, LocaleContextHolder.getLocale());
}
}
// 从后台代码获取国际化信息
RequestContext requestContext = new RequestContext(request);
model.addAttribute("title", requestContext.getMessage("title"));
model.addAttribute("loginname", requestContext.getMessage("loginname"));
model.addAttribute("password", requestContext.getMessage("password"));
return "login3";
}
4.测试
查看浏览器的NetWork(谷歌浏览器),可以看到请求头、响应头中cookie信息:上一篇: servlet实现文件下载