国际化概述

基于浏览器请求的国际化实现

新建实体类

package pers.zhang.entity;/*** @author zhang* @date 2019/11/28 - 11:34*/
public class User {private String loginName;private String password;private int age;private String email;private String phone;public String getLoginName() {return loginName;}public void setLoginName(String loginName) {this.loginName = loginName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "User{" +"loginName='" + loginName + '\'' +", password='" + password + '\'' +", age=" + age +", email='" + email + '\'' +", phone='" + phone + '\'' +'}';}
}

在src根路径下,新建两个资源文件:
message_en_US.properties

loginName=LoginName
password=Password
age=Age
email=Email
phone=Phone
submit=Submit
welcome=Welcome {0}, Congratulations on your registration.
title=Register Page
userName=Administrator
info=Your registration information is as follows

message_zh_CH.properties

loginName=\u540D\u79F0
password=\u5BC6\u7801
age=\u5E74\u9F84
email=\u90AE\u7BB1
phone=\u7535\u8BDD
submit=\u6CE8\u518C
welcome=\u6B22\u8FCE {0},\u606D\u559C\u60A8\u6CE8\u518C\u6210\u529F
title=\u6CE8\u518C\u9875\u9762
userName=\u7BA1\u7406\u5458
info=\u60A8\u7684\u6CE8\u518C\u4FE1\u606F\u5982\u4E0B

在springmvc.xml中加载国际化资源文件:

 <bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><!-- 国际化资源文件名 --><property name="basename" value="message"/></bean><!-- AcceptHeaderLocaleResolver 因为是默认语言区域解析,可以不配置 --><bean name="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"/>

在webapp下的jsp文件夹中新建registerForm.jsp和success.jsp
registerForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><spring:message code="title"/></title>
</head>
<body><a href="registerForm?request_locale=zh_CN">中文</a> &nbsp; | &nbsp;<a href="registerForm?request_locale=en_US">英文</a><h3><spring:message code="title"/></h3><fm:form modelAttribute="user" action="register" method="post"><spring:message code="loginName"/>:<fm:input path="loginName"/><br><spring:message code="password"/>:<fm:input path="password"/><br><spring:message code="age"/>:<fm:input path="age"/><br><spring:message code="email"/>:<fm:input path="email"/><br><spring:message code="phone"/>:<fm:input path="phone"/><br><input type="submit" value="<spring:message code="submit"/>"><br></fm:form></body>
</html>

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body><font color="blue"><h4><spring:message code="welcome" arguments="${requestScope.user.loginName }"/> </h4></font><spring:message code="info"/><br><spring:message code="password"/>:${user.password }<br><spring:message code="age"/>:${requestScope.user.age }<br><spring:message code="email"/>:${requestScope.user.email }<br><spring:message code="phone"/>:${requestScope.user.phone }<br></body>
</html>

在controller包中新建UserController

package pers.zhang.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.support.RequestContext;
import pers.zhang.entity.User;import javax.servlet.http.HttpServletRequest;/*** @author zhang* @date 2019/11/28 - 11:48*/
@Controller
public class UserController {@RequestMapping("/{formName}")public String registerForm(@PathVariable String formName, Model model){User user = new User();model.addAttribute("user", user);return formName;//动态跳转到页面}@RequestMapping(value = "/register", method = RequestMethod.POST)public String register(@ModelAttribute User user, Model model, HttpServletRequest request){//从后台代码获取国际化资源文件中的信息 userNameRequestContext requestContext = new RequestContext(request);String userName = requestContext.getMessage("userName");model.addAttribute("user", user);System.out.println(userName);return "success";}
}

测试:
修改浏览器的默认语言设置,并刷新页面,填入数据并提交:

基于HttpSession的国际化实现

基于HttpSession的国际化实现使用的是LocaleResolver接口的SessionLocaleResovler实现类,SessionLocaleResovler不是默认的语言区域解析器,需要对其进行显示配置。如果使用它,SpringMVC会从HttpSession作用域中获取用户所设置的语言区域,来确定使用哪个语言区域。通过请求参数改变国际化的值时,可使用Spring提供的国际化拦截器LocaleChangeInterceptor。

SessionLocaleResovler工作原理如下图:

修改springmvc.xml配置
注释默认的AcceptLanguageLocaleResolver

bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><!-- 国际化资源文件名 --><property name="basename" value="message"/></bean>
<!--    &lt;!&ndash; AcceptHeaderLocaleResolver 因为是默认语言区域解析,可以不配置 &ndash;&gt;-->
<!--    <bean name="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"/>--><!-- SessionLocaleResolver 配置 --><bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/><mvc:interceptors><!-- 如果采用了基于Session/Cookie的国际化,必须配置国际化操作拦截器 --><bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/></mvc:interceptors>

修改获取跳转页面的registerForm()方法

@RequestMapping(value = "/{formName}")public String registerForm(@PathVariable String formName, String request_locale,Model model, HttpServletRequest request){System.out.println("request_locale=" + request_locale);if(request_locale != null){if(request_locale.equals("zh_CN")){//设置中文环境Locale locale = new Locale("zh", "CN");request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);}else if(request_locale.equals("en_US")){//设置英文环境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());}}User user = new User();model.addAttribute("user", user);return formName;//动态跳转页面}

测试
点击超链接切换语言:

基于Cookie的国际化实现

基于Cookie的国际化实现使用的是LocaleResolver接口CookieLocaleResolver 实现类,CookieLocaleResolver不是默认的语言区域解析器,需要对其进行显示配置。

修改springmvc.xml配置

    <bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><!-- 国际化资源文件名 --><property name="basename" value="message"/></bean>
<!--    &lt;!&ndash; AcceptHeaderLocaleResolver 因为是默认语言区域解析,可以不配置 &ndash;&gt;-->
<!--    <bean name="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"/>--><!-- SessionLocaleResolver 配置 -->
<!--    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>--><!-- CookieLocaleResolver 配置--><bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/><mvc:interceptors><!-- 如果采用了基于Session/Cookie的国际化,必须配置国际化操作拦截器 --><bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/></mvc:interceptors>

修改获取跳转页面的registerForm()方法

@RequestMapping(value = "/{formName}")public String registerForm(@PathVariable String formName, String request_locale, Model model,HttpServletRequest request, HttpServletResponse response){System.out.println("request_locale=" + request_locale);if(request_locale != null){if(request_locale.equals("zh_CN")){//设置中文环境Locale locale = new Locale("zh", "CN");(new CookieLocaleResolver()).setLocale(request,response,locale);}else if(request_locale.equals("en_US")){//设置英文环境Locale locale = new Locale("en", "US");(new CookieLocaleResolver()).setLocale(request,response,locale);}else{//使用之前的环境(new CookieLocaleResolver()).setLocale(request,response,LocaleContextHolder.getLocale());}}User user = new User();model.addAttribute("user", user);return formName;}

测试:点击标签切换语言环境
在浏览器调试窗口可以看到Cookie中的语言环境参数:

SpringMVC--国际化的三种方式详解(AcceptLanguageLocaleResolver、SessionLocaleResovler、CookieLocaleResolver)相关推荐

  1. 全站仪与计算机之间的数据传输,必看!全站仪数据传输的三种方式详解,都安排得明明白白(上)...

    原标题:必看!全站仪数据传输的三种方式详解,都安排得明明白白(上) 科力达全站仪数据传输 一般而言,全站仪的数据传输方式有三种,分别是通过串口.USB.SD卡三种方式,因为电脑配置等因素的不同,一些数 ...

  2. mysql 删除数据表中数据_Mysql-删除数据表-三种方式详解

    Mysql 删除数据表的三种方式详解 用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, ...

  3. 【Linux】部署Springboot项目到Linux服务器以及linux服务器下载文件的三种方式详解

    Linux学习之路 初识Linux Linux内核 由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写 Linux 是一套免费使用和自由传播的类Unix操作系 ...

  4. uni-app小程序引入iconfont的三种方式详解(无需下载文件到项目)

    重要背景说明 官网iconfont的引入方式有三种分别为:Unicode.Font class.Symbol, 其中已明确说明 Unicode.Font class 这两种引入方式 不支持多色. 单色 ...

  5. 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...

  6. php 多参数函数,php自定义函数的参数在函数间传递的三种方式详解

    在调用函数时,需要向函数传递参数,被传入的参数成为实参,而函数定义时的参数为形参.上一章节我们对php自定义函数的参数进行了实例讲解,本章节就重点介绍一下函数间参数传递的3种方式:按照值传递,按引用传 ...

  7. 【REACT NATIVE 系列教程之四】刷新组件RENDER(重新渲染)的三种方式详解

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2242.html ...

  8. 删除mysql表_Mysql 删除数据表的三种方式详解

    用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除程度可从强到 ...

  9. Mysql 删除数据表的三种方式详解

    用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除程度可从强到 ...

最新文章

  1. 为什么 ElasticSearch 比 MySQL 更适合复杂条件搜索
  2. css 单行文本溢出显示省略号
  3. omnet++ : could not be resolved 或error: coreexception 的解决
  4. 分卷压缩并解压 (线上服务器如何把很大的数据拷贝到另外一台服务器上)
  5. java jnlp被阻止_JNLP应用程序Web服务访问被拒绝 - java.io.FilePermission
  6. java记录登陆时间_Spring security如何实现记录用户登录时间功能
  7. 除了默认的docker0网桥,启动Docker服务怎么指定使用的网桥
  8. Android编译期代码生成之apt实践入门
  9. python视频帧提取并保存_如何用python实现视频关键帧提取并保存为图片?
  10. 根据id来实现小程序tab切换,
  11. CCRD_TOC_2008年第1期
  12. Android学习记录(一) 重拾Activity
  13. 让人深思:句法真的重要吗?邱锡鹏组提出一种基于Aspect的情感分析的强大基线...
  14. iPhone SE第三代强势入局后,我们来谈谈iPhoneSE2020
  15. IOS改地区:美国、新西兰等等
  16. Foxmail发送邮件,发送邮件工具类
  17. Instruments之相关介绍(一)
  18. 如何从用户旅程图中挖掘差异化需求?
  19. Mahalanobis(马哈拉诺比斯)距离
  20. 航模飞机飞行力效和飞行时间的算法

热门文章

  1. 前端调用手机摄像头权限进行扫码解析
  2. The request was rejected because the URL contained a potentially malicious String “//“
  3. 基于位置(Lbsn)的社交网络中混合推荐算法的设计
  4. asp.net MVC使用EF框架进行分页讲解
  5. C语言函数一章教学,c语言中函数教学的探讨
  6. 1.1 行列式(1)
  7. transformer中QKV的通俗理解(渣男与备胎的故事)
  8. 重磅 !程序猿月薪7万可以落户北京!
  9. 微信8.0.3测试版来了,TF直装安卓内测也来袭,附地址
  10. javaweb JAVA JSP 流浪狗管理系统(宠物狗管理系统)jsp小宠物在线管理网站源码