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

国际化概述

在这里插入图片描述

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

新建实体类

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;
    }

    @Override
    public 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){
        //从后台代码获取国际化资源文件中的信息 userName
        RequestContext 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中的语言环境参数:
在这里插入图片描述

在这里插入图片描述

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值