SpringMVC异常处理机制
-
创建
spring-exception
项目工程【web项目】-
在
pox.xml
配置文件中导入需要的依赖坐标和tomcat7插件<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>spring_exception</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build> </project>
-
在main包下创建
com.zcl.controller
包,并在包下创建DemoController
类package com.zcl.controller; import com.zcl.exception.MyException; import com.zcl.service.DemoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.io.FileNotFoundException; @Controller public class DemoController { @Autowired private DemoService demoService; @RequestMapping(value = "/show") public String show() throws FileNotFoundException, MyException { System.out.println("show running......"); //demoService.show1(); //demoService.show2(); //demoService.show3(); //demoService.show4(); demoService.show5(); return "index"; } }
-
在main包下创建
com.zcl.service
包,并在包下创建DemoService
接口package com.zcl.service; import com.zcl.exception.MyException; import java.io.FileNotFoundException; public interface DemoService { void show1(); void show2(); void show3() throws FileNotFoundException; void show4(); void show5() throws MyException; }
package com.zcl.service; import com.zcl.exception.MyException; import org.springframework.web.servlet.view.InternalResourceViewResolver; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; public class DemoServiceImpl implements DemoService { @Override public void show1() { System.out.println("抛出类型转换异常...."); Object str = "zhangsan"; Integer num = (Integer)str; } @Override public void show2() { System.out.println("抛出除零异常...."); int i = 1/0; } @Override public void show3() throws FileNotFoundException { System.out.println("文件找不到异常...."); InputStream in = new FileInputStream("C:/xxx/xxx/xxx.txt"); } @Override public void show4() { System.out.println("空指针异常....."); String str = null; str.length(); } @Override public void show5() throws MyException { System.out.println("自定义异常...."); throw new MyException(); } }
-
在main包下创建
com.zcl.exception
包,并在包下创建MyException
自定义异常类package com.zcl.exception; public class MyException extends Exception { }
-
在
resources
包下创建applicationContext.xml
配置文件<?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" xsi:schemaLocation=" 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.xsd "> <bean id="demoService" class="com.zcl.service.DemoServiceImpl"></bean> </beans>
-
在
webapp.WEB-INF
包下的web.xml
配置文件<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <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> </web-app>
-
在
resources
包下创建spring-mvc.xml
配置文件<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <!--1、mvc注解驱动--> <mvc:annotation-driven/> <!--2、配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> <!--3、静态资源权限开放--> <mvc:default-servlet-handler/> <!--4、组件扫描 扫描Controller--> <context:component-scan base-package="com.zcl.controller"/> </beans>
-
-
异常处理的思路
系统的Dao、Service、Controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,如下图:
-
异常处理的两种方式
-
使用Spring MVC提供的简单异常处理器SimpleMapping ExceptionResolver
启动项目访问:
http://localhost:8080/spring_exception/show
会出现页面报错提示<!--5、配置异常处理器--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!--配置之后有异常信息就会跳转到value声明的页面--> <!--<property name="defaultErrorView" value="error"/> 默认错误视图--> <property name="exceptionMappings"> <map> <!--key为异常的类型,value为对应异常的跳转路径--> <entry key="java.lang.ClassCastException" value="error"/> <entry key="java.lang.ClassCastException" value="error"/> </map> </property> </bean>
-
实现Springl的异常处理接口HandlerExceptionResolver自定义自己的异常处理器
-
创建异常处理器类实现HandlerExceptionResolver
在main包下创建
com.zcl.resolver
包并创建MyExceptionResolver
类实现接口,并重新接口的方法,完成异常的判断package com.itheima.resolver; import com.itheima.exception.MyException; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 项目名称:Spring * 描述:自定义异常处理器 * * @author zhong * @date 2022-05-05 20:49 */ public class MyExceptionResolver implements HandlerExceptionResolver { /** * 参数Exception:异常对象 * 返回值ModelAndView:跳转到错误视图信息 * @param httpServletRequest * @param httpServletResponse * @param o * @param e * @return */ @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView modelAndView = new ModelAndView(); // 根据参数e来判断异常 if(e instanceof MyException){ modelAndView.addObject("info","自定义异常"); }else if(e instanceof ClassCastException){ modelAndView.addObject("info","类转换异常"); } // 设置异常的跳转视图 modelAndView.setViewName("error"); return modelAndView; } }
-
配置异常处理器
<!--自定义异常配置,如果之前有配置spring-mvc的异常配置需要注释掉--> <bean class="com.itheima.resolver.MyExceptionResolver"/>
-
编写异常页面
-
测试异常跳转
-
-