SpringBoot学习篇5[国际化、统一异常处理]

1 Spring Boot对国际化的支持

1.1 语言包创建

  1. 右键resources->new->directory,新创建i18n(国际化的缩写)文件夹。

  2. 右键新创建的文件夹i18n->new->Resource Bundle
    在这里插入图片描述

  3. 点击+按钮
    在这里插入图片描述

  4. 添加zh_CN、en_US两项,并起名字为message(如果名字任意取
    在这里插入图片描述

  5. 配置spring.messages.basename属性

    spring.messages.basename=i18n.message
    
  6. 添加key
    在这里插入图片描述

  7. 以要添加login界面的多语言为例
    在这里插入图片描述
    右边三栏分别是默认显示的语言、英文、中文,这样添加的好处是同时添加了多个语言包。
    在这里插入图片描述

1.2 根据本地语言自动切换语言包

  1. 修改登陆界面
    注: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>
    
  2. 效果
    在这里插入图片描述

  3. 设置一下浏览器语言
    在这里插入图片描述

  4. 刷新一下,可以看到我们的页面也改变了语言
    在这里插入图片描述

1.3 实现手动切换

根据本地语言自动切换语言实现了,手动切换我们也实现一下。
在index.html页面添加以下代码

<br><a th:href="@{/(local=zh_CN)}">中文</a>
<a th:href="@{/(local=en_US)}">English</a>

接下来要做的就是自定义区域解析器
实现步骤:

  1. 自定义类MyLocaleResolver,实现LocaleResolver接口
  2. 重写resolveLocale方法
  3. 替换默认区域解析器
    自定义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错误为例,采用精确优先原则

  1. 当有更加详细的错误页面时,用更加详细的错误页面
    templates/error/404.html > static/error/404.html > templates/error/4xx.html > static/error/4xx.html
  2. 静态页面和模板页面存在相同名字的错误页面时,优先用模板页面下的

2.4 错误页面可以获取到的内容

timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验出现的错误

<body>
    错误404。抱歉,该页面不存在。。。。
    [[${timestamp}]]
</body>

在这里插入图片描述

2.5 添加自定义错误信息

除了3.6.4列出的错误信息外,Spring Boot还支持添加自定义错误信息。
步骤:

  1. 编写类,继承DefaultErrorAttributes类
  2. 重写getErrorAttributes,并在里面添加自定义信息
  3. 将其添加至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;
    }

运行效果:
在这里插入图片描述

发布了41 篇原创文章 · 获赞 18 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章