之前我有篇文章讲解了一下springboot的错误处理机制,这篇文章讲解一下在springboot中定制错误页面。
先看以下项目结构
我的错误页面都放在了templates的error文件夹下,这样可以使用模板引擎处理(我这里使用Thymeleaf模板引擎)
1.默认处理方式
当你未写任何处理错误的代码时,则会默认调用BasicErrorController类中的errorHtml()方法,跳转到相应的视图。(404错误跳转到404.html页面, 其他类型的跳到4xx.html页面,500错误跳转到500.html,其他类型的跳转到5xx.html页面)
2.自定义处理方式
我在这里抛出一个异常来模拟一下。
先给出代码,等下再具体讲解。
@Controller
public class ExceptionController {
@GetMapping("/createError")
public void createError() {
String s = null;
s.length();
}
@ExceptionHandler(NullPointerException.class)
public ModelAndView exceptionHandlerOf4xx(HttpServletRequest request) {
ModelAndView model = new ModelAndView();
request.setAttribute("javax.servlet.error.status_code", 405);
model.setViewName("forward:/error");
return model;
}
}
浏览器输入http://localhost:8080/createError ,则会抛出一个空指针异常,通过 @ExceptionHandler(NullPointerException.class) 捕捉到该异常。通过request.setAttribute(“javax.servlet.error.status_code”, 405); 设置状态码为405,然后请求转发到 error 文件夹下匹配具体的状态码.html页面。(因为我的项目没有创建 405.html 文件,所以会转发到 4xx.html 页面)。到此就可以成功跳转到我们自定义的错误页面了。
成功的关键步骤在与request.setAttribute(“javax.servlet.error.status_code”, 405); 这个方法。现在具体讲解一下。
BasicErrorController 为错误页面处器,其中的errorHtml()方法处理如何跳转到错误页面。现在进入该方法。
该方法中有一个getStatus()方法来获取状态码。再进入该方法。
该方法中通过request.getAttribute() 方法获取RequestDispatcher.ERROR_STATUS_CODE表示的错误状态码。我们再看一下RequestDispatcher.ERROR_STATUS_CODE是什么。
RequestDispatcher.ERROR_STATUS_CODE表示的是字符串(“javax.servlet.error.status_code”),通过调用request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE)获取该字符串表示的值既可以获取状态码。(答案就出来了,通过request.setAttribute();方法 来设置状态码,则可以跳转到 状态码.html 页面)