SpringMVC自定义异常跳转类
思路解析
框架使用的是集中的异常处理。 把各个Controller中抛出的异常集中到一个地方处理。 处理异常的叫做异常处理器。
框架中使用两个注解完成异常的集中处理。 这样每个controller不用单独处理异常了。注解是:
1)@ExceptionHandler : 放在方法的上面,表示此方法可以处理某个类型的异常。 当异常发生时,执行这个方法。
- @ControllerAdvice: 放在类的上面, 表示这个类中有异常的处理方法。 相当于aop中的@Aspect.
@ControllerAdvice看做是 控制器增强, 就是给Controller类增加异常(切面)的处理功能.
带有@ControllerAdvice注解就表示这是一个异常处理器,处理器接收指定异常,执行操作方法。
实现步骤
首先要自定义一个异常类
public class NameException extends Exception{
public NameException() {
super();
}
public NameException(String message) {
super(message);
}
}
然后在创建一个异常处理器,用于捕获异常然后处理
/*
* @ControllerAdvice
* 标明这是一个异常处理器
* 抛出的异常会在这个类中寻找有没有相对应的处理方法
* */
@ControllerAdvice
public class StudentException {
/*
* 指定捕获异常
* @ExceptionHandler
* value的值是要捕获的异常类
* 只要是抛出的这个异常就会执行这个处理方法
* */
//这里的操作方法跟控制类的方法一样,返回数据到页面的操作也一样
@ExceptionHandler(value = NameException.class)
public ModelAndView hj(Exception e){
ModelAndView MV = new ModelAndView();
MV.addObject("exception","名字错误");
MV.setViewName("/Exception");
return MV;
}
}
异常处理器要交给容器管理,所有要在SpringMVC的配置文件中加载
<!-- 扫描ExceptionController包下的处理类-->
<context:component-scan base-package="ling.ExceptionController"/>
异常跳转页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
警告:<br/>
错误:${exception}
</body>
</html>
最后一步就是在访问控制方法中使用这个异常处理就行
@Controller
public class StudentExceptionA {
@RequestMapping("/ling")
public String inthh(Student user) throws NameException {
if (user.getName() == null || user.getName() == ""){
throw new NameException();
}
return user.toString();
}
流程
@Controller —》 @RequestMapping("/ling") —》 throw new NameException() —》@ControllerAdvice —》 @ExceptionHandler(value = NameException.class) --》return MV;
如果前端传来的参数中name为空,就会抛出name异常,异常处理类就会捕获并执行处理方法。