Spring MVC的国际化

“庭院深深深几许,杨柳堆烟,帘幕无重数”

Spring MVC国际化简介

程序国际化是商业系统的一个基本要求,因为今天的软件系统不再是简单的单机程序,往往都是一个开放的系统,需要面对来自全世界各个地方的访问者,因此,国际化成为商业系统必不可少的一部分。
Spring MVC的国际化是建立在Java国际化的基础之上的,其一样也是通过提供不同国家/语言环境的消息资源,然后通过 Resource Bundle加载指定 Locale对应的资源文件,再取得该资源文件中指定key对应的消息。这整个过程与Java程序的国际化完全相同,只是 Spring MVC框架对Java程序国际化进行了进一步的封装,从而简化了应用程序的国际化。

Spring MVC国际化步骤:

Spring MVC的国际化的步骤与Java国际化的步骤基本相
似,只是实现起来更加简单。
Spring MVC的国际化可按如下步骤进行
(1)给系统加载国际化资源文件。
(2)输出国际化。 Spring MVC输出国际化消息有两种方式:
在视图页面上输出国际化消息,需要使用 Spring MVC的标签库。
在 Controller的处理方法中输出国际化消息,需要使用 org.springframework.web.servlet.support Requestcontext的getMessage()方法来完成。

Spring MVC国际化的使用:

Spring MVC提供了一个语言区域解析器接口LocaleResolver,该接口的常用实现类都在org.springframework.web.servlet.i18n包下面,包括:

  • AcceptHeaderLocaleResolver
  • SessionLocaleResolver
  • CookieLocaleResolver

下面是使用流程:

  1. 首先,准备两个资源文件,分别展示英文和中文:首先,准备两个资源文件,这两个资源文件放在项目的src目录下,分别展示英文和中文:
    message_zh_CN.properties:(很明显,这个中文的资源文件是经过编码后的,编码问题请看这里:native2ascii编码
#转码前如下:
#loginname=登录名;
#password=密码;
#submit= 提交;
#welcome= 欢迎 {0} 登录系统;
#title= 登录页面;
#username= 管理员;
#转码后如下:
loginname= \u767b\u5f55\u540d;
password= \u5bc6\u7801;
submit= \u63d0\u4ea4;
welcome= \u6b22\u8fce {0} \u8bbf\u95ee \u7cfb\u7edf;
title= \u767b\u5f55\u9875\u9762;
username= \u7ba1\u7406\u5458;

message_en_US.properties:

loginname= Login name;
password= Password;
submit= Submit;
welcome= Welcome {0} access system;
title= Login Page;
username= administrator;
  1. 新建登录页面用来输出国际化消息新建登录页面用来输出国际化消息
    loginForm.jsp:
<%--
  Created by IntelliJ IDEA.
  User: aRunner
  Date: 2018/10/27
  Time: 10:25
  To change this template use File | Settings | File Templates.
--%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%--因为这里使用到Spring MVC 的message标签,所以需要引入Spring的标签库--%>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试基于浏览器请求的国际化</title>
</head>
<body>
<%--使用message标签来输出国际化信息--%>
<h3><spring:message code="title"></spring:message> </h3>
<form:form modelAttribute="user" method="post" action="login">
    <table>
        <tr>
            <td><spring:message code="loginname"/> </td>
            <td><form:input path="loginname"/> </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>
  1. 在Spring MVC 的配置文件(springmvc-config.xml)中加载国际化资源文件(其他配置视图解析器和前端控制器在此不再赘述)
<!--国际化-->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <!--=国际化资源文件名-->
        <property name="basenames" value="message"/>
    </bean>
    <mvc:interceptors>
        <!--国际化操作拦截器如果采用基于(Session/Cookie)则必须配置-->
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    </mvc:interceptors>
    <!--AcceptHeaderLocalRecaleResolver配置,因为AcceptHeaderLocalRecaleResolver是默认语言区域解析器,不配置也可以-->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"/>
  1. 开发处理请求的Controller:
import org.fkit.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.support.RequestContext;

import javax.servlet.http.HttpServletRequest;

/**
 * @author aRunner
 * @date 2018/11/3
 */
@Controller
public class UserController {
    @RequestMapping(value = "/{formName}")
    public String loginForm(@PathVariable String formName,Model model) {
        User user = new User();
        model.addAttribute("user",user);
        //动态跳转页面,需要先配置视图解析器
        return formName;
    }


    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public String login(@ModelAttribute @Validated User user, Model model, HttpServletRequest request) {
        //如果登录名是arunner,密码是123456,则验证通过
        if (user.getPassword() != null && user.getPassword().equals("123456") && user.getLoginname() != null && user.getLoginname().equals("arunner")) {
            //从后台代码获取国际化信息username
            RequestContext requestContext = new RequestContext(request);
            String username = requestContext.getMessage("username");
            //将获取的username信息设置到user对象中,并设置到model中
            user.setLoginname(username);
            model.addAttribute("user",user);
            return "success";
        }
        return "error";
    }
}

  1. 登录成功后跳转的页面:success.jsp:
<%--
  Created by IntelliJ IDEA.
  User: aRunner
  Date: 2018/10/27
  Time: 10:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<html>
<head>
    <title>welcome</title>
</head>
<body>
<spring:message code="welcome" arguments="${requestScope.user.loginname}"/>
</body>
</html>

  1. 启动项目,进行测试:
    正常访问http://localhost:8080/I18nTest/loginForm地址之后,你将看到下面的登录和登录成功界面:
    在这里插入图片描述
    在这里插入图片描述

那么,如何看到英文的界面呢?需要在浏览器中设置语言首选项:
在这里插入图片描述
如图,把英语置顶。
再刷新我们刚才的登录界面,即可看到英文结果:
在这里插入图片描述
在这里插入图片描述
上面说的是基于AcceptHeaderLocaleResolver实现的Spring MVC国际化,也是Spring MVC默认的实现方式。接下来说另外两种:SessionLocaleResolver和CookieLocaleResolver。其实,方式都是类似,只是稍微改了3个地方,

  1. 改了Spring MVC的配置文件 ,分别改为如下这样:
    SessionLocaleResolver:
<!--国际化-->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <!--=国际化资源文件名-->
        <property name="basenames" value="message"/>
    </bean>
    <mvc:interceptors>
        <!--国际化操作拦截器如果采用基于(Session/Cookie)则必须配置-->
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    </mvc:interceptors>
    <!--SessionLocaleResolver配置-->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>

CookieLocaleResolver:

<!--国际化-->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <!--=国际化资源文件名-->
        <property name="basenames" value="message"/>
    </bean>
    <mvc:interceptors>
        <!--国际化操作拦截器如果采用基于(Session/Cookie)则必须配置-->
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    </mvc:interceptors>
    <!--CookieLocaleResolver配置-->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
  1. 在登录页面新加两个用来切换语言的a标签:
<%--用户可以选择切换语言环境--%>
<a href="loginForm?request_locale=zh_CN">中文</a> | <a href="loginForm?request_locale=en_US">英文</a>
  1. 修改处理登录页面请求的controller,分别改为如下这样:
    SessionLocaleResolver:
@RequestMapping(value = "/{formName}")
    public String loginForm(@PathVariable String formName,Model model,String request_locale,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;
    }

CookieLocaleResolver:

@RequestMapping(value = "/{formName}")
    public String loginForm(@PathVariable String formName, Model model, String request_locale, 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;
    }

然后启动项目,就可以看到下面的切换语言的效果了:
在这里插入图片描述
在这里插入图片描述
OK,就到这里了。最后,我把我这里的源项目*(没有用GitHub,直接用网盘放的压缩包,是不是觉得本作者很不专业……哈哈。。)贴出来供下载参考:下载地址

猜你喜欢

转载自blog.csdn.net/A_Runner/article/details/83684593