SpringMVC国际化

来源:互联网 发布:session用法 java 编辑:程序博客网 时间:2024/05/20 20:01

Spring MVC国际化是建立在Java国际化的基础之上的,也是通过提供不同国家语言环境的消息资源,然后通过java.util.ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的内容。

SpringMVC国际化执行步骤:

  • 给系统加载国际化资源文件
  • 输出国际化(两种方式)
方式一:在视图页面输出国际化信息,使用Spring MVC标签库:<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
方式二:在Controller中输出国际化信息,使用org.springframework.web.servlet.support.RequestContextgetMessage()方法获取


在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>
<value>message2</value>
</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=Titleloginname=LoginNamepassword=Password

(2).message_zh_CN.properties
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信息



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 恢复出厂设置需要谷歌账号怎么办 华为手机云端里照片删除了怎么办 客户退货卖家一直没收到货怎么办 在淘宝买到假货投诉不管用怎么办 差评不接电话不回旺旺不要钱怎么办 饿了么同行恶意差评怎么办 苹果手机更新后淘宝用不了怎么办 淘宝网快递丢件了买家怎么办 评价后忘了截图五星好评怎么办 在淘宝被骗了好评返现怎么办 苹果4s微信版本过低怎么办 微信版本太低无法登录怎么办 苹果4微信版本低登录不了怎么办 安卓手机微信版本低登录不了怎么办 苹果微信版本低登录不了怎么办 安装包与当前版本不兼容怎么办 游戏与苹果手机系统不兼容怎么办 闲鱼买家申请退款不退货怎么办 在淘宝买的战地1登录不了怎么办 支付宝转账到注销的账号怎么办 支付宝用户支付密码被锁定怎么办 淘宝提现需要的手机宝令怎么办 手机换号码了支付宝账号怎么办 卖家收到货迟迟不给退款怎么办 闲鱼东西已发出买家申请退款怎么办 如果东西在路上买家要退款怎么办 卖家收到退的货后不退款怎么办 扣48分淘宝被限制登录怎么办 淘宝网申请退款卖家不理怎么办 高考生如果把登录密码忘记了怎么办 普高考生登录密码忘记了怎么办 淘宝买的流量卡然后网卡怎么办? 忘记了qq号绑定了手机怎么办 微信绑定qq号忘记了怎么办 扣扣密码忘了手机号换了怎么办 如何更改微信登录密码忘记了怎么办 阿里卖家不肯同意退货退款怎么办 新买的号码被绑定微信怎么办 如果换手机原来旧手机支付宝怎么办 支付宝注册证件已过有效期怎么办 支付宝账号是手机号换号怎么办