目录
1 Spring Boot对国际化的支持
1.1 语言包创建
-
右键resources->new->directory,新创建i18n(国际化的缩写)文件夹。
-
右键新创建的文件夹i18n->new->Resource Bundle
-
点击+按钮
-
添加zh_CN、en_US两项,并起名字为message(如果名字任意取)
-
配置spring.messages.basename属性
spring.messages.basename=i18n.message
-
添加key
-
以要添加login界面的多语言为例
右边三栏分别是默认显示的语言、英文、中文,这样添加的好处是同时添加了多个语言包。
1.2 根据本地语言自动切换语言包
-
修改登陆界面
注:login.html一定要放到模板目录下,因为我们将用Thymeleaf的message表达式获取配置文件里的内容<!DOCTYPE html> <html lang="en"> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title th:text="#{login.title}"></title> </head> <body> <form action="/login" method="POST"> [[#{login.username}]]<input type="text" name="userName"><br> [[#{login.password}]]<input type="password" name="password"><br> <input type="submit" th:value="#{login.login}"> <input type="reset" th:value="#{login.reset}"> </form> </body> </html>
-
效果
-
设置一下浏览器语言
-
刷新一下,可以看到我们的页面也改变了语言
1.3 实现手动切换
根据本地语言自动切换语言实现了,手动切换我们也实现一下。
在index.html页面添加以下代码
<br><a th:href="@{/(local=zh_CN)}">中文</a>
<a th:href="@{/(local=en_US)}">English</a>
接下来要做的就是自定义区域解析器
实现步骤:
- 自定义类MyLocaleResolver,实现LocaleResolver接口
- 重写resolveLocale方法
- 替换默认区域解析器
自定义MyLocaleResolver类代码如下:
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
//获取自定义请求头信息
String local = httpServletRequest.getParameter("local");
System.out.println(local);
//获取系统默认
Locale locale = Locale.getDefault();
if(!StringUtils.isEmpty(local))
{
String[] split = local.split("_");
//第一个参数为语言代码,第二个参数为国家代码
locale = new Locale(split[0],split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
在配置类中注入Spring IOC容器:
注 :返回值和方法名要和下面保持一致,否则无法替换原有的区域解析器
@Bean
public LocaleResolver localeResolver()
{
return new MyLocaleResolver();
}
效果
2 统一异常处理
先看一下在正常情况访问一个不存在的页面会显示什么:
当服务器发生内部错误时:
故意制造的错误
@GetMapping("/user/error")
public String error()
{
int i = 1/0;
return "success";
}
无论是4xx错误,还是5xx错误,直接采用Spring Boot默认的方式展现给用户,看起来并不友好。
Spring Boot针对错误页面,给出了特殊处理,可以用静态资源页面展示错误页面,也可以用模板引擎页面展示错误页面。
2.1 静态资源页面展示错误页面
在static/error或public/error目录下存放4xx.html、5xx.html(如果有更加详细的名字,如404.html、500.html,则优先用详细错误页面)
发生500错误时:
发生404错误时:
2.2 模板引擎页面展示错误页面,
在templates/error目录下存放,最后展示的效果和上面一样,就不展示了。
2.3 优先级
以发生404错误为例,采用精确优先原则
- 当有更加详细的错误页面时,用更加详细的错误页面
templates/error/404.html > static/error/404.html > templates/error/4xx.html > static/error/4xx.html - 静态页面和模板页面存在相同名字的错误页面时,优先用模板页面下的
2.4 错误页面可以获取到的内容
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验出现的错误
<body>
错误404。抱歉,该页面不存在。。。。
[[${timestamp}]]
</body>
2.5 添加自定义错误信息
除了3.6.4列出的错误信息外,Spring Boot还支持添加自定义错误信息。
步骤:
- 编写类,继承DefaultErrorAttributes类
- 重写getErrorAttributes,并在里面添加自定义信息
- 将其添加至Spring IOC容器
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String,Object> map = super.getErrorAttributes(webRequest,includeStackTrace);
map.put("email","[email protected]");
return map;
}
运行效果: