1. 什么是异常处理器?
SpringMVC 在处理请求的过程中出现异常情况,可以采用 异常处理器 进行应对。简单来说,处理器在处理请求执行过程中出现异常,跳转到对应的视图,在视图上展示友好的信息。
SpringMVC为异常处理提供了一个异常处理接口:HandlerExceptionResolver
public interface HandlerExceptionResolver {
@Nullable
//返回一个ModelAndView 对象,表示异常处理跳转那个界面
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);
}
HandlerExceptionResolver 接口的实现目录,其中 DefaultHandlerExceptionResolver 和 SimpleMappingExceptionResolver 是最常用。
2. 默认的异常处理器
DefaultHandlerExceptionResolver 是SpringMVC 默认的异常处理器。核心方法如下:
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
//源代码中通过 判断业务抛出的异常信息,调用相对应的方法将状态码和错误信息封装到一个ModelAndView对象中,并将ModelAndView对象返回。
}
3. 自定义异常处理器
SimpleMappingExceptionResolver 是SpringMVC 提供给开发者自定义异常处理的处理器。其核心方法:
@Nullable
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
//获取视图名称
String viewName = this.determineViewName(ex, request);
if (viewName != null) {
//获取状态码
Integer statusCode = this.determineStatusCode(request, viewName);
if (statusCode != null) {
//将状态码,保存在 response中
this.applyStatusCodeIfPossible(request, response, statusCode);
}
//创建一个ModelAndView对象,通过ModelAndView方式将 异常信息和自定义的页面 保存在 request域中,并 return。
return this.getModelAndView(viewName, ex, request);
} else {
return null;
}
}
3.1 配置文件方式
通过在 springmvc.xml 文件中配置自定义异常处理,指定异常展示页面。配置信息如下:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<!--这里用来指定异常出现之后跳转的视图,可以配置多个键值对-->
<props>
<!--key是异常,要提供具体的异常类型,包括包名-->
<!--这种方式标志出现 IllegalAccessException,就会跳转ex2视图-->
<prop key="java.lang.IllegalAccessException">ex2</prop>
<!--这种方式代表只要出现异常,都会跳转下面指定的页面-->
<prop key="java.lang.Exception">页面名称1</prop>
</props>
</property>
<!--将异常信息存储到 request域中,value属性用来指定存储时的key。 底层: request.setAttribute("ex", 异常对象);-->
<property name="exceptionAttribute" value="ex"/>
</bean>
3.2 注解方式
通过注解方式直接自定义一个异常处理器,通过域数据共享的方式来将信息响应到指定页面中。代码如下:
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler
public String ex1(Exception e, Model model){ //这里参数 model map modelMap都可以
//异常信息自定义处理,可以在此处,也可以另写方法进行处理
//将数据封装到 request域中
model.addAttribute("ex",e);
return "页面名称";
}
@ExceptionHandler
public ModelAndView ex2(Exception e){
String viewName = "页面名称";
ModelAndView mv = new ModelAndView(viewName);
mv.addObject("ex", e);
return mv;
}
}