异常映射的作用:
统一管理项目中的异常
抛出异常
显示异常信息
- 普通请求:在页面上显示异常信息
- Ajax 请求:返回 JSON 数据
在springmvc中,一个请求如果是由mvc:view-controller处理的,在这过程中如果抛出了异常,那么就得用基于xml的异常映射来捕获处理这个异常。如果请求是有@RequestMapping这个注解来处理的,在这过程中发生了异常,那么就得使用基于注解的异常映射来捕获并处理这个异常。
mvc:view-controller是在springmvc.xml配置文件配置的
正因为view-controller是在xml配置的,所以他需要基于xml实现异常映射!
注意:通过@RequestMapping这个注解来处理的请求,在这个过程中抛出了异常,就会找基于注解的异常映射进行处理,如果没有配置基于注解的异常映射,那么就会找基于xml的异常映射
基于xml的异常映射实现:SimpleMappingExceptionResolver
<!--配置基于xml的异常映射-->
<!--是一个bean, SimpleMappingExceptionResolver-->
<bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--属性是exceptionMappings-->
<property name="exceptionMappings">
<props>
<!--key 是异常的类型-->
<!--标签体中是要映射的页面 他会根据视图解析器的配置映射成一个完整路径下的页面-->
<prop key="java.lang.Exception">system-error</prop>
</props>
</property>
</bean>
1.exceptionMappings是SimpleMappingExceptionResolver的一个成员属性。
2.prop中的system-error会经过视图解析器处理,所以如果发生java.lang.Exception异常就会跳转到system-error.jsp页面
基于注解的异常映射实现
这里就涉及两个注解了:
@ControllerAdvice:这个注解就是增强型控制器,代表这是基于注解的异常映射
@ExceptionHandler:将一个具体的异常类型和一个方法关联起来
步骤:
1.创建一个类,类上添加@ControllerAdvice注解
2. 写一个通用的异常处理方法,根据思路编写代码
private ModelAndView commonResolveException(HttpServletRequest request,
HttpServletResponse response,
Exception exception,
String viewName) throws IOException {
// 1.根据request获取请求
boolean judgeResult = CrowdUtil.judgeRequestType(request);
// 2.判断请求的类型
if (judgeResult) {
// 3. ajax请求
// 4. 调用ResultEntity的failed方法
ResultEntity<Object> failed = ResultEntity.failed(exception.getMessage());
//5 将ResultEntity对象转成JSON格式的数据
Gson gson = new Gson();
String json = gson.toJson(failed);
//6.将JSON格式的数据作为响应体数据返回给浏览器
response.getWriter().write(json);
//7.返回null,不给SpringMVC提供ModelAndView对象
return null;
}
//普通请求
//8.创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
// 9 将exception对象存入模型
modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
//10 设置目标视图名称,跳转到哪里
modelAndView.setViewName(viewName);
//11. 返回视图模型
return modelAndView;
}
这里涉及到一个工具类CrowdUtil,该工具类的作用是判断请求的类型 相关代码如下:
public class CrowdUtil {
/**
* 根据请求头中的accpet和X-Requested-With判断请求是普通请求还是ajax请求
* @return
* true:代表是ajax请求
* false: 代表 普通请求
*/
public static boolean judgeRequestType(HttpServletRequest request){
// 1.获取请求头信息
String accept = request.getHeader("Accept");
String requestHeader = request.getHeader("X-Requested-With");
//2 判断是普通请求还是ajax请求
return (accept != null && accept.equals("application/json"))
||
(requestHeader != null && requestHeader.equals("XMLHttpRequest"));
}
}
当然,也可以写一个或者多个具体异常处理 ,比如空指针异常NullPointException
/**
* 针对空指针异常处理
* @param request
* @param response
* @param exception
* @return
* @throws IOException
*/
@ExceptionHandler(NullPointerException.class)
public ModelAndView resolveNullPointException(HttpServletRequest request,HttpServletResponse response,NullPointerException exception) throws IOException {
String viewName="system-err";
return commonResolveException(request,response,exception,viewName);
}