springMVC异常处理的知识点+异常处理案例

news2025/8/3 8:37:34

springMVC异常处理的知识点+异常处理案例

异常介绍:

我们知道系统中的异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生

在SpringMVC处理异常的方式为:将系统的Dao、Service、Controller出现的异常都通过throws Excepton 向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理

如下图所示:

在这里插入图片描述

异常处理:

在SpringMVC中异常处理有三种方法:

**第一种:**Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver

<!--配置mvc提供的默认异常处理器:simpleMapperExceptionResolver-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="defaultErrorView" value="error"></property><!--表示所有没有指定的异常,都跳转到异常处理页面error-->
    <property name="exceptionAttribute" value="ex"></property> <!--表示异常处理页面中访问的异常对象变量名是ex-->
    <!-- 异常映射exceptionMappings表示映射的异常,接受参数是一个Properties,key是异常类名,value是处理异常的页面-->
    <property name="exceptionMappings">
        <map>
            <entry key="NullPointerException" value="error"></entry>
            <entry key="ClassCastException" value="error"></entry>
        </map>
    </property>
</bean>

**第二种:**实现Spring的异常处理接口HandlerExceptionResolver 自定义的异常处理器

①创建异常处理器类实现HandlerExceptionResolver

public class MyExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    //处理异常的代码实现
    //创建ModelAndView对象
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("exceptionPage");
    return modelAndView;
    }
}

②配置异常处理器

<bean id="exceptionResolver" class="com.exception.MyExceptionResolver"/>

③编写异常页面:exceptionPage

**第三种方法:**使用@ExceptionHandler注解实现异常处理;

使用方法有两种:

​ 1.在可能出现异常的Controller层进行异常处理,也就是在同一个类中进行异常处理:@Controller+@ExceptionHandler

@Controller
@RequestMapping("/testController")
public class TestController {
 
    @RequestMapping("/demo1")
    @ResponseBody
    public Object demo1(){
        int i = 1 / 0;
        return new Date();
    }
 
    @ExceptionHandler({RuntimeException.class})
    public ModelAndView fix(Exception ex){
        System.out.println("do This");
        return new ModelAndView("error",new ModelMap("ex",ex.getMessage()));
    }
}

注意事项:

1.一个Controller下多个@ExceptionHandler上的异常类型不能出现一样的,否则运行时抛异常.

​ Ambiguous @ExceptionHandler method mapped for;

2.@ExceptionHandler下方法返回值类型支持多种,常见的ModelAndView,@ResponseBody注解标注, ResponseEntity等类型都OK.

2.全局级别处理:@ControllerAdvice+@ExceptionHandler

@ControllerAdvice
public class GlobalController {
 
    @ExceptionHandler(RuntimeException.class)
    public ModelAndView fix1(Exception e){
        System.out.println("全局的异常处理器");
        ModelMap mmp=new ModelMap();
        mmp.addAttribute("ex",e);
        return new ModelAndView("error",mmp);
    }
}

用法说明: 与第一种方式用法相同,返回值支持ModelAndView,@ResponseBody等多种形式.

异常处理案例

上面我们已经了解了SpringMVC的三种方法,下面我们分别用上面的方法来做几个案例吧!

第一个案例:使用SpringMVC提供的方法

第一步:创建一个maven项目:略

第二步:在pom.xml中添加以下的依赖或插件坐标:

 	<build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <path>/</path>
                    <uriEncoding>UTF-8</uriEncoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.18</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <packaging>war</packaging>

第三步:在项目中添加webapp/WEB-INF结构:略

第四步:在resources中添加spring-mvc.xml文件,并在web.xml中加载spring-mvc.xml文件;

sping-mvc.xml文件:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">
    <!--配置注解扫描-->
    <context:component-scan base-package="com"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"></property>
        <property name="suffix" value=".jsp"></property>

    </bean>



    <!--配置mvc提供的默认异常处理器:simpleMapperExceptionResolver-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--        表示所有没有指定的异常,都跳转到异常处理页面error-->
        <property name="defaultErrorView" value="commonPage"></property>
        <!--表示异常处理页面中访问的异常对象变量名是ex-->
        <property name="exceptionAttribute" value="ex"></property>
        <!-- 异常映射
           exceptionMappings表示映射的异常,接受参数是一个Properties
           key是异常类名,value是处理异常的页面
      -->
        <property name="exceptionMappings">
            <map>
                <entry key="NullPointerException" value="spacialPage"></entry>
                <entry key="ClassCastException" value="spacialPage"></entry>
            </map>
        </property>
    </bean>

</beans>

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">
    <!--项目启动时的页面-->
    <welcome-file-list>
        <welcome-file>/login.jsp</welcome-file>
    </welcome-file-list>
    <!--加载spring-mvc.xml文件-->
    <servlet>
        <servlet-name>spring-mvc</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>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
</web-app>

第五步:在main/java包下创建com/Controller包,并在Controlle包下创建ExceptionTest类;

如果看不懂第五步说的是什么,那么请看下面的项目结构:

在这里插入图片描述

ExceptionTest类:

@Controller
@RequestMapping("/com")
public class ExceptionTest {
    @RequestMapping("/IOException")
    public void IOExceptionLocation() throws IOException {
        throw new IOException("抛出IO异常");
    }
    @RequestMapping("/NullPointerException")
    public void NullPointerExceptionLocation() throws NullPointerException {
        throw new NullPointerException("空指针异常,请检查");
    }
    @RequestMapping("/OutOfMemoryError")
    public void OutOfMemoryErrorLocation() throws OutOfMemoryError {
        throw new OutOfMemoryError("内存溢出,请检查");
    }
    @RequestMapping("/ClassCastException")
    public void ClassCastExceptionLocation() throws ClassCastException {
        throw new ClassCastException("类型转换异常,请检查");
    }
}

第六步:在webapp下创建login.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>首页:异常显示页</h2>
<a href="/com/IOException">IO异常处理</a><br/>
<hr/>
<a href="/com/NullPointerException">空指针异常</a><br/>
<hr/>
<a href="/com/OutOfMemoryError">内存溢出</a><br/>
<hr/>
<a href="/com/ClassCastException">类型转换异常</a><br/>


</body>
</html>

第七步:在WEB-INF包下创建一个page包,在page包下创建commonPage.jsp页面和spacialPage.jsp页面:

commonPage.jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>普通处理页面</h2>
异常信息:${requestScope.ex.message}

</body>
</html>

spacialPage.jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>特殊处理页面</h2>
特殊处理的异常信息:${requestScope.ex.message}

</body>
</html>

上面我们的第一个案例就做好了,下面我们来演示效果:

1.运行项目,开始页面:

在这里插入图片描述

2.点击IO异常处理:

3.点击空指针异常:

在这里插入图片描述

4.点击内存溢出:

在这里插入图片描述

5.点击类型转换异常:

在这里插入图片描述


效果讲解:细心的人会发现 点击空指针异常类型转换异常的时候页面会跳转到特殊处理页面 ,点击IO异常处理内存溢出的时候页面会跳转到普通处理页面这是为什么呢?

原因很简单:我们在配置mvc提供的默认异常处理器的时候指定的了空指针异常类型转换异常回调到特殊处理页面,其他的异常没有指定的异常我们设置了默认跳转到普通处理页面,如下图:
在这里插入图片描述

第二个案例:实现接口HandlerExceptionResolver 自定义的异常处理器

第二个案例是在第一个案例的基础上进行修改的,说一很多步骤都和第一个案例相同;

第一步第二步第三步同第一个案例;

第四步:在resources中添加spring-mvc.xml文件,并在web.xml中加载spring-mvc.xml文件;

sping-mvc.xml文件:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">
    <!--配置注解扫描-->
    <context:component-scan base-package="com"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

web.xml文件:同第一个案例;

第五步:在第一个案例的第五步的基础上,在com包下添加一个ExceptionHadlele包,并在该ExceptionHadlele包下添加myHandleExecption类(重点)

项目包结构如下:

在这里插入图片描述

myHandleExecption类:

public class myHandleExecption implements HandlerExceptionResolver {
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("异常处理器正在执行中");
        //创建模型视图对象,用于方法放回
        ModelAndView result = new ModelAndView();

        result.addObject("msg",ex.getMessage());
        //根据异常类型返回不同的视图信息
        if(ex instanceof IOException){
            result.setViewName("spacialPage");
        }else if(ex instanceof NullPointerException){
            result.setViewName("spacialPage");
        }else {
            result.setViewName("commonPage");
        }
        return result;
    }
}

第六步:在spring-mvc.xml配置异常处理器

    <!--配置异常处理器-->
    <bean id="exceptionResolver" class="com.ExecptionHandle.myHandleExecption"></bean>

第七步:同第一个案例的第六步+第七步

演示效果:

首页跟案例一一样:

在这里插入图片描述

在这里插入图片描述

通过效果可以知道IO异常处理和空指针异常处理点击后会跳转到特殊处理页面,其他异常会跳转到普通处理页面,这个也是跟案例一的原理差不多的;我在myHandleExecption类中定义了IOException和NullPointerException的处理会调转到特殊处理页面

第三个案例:使用@ExceptionHandler注解实现异常处理

第三个案例也是在第一个案例的基础上的修改的,主要是让大家知道三种异常处理的用法

1.修改案例一中的spring-mvc.xml文件:将配置mvc提供的默认异常处理器删除;

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">
    <!--配置注解扫描-->
    <context:component-scan base-package="com"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>


</beans>

2.在ExceptionTest类中添加配上@ExceptionHandler注解的方法,也就是@Controller+@ExceptionHandler;

@Controller
@RequestMapping("/com")
public class ExceptionTest {
    @RequestMapping("/IOException")
    public void IOExceptionLocation() throws IOException {
        throw new IOException("抛出IO异常");
    }
    @RequestMapping("/NullPointerException")
    public void NullPointerExceptionLocation() throws NullPointerException {
        throw new NullPointerException("空指针异常,请检查");
    }
    @RequestMapping("/OutOfMemoryError")
    public void OutOfMemoryErrorLocation() throws OutOfMemoryError {
        throw new OutOfMemoryError("内存溢出,请检查");
    }
    @RequestMapping("/ClassCastException")
    public void ClassCastExceptionLocation() throws ClassCastException {
        throw new ClassCastException("类型转换异常,请检查");
    }
    @ExceptionHandler({IOException.class,NullPointerException.class})
    public ModelAndView exception1(Exception ex){
        ModelAndView view=new ModelAndView();
        view.addObject("msg",ex.getMessage());
        view.setViewName("commonPage");
        return view;
    }

}

3.在com包下添加ExecptionHandle包,并在ExecptionHandle包下添加GlobalController类–>@ControllerAdvice+@ExceptionHandler

包目录结构:

在这里插入图片描述

GlobalController类:

@ControllerAdvice
public class GlobalController {
    @ExceptionHandler
    public ModelAndView exception1(Exception ex){
    ModelAndView view=new ModelAndView();
    view.addObject("msg",ex.getMessage());
    view.setViewName("commonPage");
    return view;
    }
}

以上就是案例三了,我们先测试一下效果;

首页同第一个案例:

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有关服务器虚拟化的常见问题解答

虚拟化”一词经常使用&#xff0c;尤其是与服务器相关的时候。以下是一些有关服务器虚拟化常见问题的解答。 什么是服务器虚拟化? 虚拟化是一个经常应用于范围广泛的技术的术语。从本质上讲&#xff0c;虚拟化技术就是使用分布式软件硬件。在服务器虚拟化领域&#xff0c;这意…

Android

直接运行 最新版的 apktool 可以通过brew安装&#xff0c;命令如下 brew install apktool # 验证安装结果apktool -version (Mac)反编译Android APK详细操作指南[ApkTool,dex2jar,JD-GUI] - CrazyCodeBoy的技术博客官网|CrazyCodeBoy|Devio|专注移动技术开发(Android&I…

【计算机网络】广域网协议分析

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录广域网WAN广域网局域网区别PPP协议----链路层------广域网PPP协议组成3个ppp状态图PPP协议帧格式HDLC协议--------链路层------广域网帧格式------无监信PPP协议和HDLC&#x1f343;博主昵称&#xff1a;一拳…

通用Mapper获取数据表中id为0解决方法。千万别瞎改int为integer了

项目场景&#xff1a; 最近准备自己写一个框架。由于是舍弃了成熟框架&#xff0c;所以在集成一些组件的时候&#xff0c;发现了一些之前没有注意过的问题。 这次是集成通用mapper时出现的一个问题。。。 问题描述 使用通用Mapper的selectAll()方法后&#xff0c;得到的id值都…

Java【抽象类和接口】是什么?

文章目录前言一、抽象类1.什么是抽象类2.抽象类的特征3.抽象类的作用二、接口1.什么是接口2.语法规范3.接口的使用4.接口的特征5.实现多个接口6.接口间的继承总结前言 前篇文章分享过了 面向对象语言的三大特征&#xff1a;封装&#xff0c;继承&#xff0c;多态 本篇呢将继续…

LCR表测电容怎么实现连续测试?ATECLOUD云测试平台帮您解决

河南某企业在生产测试中需要用到LCR表测试电容的容量和损耗&#xff0c;目前在使用是德科技E4980a LCR 测试数据时&#xff0c;发现不能连续测试&#xff0c;不能自动记录数据。通过和纳米软件Namisoft沟通&#xff0c;希望我们可以实现连续测试并将测试数据自动记录&#xff0…

steam搬砖项目,当下最稳定长久的

我为什么这么推荐普通人来做CSGO搬砖&#xff0c;最主要的原因就两点&#xff0c;一是平台流量大知道的人少&#xff0c;二就是不需要什么成本&#xff01; CSGO是基于steam衍生出来的&#xff0c;steam的流量池有多大&#xff0c;想必大家都心知肚明&#xff0c; Steam平台是…

实验(一):开发环境的安装及基本操作

一、实验目的与任务 实验目的&#xff1a; 1. 掌握KeilC集成开发环境的安装及基本操作&#xff1b; 2. 掌握Protues仿真软件的安装及基本操作。 任务&#xff1a; 1.完成KeilC集成开发环境的安装&#xff0c;建立工程&#xff1b; 2. 完成Protues仿真软件的安装&#xff0c;建立…

[附源码]java毕业设计票务销售网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Gartner发布首份中国RPA魔力象限报告,弘玑Cyclone被重点推荐

11月17日&#xff0c;国际权威研究机构Gartner重磅发布首份中国RPA魔力象限报告&#xff1a;《China Context: Magic Quadrant for Robotic Process Automation》。 毫无悬念&#xff0c;在2022全球RPA魔力象限报告&#xff08;Gartner RPA MQ&#xff09;中表现优异的弘玑Cyc…

魔百和CM311-1A_YST、(YM)_安卓9_S905L3A_默认开启ADB_纯净精简语音_完美线刷包

魔百和CM311-1A_YST、(YM)_安卓9_S905L3A_默认开启ADB_纯净精简语音_完美线刷包 固件特点&#xff1a; 1、修改dns&#xff0c;三网通用&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升…

什么是云原生的应用?

云原生应用的三个核心概念 链接&#xff1a;https://pan.baidu.com/s/10ocbDCGsdS3i7hEzvUlatA?pwdm9nr 提取码&#xff1a;m9nr –来自百度网盘超级会员V5的分享 脑图大家可以下载使用并补充 微服务 什么是单体应用&#xff1f; 传统的单体应用架构都是三层模式&#xff1…

分治策略与递归

目录分治策略分治概念递归概念分治策略的特征分治法步骤举例阶乘斐波那契数列打印数组数组中查找元素分治策略 分治概念 任何可以用计算机求解的问题所需要的时间都与其规模有关。问题规模越小&#xff0c;所解题所需要的时间就越小&#xff0c;从而也较容易处理。例如&#…

11.9 至 11.17 四道典型题记录: Counter 弹出 | map函数 | 子集求取 | 有序字符桶分装

11.9 至 11.17 四道典型题记录&#xff1a; Counter 弹出 | map函数 | 子集求取 | 有序字符桶分装 昨天休息的时候一直在想应该学习哪种语言&#xff0c;我想这也是好多人发愁无法下手的原因之一&#xff0c;今年找工作的时候发现更多的研究岗位需要的是 C 语言 或 C 语言&…

RocketMQ的事务消息和改造

什么是 rmq分布式事务消息&#xff1f; Apache RocketMQ在4.3.0版中已经支持分布式事务消息&#xff0c;这里RocketMQ采用了2PC的思想来实现了提交事务消息&#xff0c;同时增加一个补偿逻辑来处理二阶段超时或者失败的消息&#xff0c;如下图所示。 事务消息解决什么问题&…

Java学习笔记 --- 多线程

一、线程相关概念 程序 程序是为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。简单的说就是我们写的代码 进程 1、进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存空间。当我们使用迅雷&…

程序控制结构

程序控制结构程序流程控制介绍顺序控制分支控制if-else单分支案例&#xff1a;编写一个程序&#xff0c;可以输入人的年龄&#xff0c;如果该同志的年龄大于等于 18 岁, 则输出 "你年龄大于 18,要对自己的行为负责,送入监狱"。双分支案例&#xff1a;编写一个程序&am…

关于Python函数的几点说明

关于Python函数的几点说明 本文介绍Python函数返回值、调用函数加括号和不加括号有什么区别、冒号后面省略号&#xff08;...&#xff09;和 pass等说明。 一、为什么函数意外返回“None” 初学者可能遇到这种情况&#xff0c;定义的函数意外返回“None”&#xff0c;例如&a…

Qt error: fatal error: Killed signal terminated program cc1plus

Qt error: fatal error: Killed signal terminated program cc1plus 文章目录Qt error: fatal error: Killed signal terminated program cc1plus摘要1 出现问题原因2 解决方法虚拟机物理机增加SWAP交换空间关键字&#xff1a; qt、 fatal、 error、 cc1plus、 Killed signal …

K8S实战 - 如何在kubernetes中安装软件

如何在kubernetes中安装软件 1、编写脚本安装 通过编写yaml文件&#xff0c;执行kubectl apply -f 可以安装软件 编写yaml的时候注意事项&#xff1a; pod的类型&#xff08;deployment、statefulset等&#xff09;端口的定义&#xff08;service&#xff09;配置文件的定义…