系统中的异常包括两类: '预期异常'和'运行时异常',前者是通过捕获异常从而获取异常信息,后者是通过规范代码开发、测试等手段避免异常发生
系统的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"/>