Spring MVC处理异常

Spring MVC处理异常

关于异常

  • 异常的体系结构:
Throwable
        Error
            OutOfMemoryError(OOM)
        Exception
            RuntimeException
                NullPointerException:某个为null的对象调用了属性或方法
                ClassCastException:强制转换为不匹配的数据类型
                ClassNotFoundException:尝试加载的类不存在
                IndexOutOfBoundsException:使用List集合时使用了越界的索引
                    ArrayIndexOutOfBoundsException:使用Array时使用了越界的索引
            SQLException:数据库相关异常
            IOException:输入输出(读写)异常
                FileNotFoundException:文件找不到

在Spring MVC中处理异常

  • 在Spring MVC中,提供了一种统一处理某种异常的机制,例如通过配置,可以对整个项目中的NullPointerException进行处理,那么,无论是项目的哪个环节出现该异常,都会自动按照配置的方式进行处理,而不用每个方法中逐一编写相关代码。

准备演示案例

  • 创建项目DAY07-SpringMVC-Exception,设计请求路径: http://SERVER:PORT/PROJECT/ex1.do http://SERVER:PORT/PROJECT/ex2.do
  • 以上3个请求将分别由ex1.jspex2.jsp页面显示。

使用SimpleMappingExceptionResolver

  • 在Spring MVC中,有SimpleMappingExceptionResolver类,用于配置异常与View组件的映射关系,如果确定某种异常出现后都会显示某个View组件,则在Spring的配置文件中:
​
    <bean class="xx.xx.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="异常类的全名">View组件名</prop>
                <prop key="异常类的全名">View组件名</prop>
                <prop key="异常类的全名">View组件名</prop>
            <props>
        </property>
    </bean>
​
  • 经过以上配置后,整个项目运行到任何位置,一旦出现以上配置过的异常,都会转发到匹配的View组件,在项目的各个方法中,不必再处理已经配置过的异常!
  • 这种做法的不足在于:只要是同一种异常,都是转发到同一个View组件,无法根据实际运行状态进行更加细化的处理,例如无法提示是哪个值错误或者某些原因导致的异常。

使用@ExceptionHandler

注意:使用SimpleMappingExceptionResolver处理异常时,不可以使用@ExceptionHandler!

  • 当需要统一处理异常时,可以在控制器类中自定义方法(方法名称自定义),并在方法上方添加@ExceptionHandler,与处理请求的方法类似,可以按需添加方法的参数,需要注意的,必须有Exception参数:
    @ExceptionHandler
    public String handleException(
        HttpServletRequest request,
        Exception ex) {
        System.out.println(ex.getClass());
        
        if (ex instanceof NullPointerException) {
            return "error1";
        } else if (ex instanceof ArrayIndexOutOfBoundsException) {
            return "error2";
        } else {
            return "error3";
        }
    }
  • 这种做法,是作用于当前控制器类内部的所有请求的处理!对其它控制器类中的异常是没有影响的!

Spring MVC小结

  1. 解决MVC中V与C的关系的,即如何接收请求并响应;
  2. 在Spring的配置文件中,最主要的配置是组件扫描和ViewResolver;
  3. 重点掌握@RequestMapping注解,还有@RequestParam注解;
  4. 掌握在处理请求时,如何获取请求参数(2种)和封装转发数据(ModelMap);
  5. 理解转发和重定向;
  6. 学会使用Interceptor
  7. 学会处理异常。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java思维导图

给你一份SpringBoot知识清单

在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架。或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用。因而Spri...

1594
来自专栏菩提树下的杨过

Spring 4.0.2 学习笔记(2) - 自动注入及properties文件的使用

接上一篇继续, 学习了基本的注入使用后,可能有人会跟我一样觉得有点不爽,Programmer的每个Field,至少要有一个setter,这样spring配置文件...

2196
来自专栏xingoo, 一个梦想做发明家的程序员

JSP中文乱码问题

之前总是碰到JSP页面乱码的问题,每次都是现在网上搜,然后胡乱改,改完也不明白原因。 这次正好作下总结,中文乱码就是因为编码不符,可能出现乱码有四个地方: ...

4089
来自专栏JAVA高级架构

spring和springMVC的面试问题总结

1.Spring中AOP的应用场景、Aop原理、好处? 答:AOP--Aspect Oriented Programming面向切面编程;用来封装横切关注点,具...

3719
来自专栏李家的小酒馆

SpringMVC知识一锅烩

Spring简介 SpringMVC和Struts2一样都是属于表现层的框架,将前段发出的请求分发给对应的后端处理器即Controller 处理流程 用户请求被...

2000
来自专栏JMCui

Netty 系列四(ChannelHandler 和 ChannelPipeline).

    先来整体的介绍一下这篇博文要介绍的几个概念(Channel、ChannelHandler、ChannelPipeline、ChannelHandlerC...

1242
来自专栏Spring相关

第1章—Spring之旅—容纳你的Bean

1、Bean自身的方法  :  这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法

1201
来自专栏美码师

补习系列-springboot mime类型处理

MIME的全称是Multipurpose Internet Mail Extensions,即多用途互联网邮件扩展,尽管读起来有些拗口,但大多数人可能都知道, ...

1912
来自专栏JavaEdge

责任链模式

3766
来自专栏你不就像风一样

史上最全面的Spring Boot配置文件详解

Spring Boot在工作中是用到的越来越广泛了,简单方便,有了它,效率提高不知道多少倍。Spring Boot配置文件对Spring Boot来说就是入门和...

1.7K2

扫码关注云+社区

领取腾讯云代金券