1.messageSource接口
2.localeResolver接口
3.message标签
4.AcceptHeaderLocaleResolver国际化
5.SessionLocaleResolver国际化
6.CookieLocaleResolver国际化

springmvc国际化步骤
1.给系统加载国际化资源文件
2.输出国际化
方式一:在视图页面上输出国际化消息,需要使用springmvc标签库
方式二:在Controller的处理方法中输出国际化消息,需要使用org.springframework.web.servlet.support.RequestContext的getMessage()方法来完成

为用户选择语言区域时,最常用的方法是通过读取用户浏览器的accept-language标题值,accept-language提供了关于用户浏览器语言的信息。选择语言区域的其他方法还包括读取HttpSession或则Cookie

springmvc提供了一个语言区域解析器接口LocaleResolver,该接口的常用实现类都在org.springframework.web.servlet.i18n下面包括:
AcceptHeaderLocaleResolver(默认,可以不用显示配置)
SessionLocaleResolver(需要显示配置)
CookieLocaleResolver(需要显示配置)

message标签:
需要在jsp页面添加
<%@taglib prefix=”spring” uri=”http://www.springframework.org/tags” %>

Spring MVC 之 DispatcherServlet之国际环境-LMLPHP
案例一:
配置两个资源文件
文件名为:[springmvc配置文件中的value值]_zh_CN.properties
eg:
fkit_en_US.properties
fkit_zh_CN.properties

fkit_en_US.properties内容为:

name= Login name:
password = Password:
submit = Submit
welcome = Welcom {0} access fkit
title = Login Page
username = administrator

fkit_zh_CN.properties内容为

name= \u767B\u5F55\u540D:
password = \u5BC6\u7801:
submit = \u63D0\u4EA4
welcome = \u6B22\u8FCE {0} springmvc test
title = \u767B\u5F55\u9875\u9762
username = \u7BA1\u7406\u5458

在springmvc的配置文件中配置
下面的中的value值与上面资源文件名称相对应

<!-- 自动注册组件 -->
    <mvc:annotation-driven />
    <!-- 使用默认的Servlet来响应静态文件 -->
    <!-- <mvc:default-servlet-handler /> -->


    <!-- 扫包 ,将所有spring的注解注册成bean -->
    <context:component-scan base-package="com.**"></context:component-scan>
    <!-- 配置annotation类型的处理映射器 -->
    <bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
    <!-- 配置annotation类型处理器适配器 -->
    <bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

    <!-- 配置视图解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!-- 在index.jsp页面配置静态资源文件的路径时 可以使用${basePath} -->
    <bean id="bresource" class="com.core.TmBasePathExposer" init-method="init"></bean>

    <!-- 利用messageSource告诉springmvc国际化的属性文件保存在哪里 -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <!-- basenames属性来指定国际化的属性文件名称 -->
        <property name="basenames">
            <list>
                <value>message</value>
                <value>fkit</value>
            </list>
        </property>
    </bean>
        <mvc:interceptors>
        <!-- 国际化操作拦截器 如果采用基于(Session/Cookie)则必需配置 -->
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
    </mvc:interceptors>

    <!-- AcceptHeaderLocaleResolver 配置,因为AcceptHeaderLocaleResolver是默认语言区域解析器,不配置也可以  -->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" />

实体代码:

package com.entity;

public class User {
    private String name;
    private String password;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}

访问http://localhost:8080/springmvcNote1/internation/loginForm
进入loginForm方法转到login.jsp页面

@Controller
@RequestMapping("internation")
public class InternationalController {
    //  http://localhost:8080/springmvcNote1/internation/loginForm
    @RequestMapping("loginForm")
    public String loginForm(Model model){
        User user = new User();
        model.addAttribute("user",user);
        return "Internationalization/login";
    }

login.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>aaaa
    <!-- 使用message标签来输出国际化信息 -->
     <h3><spring:message code="title"/></h3>
    <form:form modelAttribute="user" method="post" action="login">
        <table>
        <tr>
            <td><spring:message code="name"/></td>
            <td><form:input path="name"/></td>
        </tr>
        <tr>
            <td><spring:message code="password"/></td>
            <td><form:input path="password"/></td>
        </tr>
        <tr>
            <td><input type="submit" value="<spring:message code="submit"/>"/></td>
        </tr>
    </table>
    </form:form>


</body>
</html>

点击提交转到

@RequestMapping("login")
    public String test01(@ModelAttribute @Validated User user
            ,Model model,HttpServletRequest request){

        if(user.getPassword()!=null && user.getName()!=null
                && user.getName().equals("caoxuekun")
                && user.getPassword().equals("123")){
            System.out.println("****************");
            //从后台代码获取国际化信息username
            RequestContext requestContext = new RequestContext(request);
            String name = requestContext.getMessage("name");

            //将获取的username信息设置到user对象,并设置到model中
            user.setName(name);
            model.addAttribute("user",user);
            return "/Internationalization/success";
        }
        return "Internationalization/error";
    }

如果输入的用户名和密码分别为caoxuekun和123那么跳转到success.jsp页面,否则跳转到error.jsp页面
效果:
Spring MVC 之 DispatcherServlet之国际环境-LMLPHP
Spring MVC 之 DispatcherServlet之国际环境-LMLPHP
改变浏览器的语言(下面对应的是火狐)

Spring MVC 之 DispatcherServlet之国际环境-LMLPHP

Spring MVC 之 DispatcherServlet之国际环境-LMLPHP
Spring MVC 之 DispatcherServlet之国际环境-LMLPHP
Spring MVC 之 DispatcherServlet之国际环境-LMLPHP
SessionLocaleResolver国际化:
不是默认语言区域解析器,需要显示配置,springmvc会从HttpSession作用域中获取用户所设置的语言区域。
案例
springmv中的配置文件

<!-- 利用messageSource告诉springmvc国际化的属性文件保存在哪里 -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <!-- basenames属性来指定国际化的属性文件名称 -->
        <property name="basenames">
            <list>
                <value>message</value>
                <value>fkit</value>
            </list>
        </property>
    </bean>
        <mvc:interceptors>
        <!-- 国际化操作拦截器 如果采用基于(Session/Cookie)则必需配置 -->
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
    </mvc:interceptors>

    <!-- AcceptHeaderLocaleResolver 配置,因为AcceptHeaderLocaleResolver是默认语言区域解析器,不配置也可以  -->
    <!-- <bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" />  -->

    <!-- SessionLocaleResolver 配置 -->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

访问:localhost:8080/springmvcNote1/internation/sessionLogin
进入sessionLogin方法转到sessionLogin.jsp页面

@RequestMapping(value="/sessionLogin")
     public String sessionLogin(
             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 "Internationalization/sessionLogin";
    }

sessionLogin.jsp页面,可以点击两个超链接设置语言格式

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix= "form" 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>测试基于SessionLocaleResolver的国际化</title>
</head>
<body>
<!-- 用户可以选择切换语言环境 -->
<a href="sessionLogin?request_locale=zh_CN">中文</a> | <a href="sessionLogin?request_locale=en_US">英文</a>
<br/>
<h3><spring:message code="title"/></h3>
<form:form modelAttribute="user" method="post" action="login" >
    <table>
        <tr>
            <td><spring:message code="name"/></td>
            <td><form:input path="name"/></td>
        </tr>
        <tr>
            <td><spring:message code="password"/></td>
            <td><form:input path="password"/></td>
        </tr>
        <tr>
            <td><input type="submit" value="<spring:message code="submit"/>"/></td>
        </tr>
    </table>
</form:form>
</body>
</html>

点击提交跳转到test01方法,如果登陆名和密码为caoxuekun和123
那么跳转到success.jsp否则error.jsp

@RequestMapping("login")
    public String test01(@ModelAttribute @Validated User user
            ,Model model,HttpServletRequest request){

        if(user.getPassword()!=null && user.getName()!=null
                && user.getName().equals("caoxuekun")
                && user.getPassword().equals("123")){
            //从后台代码获取国际化信息username
            RequestContext requestContext = new RequestContext(request);
            String name = requestContext.getMessage("name");

            //将获取的username信息设置到user对象,并设置到model中
            user.setName(name);
            model.addAttribute("user",user);
            return "/Internationalization/success";
        }
        return "Internationalization/error";
    }

success.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <spring:message code="welcome" arguments="${requestScope.user.name}"/>
</body>
</html>

实体类

package com.entity;

public class User {
    private String name;
    private String password;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}

CookieLocaleResolver国际化
案例
springmvc配置文件

 <mvc:annotation-driven />
    <!-- 使用默认的Servlet来响应静态文件 -->
    <!-- <mvc:default-servlet-handler /> -->


    <!-- 扫包 ,将所有spring的注解注册成bean -->
    <context:component-scan base-package="com.**"></context:component-scan>
    <!-- 配置annotation类型的处理映射器 -->
    <bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
    <!-- 配置annotation类型处理器适配器 -->
    <bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

    <!-- 配置视图解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!-- 在index.jsp页面配置静态资源文件的路径时 可以使用${basePath} -->
    <bean id="bresource" class="com.core.TmBasePathExposer" init-method="init"></bean>

    <!-- 利用messageSource告诉springmvc国际化的属性文件保存在哪里 -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <!-- basenames属性来指定国际化的属性文件名称 -->
        <property name="basenames">
            <list>
                <value>message</value>
                <value>fkit</value>
            </list>
        </property>
    </bean>
        <mvc:interceptors>
        <!-- 国际化操作拦截器 如果采用基于(Session/Cookie)则必需配置 -->
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
    </mvc:interceptors>

    <!-- AcceptHeaderLocaleResolver 配置,因为AcceptHeaderLocaleResolver是默认语言区域解析器,不配置也可以  -->
    <!-- <bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" />  -->

    <!-- SessionLocaleResolver 配置 -->
    <!-- <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />  -->

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />

访问:http://localhost:8080/springmvcNote1/internation/cookieLogin
进入cookieLogin方法,跳转到cookieLogin.jsp页面

@RequestMapping(value="cookieLogin")
     public String cookieLogin(
             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 "Internationalization/cookieLogin";
    }

cookieLogin.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix= "form" 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>测试基于SessionLocaleResolver的国际化</title>
</head>
<body>
<!-- 用户可以选择切换语言环境 -->
<a href="cookieLogin?request_locale=zh_CN">中文</a> | <a href="cookieLogin?request_locale=en_US">英文</a>
<br/>
<h3><spring:message code="title"/></h3>
<form:form modelAttribute="user" method="post" action="login" >
    <table>
        <tr>
            <td><spring:message code="name"/></td>
            <td><form:input path="name"/></td>
        </tr>
        <tr>
            <td><spring:message code="password"/></td>
            <td><form:input path="password"/></td>
        </tr>
        <tr>
            <td><input type="submit" value="<spring:message code="submit"/>"/></td>
        </tr>
    </table>
</form:form>
</body>
</html>

提交跳转到test01方法,登陆成功进入success.jsp页面,否则进入error.jsp页面

@RequestMapping("login")
    public String test01(@ModelAttribute @Validated User user
            ,Model model,HttpServletRequest request){

        if(user.getPassword()!=null && user.getName()!=null
                && user.getName().equals("caoxuekun")
                && user.getPassword().equals("123")){
            //从后台代码获取国际化信息username
            RequestContext requestContext = new RequestContext(request);
            String name = requestContext.getMessage("name");

            //将获取的username信息设置到user对象,并设置到model中
            user.setName(name);
            model.addAttribute("user",user);
            return "/Internationalization/success";
        }
        return "Internationalization/error";
    }

本文来自 caoxuekun 的CSDN 博客 ,全文地址请点击:
https://blog.csdn.net/caoxuekun/article/details/76577096?utm_source=copy

10-07 10:39