系统中的异常包括两类: '预期异常'和'运行时异常',前者是通过捕获异常从而获取异常信息,后者是通过规范代码开发、测试等手段避免异常发生
系统的Dao、Service、Controller层出现的异常,我们只需要throws Exception向上抛出即可,最后由SpringMVC前端控制器的异常处理器来处理 本质: 我们写的时候出现异常的话,抛出即可,最后在SpringMVC框架的前端控制器统一处理异常
模拟异常如下(->表示向谁请求,<-表示向谁抛异常,<<表示已经解决异常)
客户端 -> 前端控制器 -> Controller层 -> Service层 -> Dao层 客户端 << 前端控制器 <- Controller层 <- Service层 <- Dao层
我们发现,异常是在前端控制器这里被处理的,前端控制器是通过'HandlerExceptionResolver'组件(也叫异常处理器)来解决异常
1、使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver
2、实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器
SpringMVC已经定义好了该'类型转换器',我们在使用时可以根据项目情况进行相应异常与视图的映射配置。具体操作:
第一步: 在src/main/java/com.huanf目录下新建3个文件夹,分别为controller、exception、service 在controller文件夹里面新建DemoController类,里面写入如下
public class DemoController { private DemoService demoService;
(value = "/show") public String show(String name) throws FileNotFoundException, MyException { System.out.println("show方法正在执行"); //下面会列举5中异常,都是可以自行修改的,可在DemoServiceImpl类、spring-mvc.xml、webapp目录下修改 //demoService.show1();//会在网页显示:error1提示页面,java.lang.ClassCastException类型转换异常 //demoService.show2();//会在网页显示: //demoService.show3();//会在网页显示 //demoService.show4();//会在网页显示 demoService.show5();//会在网页显示:error2提示页面,com.huanf.exception.MyException自定义异常 return "index"; }}
第二步: 在exception文件夹里面新建MyException类,里面写入如下
public class MyException extends Exception {}
第三步: 在service文件夹里面新建DemoService接口,里面写入如下
void show1();void show2();void show3() throws FileNotFoundException;void show4();void show5() throws MyException;
第四步: 在service文件夹里面写入如下
public void show1(){ System.out.println("抛出类型转换异常..."); Object str = "zhangsan"; Integer num = (Integer) str;}public void show2(){ System.out.println("抛出除零异常..."); int i = 1/0;}public void show3() throws FileNotFoundException{ System.out.println("文件找不到异常..."); InputStream in = new FileInputStream("C:/xxx/xxx/xxx.txt");}public void show4(){ System.out.println("空指针异常..."); String str = null; str.length();}public void show5() throws MyException{ System.out.println("自定义异常..."); throw new MyException();}
第五步: 在spring-mvc.xml里面添加如下:
<!--mvc的注解驱动--> <mvc:annotation-driven/><!--配置内部资源视图解析器,指定前后缀,简化后期配置视图的跳转--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--指定前缀。prefix表示前缀。/表示我们的视图页面在webapp/目录下--> <property name="prefix" value="/"/> <!--指定后缀。suffix表示后缀。由于每个页面的后缀都是jsp,所以values就为.jsp--> <property name="suffix" value=".jsp"/></bean><!--静态资源放行,也就是让别人能访问我们本地的资源,开放静态资源的访问权限--><mvc:default-servlet-handler/><!--组件扫描,扫描Controller层--><context:component-scan base-package="com.huanf.controller"/>
<!--配置异常处理器--><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!--第一种:系统默认,意思就是只要报异常,就会跳转到error.jsp页面--> <property name="defaultErrorView" value="error"></property> <!--第二种:自定义,优先级比第一种要高。也就是出现异常之后,会优先跳转自定义的页面,例如error1.jsp、error2.jsp--> <property name="exceptionMappings"> <map> <!--key写的是具体报的异常名字,不是自己写随便的,value写的是当出现这个key异常你将要跳转到哪个页面--> <entry key="java.lang.ClassCastException" value="error1"/> <entry key="com.huanf.exception.MyException" value="error2"/> </map> </property></bean>
第六步: 在applicationContext.xml里面写入如下:
<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 class="com.huanf.service.DemoServiceImpl"/></beans>
第七步: 在web.xml里面写入如下
<servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--告诉前端控制器,我们的SpringMVC的配置文件在哪里--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <!--服务器启动时就加载Servlet--> <load-on-startup>1</load-on-startup></servlet><!--配置映射地址--><servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern></servlet-mapping><!--优化监听器,配置全局初始化参数--><context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value></context-param><!--配置spring给我们提供的监听器--><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
自定义异常处理步骤
1、建异常处理器类实现HandlerExceptionResolver
2、配置异常处理器
3、编写异常页面
4、测试异常跳转
具体操作:
第一步: 在com.huanf目录下新建文件夹resolver,在resolver里面新建MyExceptionResolver类,在MyExceptionResolver类里面写入如下
public class MyExceptionResolver implements HandlerExceptionResolver { /* 参数Exception: 异常对象 返回值ModelAndView: 要跳转哪个视图 */ public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { //定义 ModelAndView modelAndView = new ModelAndView(); //如果是我们写的自定义异常 if(e instanceof MyException){ modelAndView.addObject("info","自定义异常处理器--这是自定义异常"); //如果是类转换异常 }else if (e instanceof ClassCastException){ modelAndView.addObject("info","自定义异常处理器--这是系统的类转换异常"); } //添加要跳转的视图,例如error_MyExceptionResolver.jsp modelAndView.setViewName("error_MyExceptionResolver"); return modelAndView; }}
第二步: 在webapp下新建一个页面,为error_MyExceptionResolver.jsp,里面自己写入一些内容
第三步: 在spring-mvc.xml里面添加如下
<!--自定义异常处理器,注意使用这个的时候,要把上面那个'配置异常处理器'注释掉,不然冲突--><bean class="com.huanf.resolver.MyExceptionResolver"/>