情景实例:
index.jsp页面内容
<a href="./computer/div.do?id=1">touch</a>
目标页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的两种方法来捕获并处理异常。
一、java代码处理
①在Spring配置文件添加<mvc:annotation-driven>注解
<mvc:annotation-driven></mvc:annotation-driven>
②在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;
}
}
二、使用Spring配置处理异常
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.jd"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/view/" p:suffix=".jsp"></bean>
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置SimpleMappingExceptionResolver视图解析器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 配置异常属性名:exceptionAttribute默认值为exception,此时jsp页面通过${exception}显示异常信息;添加<property name="exceptionAttribute" value="ex"></property>配置后,则通过${ex}显示异常信息 -->
<property name="exceptionAttribute" value="e"></property>
<property name="exceptionMappings">
<props>
<!-- 服务器端异常均指向error.jsp页面 -->
<prop key="java.lang.Throwable">error</prop>
</props>
</property>
</bean>
</beans>