SpringMVC:05 框架异常处理机制

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值