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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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


相关文章
|
8天前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
40 7
|
19天前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
110 29
|
2月前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
69 4
|
2月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
103 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
3月前
|
XML Java 网络架构
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
169 0
|
3月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
234 2
|
4月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
79 4
|
4月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
4月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
79 2
|
4月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
324 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习

热门文章

最新文章

  • 1
    打造高效的Web Scraper:Python与Selenium的完美结合
    13
  • 2
    Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
    26
  • 3
    AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
    20
  • 4
    【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
    54
  • 5
    部署使用 CHAT-NEXT-WEB 基于 Deepseek
    342
  • 6
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 7
    java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
    40
  • 8
    零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
    28
  • 9
    【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
    22
  • 10
    FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
    55