Spring MVC 学习日志8.国际化i18n(使用IDEA)

1、通过浏览器语言设置国际化(根据请求头中的language)

* ·基于浏览器设置的语言切换国际化
*  1.新建jsp对应的国际化属性资源文件
*      login.properties
*      login_zh_CN.properties  简体中文-中国
*      login_en_US.properties  英文-美国
*  2.配置spring-mvc.xml,将国际化支持和资源文件注入到spring容器中
*      <bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
*         <property name="basenames">
*             <array>
*                 <value>i18n/login</value>
*                 如果还有别的jsp页面需要国际化,继续在这里加
*             </array>
*         </property>
*         <property name="defaultEncoding" value="UTF-8"/>
*     </bean>
*  3.在jsp页面调用对应的属性资源内容:<spring:message code="绑定属性资源中对应的key"/>

1.1、属性文件

login.properties

Email.user.email=请输入正确的邮箱!
NotEmpty.user.email=邮箱地址不能为空!
NotEmpty.user.password=密码必须输入!
text.birthday=生日
text.email=邮箱地址
text.login=登录
text.login_error=邮箱:{0}或密码:{1}错误!
text.password=密码
text.remember=记住我
text.welcome=欢迎来到聚义二手车
typeMismatch.user.birthday=日期格式不正确!

login_en_US.properties

Email.user.email=Please check your email format!
NotEmpty.user.email=Emial cant not be empty.
NotEmpty.user.password=Password required!
text.birthday=Birthday
text.email=Email Adress
text.login=Log in
text.login_error=Email or password error!
text.password=Password
text.remember=Remember me
text.welcome=Welcome to loyal second car 
typeMismatch.user.birthday=Date format is wrong!

login_zh_CN.properties

Email.user.email=请输入正确的邮箱!
NotEmpty.user.email=邮箱地址不能为空!
NotEmpty.user.password=密码必须输入!
text.birthday=生日
text.email=邮箱地址
text.login=登录
text.login_error=邮箱:{0}或密码:{1}错误!
text.password=密码
text.remember=记住我
text.welcome=欢迎来到聚义二手车
typeMismatch.user.birthday=日期格式不正确!

1.2、配置文件spring-mvc.xml

    <!--设置国际化支持,配置国际化属性资源-->
    <bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
        <property name="basenames">
            <array>
                <value>i18n/login</value>
            </array>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>
    <!--
        步骤1.
        使用SessionLocaleResolver来在session中获取Locale对象,
        而不是在requset中获取Locale对象
    -->

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

    <!--
        步骤2.
        方式2:使用springmvc 提供的拦截器接收locale参数(en_US,cn_ZH),然后设置到Session中去
    -->
    <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
    </mvc:interceptors>

1.3、login.jsp(使用bootsrap前端页面)

<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/3/13
  Time: 15:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<% request.setAttribute("basePath",request.getContextPath()); %>
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>登录页面——国际化</title>

    <link rel="canonical" href="https://getbootstrap.com/docs/4.5/examples/floating-labels/">

    <!-- Bootstrap core CSS -->
    <link href="${basePath}/assets/dist/css/bootstrap.css" rel="stylesheet">

    <style>
        .bd-placeholder-img {
            font-size: 1.125rem;
            text-anchor: middle;
            -webkit-user-select: none;
            -moz-user-select: none;
            -ms-user-select: none;
            user-select: none;
        }

        @media (min-width: 768px) {
            .bd-placeholder-img-lg {
                font-size: 3.5rem;
            }
        }
    </style>
    <!-- Custom styles for this template -->
    <link href="${basePath}/assets/dist/css/floating-labels.css" rel="stylesheet">
    <title>登录界面</title>
</head>
<body>
<form:form class="form-signin" action="${basePath}/login" method="post" modelAttribute="user">
    <div class="text-center mb-4">
        <img class="mb-4" src="${basePath}/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72">
        <h1 class="h3 mb-3 font-weight-normal"><spring:message code="text.login"></spring:message></h1>
        <p><spring:message code="text.welcome"></spring:message></p>
        <div class="row">
            <a class="col-md-6" href="${basePath}/i18n/zh_CN">中文</a>
            <a class="col-md-6" href="${basePath}/i18n/en_US">English</a>
        </div>
        <div class="row">
            <a class="col-md-6" href="${basePath}/i18n?locale=zh_CN">中文-拦截器</a>
            <a class="col-md-6" href="${basePath}/i18n?locale=en_US">English-Interceptor</a>
        </div>
    </div>
    <div class="form-label-group">
        <input type="input" id="inputEmail" name="email" class="form-control"  placeholder="邮箱地址" autofocus>
        <label for="inputEmail"><spring:message code="text.email"></spring:message></label>
        <form:errors path="email"></form:errors>
    </div>

    <div class="form-label-group">
        <input type="password" id="inputPassword" name="password" class="form-control" placeholder="密码">
        <label for="inputPassword"><spring:message code="text.password"></spring:message></label>
        <form:errors path="password"></form:errors>
    </div>

    <div class="form-label-group">
        <input type="text" id="inputBirthday" name="birthday" class="form-control" placeholder="生日">
        <label for="inputBirthday"><spring:message code="text.birthday"></spring:message></label>
        <form:errors path="birthday"></form:errors>
    </div>

    <div class="checkbox mb-3">
        <label>
            <input type="checkbox" value="remember-me"><spring:message code="text.remember"></spring:message>
        </label>
    </div>
    ${errMsg}
    <button class="btn btn-lg btn-primary btn-block" type="submit"><spring:message code="text.login"></spring:message></button>
    <p class="mt-5 mb-3 text-muted text-center">&copy; 2017-2021</p>
</form:form>
</body>
</html>

2、通过超链接来切换国际化

*  ·使用超链接的方式实现国际化
*  1.在spring-mvc.xml中更改默认本地化语言解析器LocaleResolver为SessionLocaleResolver(使用session)
*      而不是应用请求头request
*    方式1:创建一个请求方法接受locale参数(en_US,cn_ZH),然后设置到Session中去
*    方式2:使用springmvc 提供的拦截器接收locale参数(en_US,cn_ZH),然后设置到Session中去

SpringMVC还允许装配--个动态更改本地化类型的拦截器,这样通过指定一个请求参数就可以控制单个请求的本地化类型。

I18NController.java

package cn.qqa.controllers;

import cn.qqa.entity.User;
import com.sun.deploy.net.HttpResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

/**
 * ·基于浏览器设置的语言切换国际化
 *  1.新建jsp对应的国际化属性资源文件
 *      login.properties
 *      login_zh_CN.properties  简体中文-中国
 *      login_en_US.properties  英文-美国
 *  2.配置spring-mvc.xml,将国际化支持和资源文件注入到spring容器中
 *      <bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
 *         <property name="basenames">
 *             <array>
 *                 <value>i18n/login</value>
 *                 如果还有别的jsp页面需要国际化,继续在这里加
 *             </array>
 *         </property>
 *         <property name="defaultEncoding" value="UTF-8"/>
 *     </bean>
 *  3.在jsp页面调用对应的属性资源内容:<spring:message code="绑定属性资源中对应的key"/>
 *
 *  ·使用超链接的方式实现国际化
 *  1.在spring-mvc.xml中更改默认本地化语言解析器LocaleResolver为SessionLocaleResolver(使用session)
 *      而不是应用请求头request
 *    方式1:创建一个请求方法接受locale参数(en_US,cn_ZH),然后设置到Session中去
 *    方式2:使用springmvc 提供的拦截器接收locale参数(en_US,cn_ZH),然后设置到Session中去
 *
 *
 */
@Controller
public class I18NController {
    @RequestMapping("/i18n")
    public String i18n(User user){
        return "login";
    }

    @RequestMapping("/i18n/{language}_{country}")
    public String changeLocale(@PathVariable(value = "language") String language,
                               @PathVariable(value = "country") String country,
                               @Autowired SessionLocaleResolver sessionLocaleResolver,
                               HttpServletRequest request, HttpServletResponse response){
        Locale locale = new Locale(language, country);
        sessionLocaleResolver.setLocale(request, response, locale);
        return "login";
    }

}

3、国际化类型转换和验证失败的信息

 验证失败:如果是JRS303验证的信息: key的前缀为:注解+对象.属性 。

3.1、UserController.java

package cn.qqa.controllers;

import cn.qqa.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.validation.Valid;
import java.util.Locale;
/**
 * ·解决java硬编码的国际化
 *      1.在属性资源文件中加入需要国际化的硬编码内容
 *      2.将MessageSource自动注入
 *      3.使用messageSource.getMessage获取国际化内容
 *          (1)String code 资源文件中的key
 *          (2)args 文本中的参数,可以用占位符的方式在资源文件中设置占位符:以{0}的方式
 *          (3)locale 当前的本地化语言
 *
 *
 */
@Controller
public class UserController {

    @Autowired
    MessageSource messageSource;

    @RequestMapping("/login")
    public String login(@Valid User user, BindingResult bindingResult, Model model, Locale locale){
        if(bindingResult.hasErrors()){
            return "login";
        }
        //验证用户名或密码是否正确
        if(!user.getEmail().equals("123@qq.com")&&!user.getPassword().equals("123456")){
            String message = messageSource.getMessage("text.login_error", new Object[]{user.getEmail(),user.getPassword() }, locale);
            model.addAttribute("errMsg", message);
            return "login";
        }
        return "admin";
    }
}

3.2、User.java

 

package cn.qqa.entity;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotNull;
import java.util.Date;

public class User {
    private Integer id;
    @NotEmpty//(message = "邮箱地址不能为空!")
    @Email//(message = "请输入正确的邮箱!")
    private String email;
    @NotEmpty//(message = "密码必须输入!")
    private String password;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", email='" + email + '\'' +
                ", password='" + password + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值