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

简介: 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


相关文章
|
5月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
5月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
6月前
|
自然语言处理 搜索推荐 Java
Spring i18n:@LocaleResolver 和 @RequestToViewName 指南
国际化是设计支持多语言和区域适配的应用程序的关键,有助于扩大市场覆盖、提升用户体验。Spring 提供了丰富的内置支持,如 `MessageSource`、`LocaleResolver` 和 `RequestToViewNameTranslator`,帮助开发者高效实现多语言切换和区域设置管理。通过结合 `@LocaleResolver` 识别用户语言环境,并配合 `@RequestToViewNameTranslator` 动态渲染视图,可构建高度本地化、灵活且用户友好的全球应用。
255 2
Spring i18n:@LocaleResolver 和 @RequestToViewName 指南
|
12月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
674 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
6月前
|
存储 安全 Java
如何在 Spring Web 应用程序中使用 @SessionScope 和 @RequestScope
Spring框架中的`@SessionScope`和`@RequestScope`注解用于管理Web应用中的状态。`@SessionScope`绑定HTTP会话生命周期,适用于用户特定数据,如购物车;`@RequestScope`限定于单个请求,适合无状态、线程安全的操作,如日志记录。合理选择作用域能提升应用性能与可维护性。
276 1
|
12月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
1270 0
|
12月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
751 0
|
12月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
676 0
|
12月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
473 0
|
7月前
|
存储 NoSQL Java
探索Spring Boot的函数式Web应用开发
通过这种方式,开发者能以声明式和函数式的编程习惯,构建高效、易测试、并发友好的Web应用,同时也能以较小的学习曲线迅速上手,因为这些概念与Spring Framework其他部分保持一致性。在设计和编码过程中,保持代码的简洁性和高内聚性,有助于维持项目的可管理性,也便于其他开发者阅读和理解。
225 0