准备工作
SpringBoot默认是支持Thymeleaf
模版引擎的。相应的如果使用Thymeleaf
就可以使用thymeleaf的语法在页面显示返回给页面的数据。
使用thymeleaf
导入starter
如图,SpringBoot自动配置是导入有Thymeleaf相关自动配置文件的,但是,红色部分是缺少的部分,也就是说少包。自然SpringBoot会提供这些相关的包的starters.
那么在官网上的starters中可以找到spring-boot-starter-thymeleaf
,说明SpringBoot提供Thymeleaf的starter需要导入,才能使用Thymeleaf
。
在SpringBoot中Thymeleaf的自动配置
1 | "spring.thymeleaf") (prefix = |
使用Thymeleaf进行页面渲染
所以在SpringBoot中在Controller中使用如下:
1 |
|
这样映射器就会自动映射到classpath:/templates/home.html
文件上。
在templates下建立home.html文件
1 |
|
重启后查看http://localhost:8080/home
发现已经可以让 /home
映射到 home.html
文件上了。并且根据我们传过来的值 Hello World~~~
显示在页面上了。
Thymeleaf语法可直接参考官方的文档;
使用SpringMVC
SpringMvc框架是一种丰富model view controller
的web框架。SpringMVC通过使用 @Controller
和 @RestController
完成对 HTTP
请求的处理。通过使用 @RequestMapping
完成对请求对controller的映射。
自动配置
SpringBoot
对 SpringMVC
在自动配置的时候,进行了很多默认的设置。包括前一篇文章中的关于静态资源加载的两种方式( Webjars
和本地加载位置),也是通过 SpringBoot
进行自动配置的。更多的 SpringBoot
对 SpringMVC
在哪些地方进行了自动配置,可以参考文档中的SpringMVC 特性。
自动配置代码参考
拿 ContentNegotiatingViewResolver
这个bean来说,SpringMVC的自动配置类是如何对拓展的支持。
1 |
|
通过上述代码的描述,可以发现如果自己实现ViewResolver,只需要实现ViewResolver后加入到容器中即可。SpringBoot会自动获取容器中的ViewResover。
定制开发
如果想保留 SpringBoot
的MVC特性,并且想去添加MVC配置如拦截器,视图控制器等,你可以添加自己的配置类,并且继承WebMvcConfigurer
,但是需要注意的是不能使用 @EnableWebMvc
注解。如果使用 @EnableWebMvc
注解,则表示要你全面接管SpringMvc配置功能,不使用SpringBoot自动配置的功能。
- 使用bean的方式,让
InnerViewResolver
自动发现容器中的ViewResolver
1 |
|
这样将一个ViewResolver放到容器中,那么前面说到的 InnerViewResolver
会自动的发现这个bean来使用。
- 使用
WebMvcConfigurer
实现
1 |
|
继承WebMvcConfigurer使用继承方法,将类放到容器中。
国际化开发
下面从自动配置入手,来看SpringBoot是怎么配置国际化的。
让SpringBoot配置指定国际化文件
1 | public class MessageSourceAutoConfiguration { |
如果对basename
的值的设置仍有疑惑,那来直接看解析basename
的代码。
1 | public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { |
国际化步骤
上面通过对SpringBoot对国际化的配置的分析,知道了在properties文件中怎么更改国际化文件的配置信息。下面来具体操作,进行国际化。
默认的国际化
创建国际化的properties
在resources文件夹下创建文件夹i18n
,在文件夹下右键创建Resource Bundle
文件。
左边project locale
中有三个选项,default和自己添加的zh_CN
和en_US
分别表示中文和英文。点击add All
后确认,创建文件。如下图:
双击其中的一个配置文件比如index.properties
,使用idea可以发现编辑区的左下角有一个Resource Bundle
tab页,点击之后,来到如下图的界面,新建一个选项,输入各配置文件中的值。
创建controller和html页面
创建
controller
1
2
3
4"/index") (
public String index(){
return "index";
}创建
html
页面1
2
3
4
5
6
7
8
9
10<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<-- 使用th:text会替换标签内的文本内容 使用#{}来表示国际化内容-->
<h1 th:text="#{index}">这里是主页</h1>
</body>
</html>
重启程序,发现index页面上显示的是主页
,这个内容,正好是在index_zh_CN.properties中定义的index
的值。SpringBoot会根据请求头中的语言来判断使用哪个配置文件中的内容。
如何切换页面的中英文?
在dispatcherServlet
中在渲染视图的时候,会通过locale
的属性来改变渲染后的语言。
1 | protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception { |
通过debug发现this.localeResolver
中是有值的,说明Spring
容器中有localeResolver,进而可以得出结论:SpringBoot
中自动配置来默认的localeResover
。
在WebMvcAutoConfiguration
中的确配置了关于locale的信息。
1 |
|
因为配置了默认的localeResolver
,所以在使用this.localeResolver.resolveLocale(request)
处理这个请求的时候,就会使用AcceptHeaderLocaleResolver
类中的方法,而这个方法正是拿的request
中的Accept-Language
1 |
|
这样的话疑惑就解开了,默认的SpringBoot构件web应用会使用当前浏览器的地区语言来进行国际化。
改变国际化语言标准的判断方式
上面说了默认的SpringBoot
会从request
中获取地区语言信息,来判断加载哪个配置。
在自动配置的方法上标注着这样一段@ConditionalOnMissingBean
,说明如果有localeResolver
这个类那么这个方法是不会生效的。所以改变的方法就是自己实现localeResolver
.
1 | public class MyLocalResolver implements LocaleResolver { |
稍微修改一下index.html
中的内容
1 | <body> |
重启程序,进行测试:
总结
如何在SpringBoot中使用国际化
- 编写国际化相关的
ResourceBundle
文件,也就是对应的语言配置文件如:index_en_US.properties
,index_zh_CN.properties
,注意这个文件格式是固定的xxx_语言代码_大写的国家代码
,并且必须是properties文件。 - 编写
html
接收国际化变量,使用Thymeleaf
引擎可以使用语法#{}
来使用国际化变量。
如何改造
因为SpringBoot默认实现了LocaleResolver
,并且标注了ConditionalOnMissingBean
注解,所以,只需要自己实现LocaleResolver
类,重写相关方法,就可以达到改造的目的。需要注意的是,在注册bean
的时候,方法名必须localeResolver
,或者指定bean
的名称为localeResolver
。