开发传统Java WEB工程时,我们可以使用JSP页面模板语言,但是在SpringBoot中已经不推荐使用了。SpringBoot支持如下页面模板语言
FreeMarker
Velocity
Groovy
JSP
上面并没有列举所有SpringBoot支持的页面模板技术。其中Thymeleaf是SpringBoot官方所推荐使用的,下面来谈谈Thymeleaf实现应用国际化方法。
ps:当然现在开发基本上是前后端分离了,但是难免需要维护遗留项目或没有条件前后端分离的团队还是有很多的,这时候学会必要的前端技能,能达到事半功倍的效果。 添加Thymeleaf依赖要想使用Thhymeleaf,首先要在pom.xml文件中单独添加Thymeleaf依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>Spring Boot默认存放模板页面的路径在src/main/resources/templates或者src/main/view/templates,这个无论是使用什么模板语言都一样,当然默认路径是可以自定义的,不过一般不推荐这样做。另外Thymeleaf默认的页面文件后缀是.html
什么是国际化国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式。它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素。换言之,应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产。开发这样的程序的过程,就称为国际化。
Spring Boot Thymeleaf 代码实现国际化 1.配置文件代码WebConfiguration.java package com.easy.templateThymeleaf.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.SessionLocaleResolver; import java.util.Locale; @Configuration public class WebConfiguration implements WebMvcConfigurer { @Bean public LocaleResolver localeResolver() { SessionLocaleResolver localeResolver = new SessionLocaleResolver(); localeResolver.setDefaultLocale(new Locale("es", "ES")); return localeResolver; } @Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); localeChangeInterceptor.setParamName("lang"); return localeChangeInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); } } 2.控制器代码IndexController.java、LocaleController.java package com.easy.templateThymeleaf.controller; 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.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import java.util.Locale; @Controller public class IndexController { @Autowired private MessageSource messageSource; @RequestMapping(value = {"/index", "http://www.likecs.com/"}, method = RequestMethod.GET) public String index(Model model, Locale locale) { model.addAttribute("title", messageSource.getMessage("text.title", null, locale)); return "index"; } } package com.easy.templateThymeleaf.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import javax.servlet.http.HttpServletRequest; @Controller public class LocaleController { @GetMapping(value = "/locale") public String localeHandler(HttpServletRequest request) { String lastUrl = request.getHeader("referer"); return "redirect:" + lastUrl; } } 3.静态页面代码index.html <!DOCTYPE html> <html xmlns:th="https://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title th:text="${title}">Insert title here</title> <link th:href="@{/css/bootstrap.min.css}"> </head> <body> <nav> <a th:href="@{'http://www.likecs.com/'}">I18N Demo</a> <button type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span></span> </button> <div> <ul> <li> <a th:href="@{'http://www.likecs.com/'}" th:text="#{text.home}">Home</a> </li> </ul> <ul> <li> <button th:text="#{text.language}" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> </button> <div aria-labelledby="dropdownMenuButton"> <a th:href="@{/locale(lang=es_ES)}" th:text="#{text.language.chinese}">中文</a> <a th:href="@{/locale(lang=en_US)}" th:text="#{text.language.english}">英语</a> </div> </li> </ul> </div> </nav> <div> <div> <div> <h1 th:text="#{text.home.message}">Fluid jumbotron</h1> <p th:text="#{text.description}">This is a modified jumbotron that occupies the entire horizontal space of its parent.</p> </div> </div> </div> <footer> <script th:src="@{/js/jquery-3.3.1.min.js}"></script> <script th:src="@{/js/popper.min.js}"></script> <script th:src="@{/js/bootstrap.min.js}"></script> </footer> </body> </html> 4.语言配置文件