在Spring Boot中,异常的统一处理,可以使用Spring中的@ControllerAdvice来处理,也可以通过自定义处理
静态异常页面
在Controller中创建一个异常程序
@RequestMapping("/errors")
@ResponseBody
public String errors() throws IOException {
int i=1/0;
return "成功";
}
前台请求,会显示如下错误页面
这种页面是不能直接展示给用户的
静态异常页面的定义
固定错误类型
定义未知为resources/error/ 下面
这样一旦出现错误,就会自动跳转到这个页面
不固定错误类型
同样定义在
定义未知为resources/error/ 下面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>页面找不到了</h1>
</body>
</html>
这样出现所有的400—499的错误都会定义到4xx页面,要注意的是:如果既有400.html,又有4xx.html出现400错误的时候回优先选择400.html
动态异常页面
动态的异常页面定义方式和静态的基本一致,可以采用的页面模板有jsp,freemarker,thymeleaf,html
动态页面也支持静态页面的表现方式,但是动态异常页面可以显示异常的原因
thymeleaf
这里使用thymeleaf 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
在templates下创建
内容如下
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="2">
<tr>
<td>path:</td>
<td th:text="${path}"></td>
</tr>
<tr>
<td>error:</td>
<td th:text="${error}"></td>
</tr>
<tr>
<td>message:</td>
<td th:text="${message}"></td>
</tr>
<tr>
<td>timestamp:</td>
<td th:text="${timestamp}"></td>
</tr><tr>
<td>status:</td>
<td th:text="${status}"></td>
</tr>
</table>
</body>
</html>
jsp
使用jsp需要配置全局的异常捕捉
新建类
package touxian_ssm.ssm.config;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author 偷闲
* @date 2019/5/23 15:25
*/
@ControllerAdvice
public class Error {
public static final String IMOOC_ERROR_VIEW = "error/error";
@ExceptionHandler(value = Exception.class)
public Object errorHandler(HttpServletRequest reqest,
HttpServletResponse response, Exception e) throws Exception {
e.printStackTrace();
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", reqest.getRequestURL());
mav.setViewName(IMOOC_ERROR_VIEW);
return mav;
}
}
创建error.jsp
jsp代码如下
<head>
<title>Title</title>
</head>
<body>
<h1 style="color: red">发生错误:</h1>
<div>${url}</div>
<div>${exception.message}</div>
</body>
</html>
异常页面的顺序是 发生错误->查找动态改错误页面—>查找静态改错误页面->查找动态xx错误页面->查找静态xx错误页面