SpringMVC的异常处理
dao层、service层、web层(Controller)都把异常往外抛,抛给前端控制器DispatcherServlet去处理。怎么处理的?----它去调度,找来能够处理相应异常的处理器(handler)。
也就是将异常交给SpringMVC框架来统一处理!
SpringMVC提供了两种异常处理方式:
方式1:使用框架写好的异常处理器 SimpleMappingExceptionResolver类
“Simple”体现在哪?----它对异常的处理,只能是简单的页面跳转。
方式2:自定义异常处理器,实现HandlerExceptionResolver接口
实际应用中,通常都是去自定义异常处理器。因为它可以根据需要实现不同的功能。
准备工作:基础测试环境搭建
1、maven相关依赖与插件导入 省略
2、web.xml配置
使用SpringMVC框架,这个前端控制器的Servlet,是必配的!
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3、spring-mvc.xml配置
使用SpringMVC框架,有四大金刚,是必配的!
<!--1、组件扫描 扫描Controller-->
<context:component-scan base-package="com.yeats"/>
<!--2、mvc注解驱动 可代替数据数据格式转换器-->
<mvc:annotation-driven/>
<!--3、配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--4、静态资源权限开放-->
<mvc:default-servlet-handler/>
4、前端页面准备
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Hello Index</h1>
</body>
</html>
5、后台Bean对象准备
按dao层–>service层–>web层,去准备测试用的代码。(因为前端的层中,可能要注入后端层的对象。)
其他Bean对象准备
**(1)service层代码 **
异常就在service层中去造,不需要到dao层去造。因此也就不用写dao层代码了。
@Service
public class DemoService {
public void show1() {
System.out.println("抛出类型转换异常");ClassCastException
Object str = "zhangsan";
Integer num = (Integer) str;
}
public void show2() {
System.out.println("抛出被零除异常");java.lang.ArithmeticException: / by zero
int i = 1 / 0;
}
public void show3() throws FileNotFoundException {
System.out.println("抛出文件找不到异常");//FileNotFoundException
FileInputStream in = new FileInputStream("C:\\xxx\\xxx\\xxx.txt");
}
public void show4() {
System.out.println("抛出空指针异常");//NullPointerException
String str = null;
str.length();
}
public void show5() {
System.out.println("抛出自定义异常");//MyException
throw new MyException();得写一个MyException类,自定义异常去
}
}
show5()方法涉及到自定义的异常类MyException,因此,得补充一个MyException类。
写到exception包下去(见包知义)
public class MyException extends RuntimeException{
// 什么内容都不写。
}
(2)Controller类代码
@Controller
public class DemoController {
@Autowired
private DemoService demoService;
@RequestMapping("/show")
public String show() throws FileNotFoundException {
System.out.println("show running...");
demoService.show1();//抛出类型转换异常 ClassCastException
//demoService.show2();//抛出被零除异常 ArithmeticException
//demoService.show3();//抛出文件找不到异常 FileNotFoundException
//demoService.show4();//抛出空指针异常 NullPointerException
//demoService.show5();//抛出自定义异常 MyException
return "index";
}
}
一、使用框架写好的异常处理器
SimpleMappingExceptionResolver类
1、spring-mvc.xml中配置框架自带的异常处理器
<!--配置异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--默认跳转到的错误页面-->
<property name="defaultErrorView" value="error"/><!--前端需要一个error.jsp页面-->
<!--指定不同类型异常的跳转页面-->
<property name="exceptionMappings">
<map>
<entry key="java.lang.ClassCastException" value="error1"/>
<entry key="java.lang.ArithmeticException" value="error2"/>
<entry key="java.io.FileNotFoundException" value="error3"/>
<entry key="java.lang.NullPointerException" value="error4"/>
<entry key="com.yeats.exception.MyException" value="error5"/>
</map>
</property>
</bean>
前端需要对应地准备jsp页面:error.jsp error1.jsp error2.jsp error3.jsp error4.jsp error5.jsp
error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>error</h1>
</body>
</html>
error1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>java.lang.ClassCastException</h1>
</body>
</html>
相应地,error2.jsp~error5.jsp,在其中简单地写点内容即可!
2、部署项目,进行测试
浏览器请求URL:http://localhost:8080/spring_exception/show
根据Controller类中,show()方法里调用哪个方法,会跳转到不同的错误页面。
@RequestMapping("/show")
public String show() throws FileNotFoundException {
System.out.println("show running...");
demoService.show1();//抛出类型转换异常 ClassCastException
//demoService.show2();//抛出被零除异常 ArithmeticException
//demoService.show3();//抛出文件找不到异常 FileNotFoundException
//demoService.show4();//抛出空指针异常 NullPointerException
//demoService.show5();//抛出自定义异常 MyException
return "index";
}
二、自定义异常处理器
自定义异常处理器类,实现HandlerExceptionResolver接口
1、自定义异常处理器类 MyHandlerExceptionResolver
2、spring-mvc.xml中配置异常处理器
3、编写异常页面
4、部署项目,测试
1、自定义异常处理器类 MyHandlerExceptionResolver
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
/**
* 处理处理器(handler)执行期间可能抛出的异常。
*
* @param request 当前的http请求
* @param response 当前的http响应
* @param handler 处理器对象(Controller类中的业务方法对象)
* @param ex handler执行期间抛出的异常对象
* @return ModelAndView对象
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 创建模型视图对象
ModelAndView mv = new ModelAndView();
//处理异常的逻辑
if (ex instanceof ClassCastException) {
mv.addObject("errorMsg", "ClassCastException");
} else if (ex instanceof ArithmeticException) {
mv.addObject("errorMsg", "ArithmeticException");
} else if (ex instanceof FileNotFoundException) {
mv.addObject("errorMsg", "FileNotFoundException");
} else if (ex instanceof NullPointerException) {
mv.addObject("errorMsg", "NullPointerException");
} else if (ex instanceof MyException) {
mv.addObject("errorMsg", "MyException");
} else {
mv.addObject("errorMsg","error...");
}
// 设置跳转视图的名称
//不管发生何种异常,都往携带异常提示信息,往error.jsp页面跳转
mv.setViewName("error");//页面异常
// 返回ModelAndView对象
return mv;
}
}
异常页面error.jsp页面,要添加
2、spring-mvc.xml中配置异常处理器
它就是一个Bean对象,配置标签
<!--配置自定义异常处理器-->
<bean class="com.yeats.resolver.MyHandlerExceptionResolver"/>
3、编写异常页面
异常页面error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>error</h1>
<h2>${errorMsg}</h2><%--获取后台返回的ModelAndView对象信息--%>
</body>
</html>
4、部署项目,测试
请求URL:http://localhost:8080/spring_exception/show 请求Controller中的处理器(方法)
根据处理器抛出的不同异常,error.jsp页面会显示不同内容,如:
error
ArithmeticException