Spring 全家桶之 Spring Web MVC(八)- I18N

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Spring 全家桶之 Spring Web MVC(八)- I18N

i18n是internationalization首字母i和末尾字母n以及中间18个字母的简称,意于国际化, 国际化(i18n)指让产品(出版物,软件,硬件等)无需做大的改变就能够适应不同的语言和地区的需要。对程序来说,在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。 在全球化的时代,国际化尤为重要,因为产品的潜在用户可能来自世界的各个角落。通常与i18n相关的还有L10n(“本地化”的简称)。

Spring MVC 通过ResourceBundleMessageSource管理国际化资源文件,使得国际化的配置非常简单。

在index.jsp页面中增加一个超链接,点击超链接跳转至登录页面

<a href="/tologinpage">跳转至登录页面</a>
复制代码

在pages目录下新建登录页面login.jsp,在body标签中增加登录表单

<h2>Login</h2>
<h3>登录表单</h3>
<form action="">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit" />
</form>
复制代码

在controller包中新家I18NController,添加一个toLoginPage方法,该方法返回登录界面

@Controller
public class I18NController {
    @RequestMapping("/tologinpage")
    public String toLoginPage(){
        return "login";
    }
}
复制代码

一、国际化配置

国际化资源文件

在resource目录下新建两个properties配置文件login_us_EN.properties和login_zh_CN.properties,将需要国际化的项配置到里面

username=USERNAME
password=PASSWORD
复制代码
username=用户名
password=密码
复制代码

国际化XML配置

在Spring MVC配置文件中增加国际化资源配置,通过ResourceBundleMessageSource来管理国际化资源文件,其中basename属性是指国际化资源的位置以及文件标识

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="loginpage/login"></property>
</bean>
复制代码

页面获取国际化消息

首先在login.jsp页面上导入fmt标签

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
复制代码

接着修改登录表单,使用fmt标签取出国际化内容

<form action="">
    <fmt:message key="username">:<input type="text" name="username">
    <fmt:message key="password">:<input type="password" name="password">
    <input type="submit" />
</form>
复制代码

测试国际化

重新启动该应用,点击首页的超链接,跳转至登录页面

image.png

中文显示乱码,这是因为国际化资源中文一定要使用ASCII编码,修改login_zh_CN.properties为

username=\u7528\u6237\u540d
password=\u5bc6\u7801
复制代码

再次重启应用,点击首页超链接,跳转至登录页面

image.png

修改浏览器语言为英文

image.png

中文英文都可以正常显示,国际化配置生效

二、国际化原理

Spring MVC中国际化区域信息解析器负责解析区域信息,而区域信息根据浏览器携带的信息来获取的。

Spring MVC中配置了默认的区域信息解析器AcceptHeaderLocalResolver,该类实现了LocaleResolver接口。

image.png

LocalResolve接口中定义了两个方法,分别是解析和设置区域信息解析器

image.png

AcceptHeaderLocalResolver实现了LocalResolver接口中的方法

image.png

其中resolveLocale方法就是根据请求头中浏览器的语言来设置的来设置区域信息

image.png

页面渲染时都是通过resolveLocale方法来获取区域信息的

获取区域信息解析器

在toLoginPage方法中增加Locale参数,并在代码中打印

@RequestMapping("/tologinpage")
public String toLoginPage(Locale locale){
    System.out.println("此时请求头中携带的区域信息为:" + locale);
    return "login";
}
复制代码

重启浏览器,访问登录界面

image.png

可以看出浏览器在不同语言设置下显示出不同的区域信息

获取国际化配置信息

Spring MVC中的国际化配置是由ResourceBundleMessageSource来管理的,该类是MessageResource接口的实现类,通过该类可以获取到国际化配置信息

@Controller
public class I18NController {
    @Autowired
    private MessageSource messageSource;
    @RequestMapping("/tologinpage")
    public String toLoginPage(Locale locale){
        System.out.println("此时请求头中携带的区域信息为:" + locale);
        // key, 占位符, 区域信息
        String usernameInfo = messageSource.getMessage("username", null,locale);
        System.out.println("国际化文件中Key为username在" + locale + "下的配置信息为:" + usernameInfo);
        return "login";
    }
}
复制代码

重启应用,分别设置浏览器语言为中文和英文时请求登录页面

image.png

可用于在校验时返回国际化信息

三、国际化切换

在登录表单下面增加两个超链接,实现通过点击中文或者English来切换语言

<a class="btn btn-sm" href="#">中文</a> |
<a class="btn btn-sm" href="#">English</a>
复制代码

默认Spring MVC是通过请求头中的浏览器携带的区域信息来解析的,要想实现通过点击实现切换语言的目的就需要自定义一个区域信息解析器,用来解析超链接中传递的区域信息

<a class="btn btn-sm" href="tologinpage?locale=zh_CN">中文</a> |
<a class="btn btn-sm" href="tologinpage?locale=en_US">English</a>
复制代码

注册区域信息解析器

DispatcherServlet类中的区域解析器属性名称为localeResolver,所以要想使用自定义的区域信息解析器就需要在Spring MVC配置文件中配置id为localeResolver的Bean

image.png

image.png

Spring MVC中的区域信息解析器

image.png

  • AcceptHeaderLocaleResolver:使用请求头的区域信息,默认的区域信息解析器
  • FixedLocaleResolver:使用系统默认的区域信息
  • SessionLocaleResolver:使用session获取区域信息,可以将locale对象方法在session中,可以修改区域信息
  • CookieLocaleResolver:使用cookie获取区域信息,可以修改区域信息

使用SessionLocaleResolver实现国际化切换

首先将注册的区域信息解析器替换为SessionLocaleResolver,id仍然保持LocalResolver不变

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

SessionLocaleResolver的resolveLocale方法从session的attibute中取出区域信息,属性名为localeAttributeName

image.png

而localeAttribute有指向另一个变量

image.png

所以我们在将区域信息保存在session时设置的属性名也设置为

SessionLocaleResolver.class.getName() + ".LOCALE";
复制代码

修改toLoginPage方法

@RequestMapping("/tologinpage")
public String toLoginPage(@RequestParam(value = "locale", defaultValue = "zh_CN") String areaInfo,
                          Locale locale, HttpSession session){
    // 如果请求地址中携带了区域信息,就进行国际化
    Locale l = null;
    if (areaInfo != null && !"".equals(areaInfo)){
        l = new Locale(areaInfo.split("_")[0], areaInfo.split("_")[1]);
    } else {
        l = locale;
    }
    // 区域信息存入session中
    session.setAttribute(SessionLocaleResolver.class.getName() + ".LOCALE", l);
    System.out.println(l.toString());
    return "login";
}
复制代码

重启应用,依然可以实现点击中英文切换语言

SessionLocaleResolver+LocaleChangeInterceptor实现国际化切换

配置区域信息拦截器,拦截所有请求,通过拦截器中的preHandler方法设置区域信息

<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>
复制代码

toLoginPage方法

@RequestMapping("/tologinpage")
public String toLoginPage(){
    return "login";
}
复制代码

重新启动该应用,依然可以实现点击超链接切换语言

image.png

四、拦截器与Filter

如果实现的功能需要和其他组件配合使用,就需要使用到拦截器,基于Spring IOC可以非常方便的导入各种组件,除此之外可以使用Filter


相关文章
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
48 4
|
1月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
57 2
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
134 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
2月前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
66 7
|
2月前
|
前端开发 测试技术 开发者
MVC模式在现代Web开发中有哪些优势和局限性?
MVC模式在现代Web开发中有哪些优势和局限性?
|
3月前
|
开发者 前端开发 Java
架构模式的诗与远方:如何在MVC的田野上,用Struts 2编织Web开发的新篇章
【8月更文挑战第31天】架构模式是软件开发的核心概念,MVC(Model-View-Controller)通过清晰的分层和职责分离,成为广泛采用的模式。随着业务需求的复杂化,Struts 2框架应运而生,继承MVC优点并引入更多功能。本文探讨从MVC到Struts 2的演进,强调架构模式的重要性。MVC将应用程序分为模型、视图和控制器三部分,提高模块化和可维护性。
48 0
|
3月前
|
Java Spring Maven
Struts 2遇见Spring:这个组合如何颠覆你的Web开发?
【8月更文挑战第31天】在现代Web开发中,Struts 2与Spring的结合使用能显著增强应用的模块化和可维护性。本文将介绍如何整合这两个框架,并提供代码示例。首先,在`pom.xml`中添加Struts 2和Spring的依赖,然后在`struts.xml`中配置Struts 2以识别Spring插件。接着,在Spring配置文件中定义bean,并在Struts 2的Action类中使用`@Autowired`注解进行自动注入。
50 0
下一篇
无影云桌面