index.jsp页面内容
touch
目标页to.jsp页面内容
target
处理请求方法controller类ComputerController代码
package com.jd.computer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ComputerController {
@RequestMapping("/computer/div.do")
public String div(int id) {
System.out.println(1/id);
return "to";
}
}
如果将传递的值id改为0,那么controller类中div方法将返回运行时异常,如下:
可见,如果我们不主动处理异常,那么当controller的方法出现异常时,就不会正确的显示我们预期的页面,因此可使用SpringMVC的两种方法来捕获并处理异常。
①在Spring配置文件添加
②在Controller类内添加异常处理方法,并用@ExceptionHandler注解修饰
package com.jd.computer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ComputerController {
@ExceptionHandler({ArithmeticException.class})//括号中可设置需要拦截异常的类型(可用{}数组拦截多个类型),此处拦截数学计算异常类型的异常
public ModelAndView exception(ArithmeticException e) {
e.getStackTrace();
ModelAndView mv = new ModelAndView("error");//跳转到异常页面error
mv.addObject("exception", e);
return mv;
}
@RequestMapping("/computer/div.do")
public String div(int id) {
System.out.println(1/id);
return "to";
}
}
③设置异常页面
error.jsp页面内容
${exception }
注意:
Controller类中可设置多个异常处理方法,当handler方法出现异常时,会优先选择与@ExceptionHandler()注解指定异常类型相同的异常处理办法,如:
package com.jd.computer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ComputerController {
@ExceptionHandler({ArithmeticException.class})
public ModelAndView exception(ArithmeticException e) {
System.out.println("ArithmeticException");
e.getStackTrace();
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception", e);
return mv;
}
@ExceptionHandler({Exception.class})
public ModelAndView exception(Exception e) {
System.out.println("Exception");
e.getStackTrace();
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception", e);
return mv;
}
@RequestMapping("/computer/div.do")
public String div(int id) {
System.out.println(1/id);
return "to";
}
}
结果:
另外:
上面的异常处理方法只能处理本Controller类内部方法产生的异常,若想避免代码重复,使用一个异常处理办法处理多个handler类内部方法的异常则可如下定义:
定义一个异常提示类ExceptionAdvice并用@ControllerAdvice注解修饰,在其内部定义异常处理方法即可处理所有handler的异常
package com.jd.advice;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class ExceptionAdvice {
@ExceptionHandler({ArithmeticException.class})
public ModelAndView exception(ArithmeticException e) {
System.out.println("ArithmeticException");
e.getStackTrace();
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception", e);
return mv;
}
}
error