IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringMVC异常处理机制 -> 正文阅读

[Java知识库]SpringMVC异常处理机制

SpringMVC异常处理机制

  1. 创建spring-exception项目工程【web项目】

    1. pox.xml配置文件中导入需要的依赖坐标和tomcat7插件

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>org.example</groupId>
          <artifactId>spring_exception</artifactId>
          <version>1.0-SNAPSHOT</version>
          <packaging>war</packaging>
      
          <properties>
              <maven.compiler.source>8</maven.compiler.source>
              <maven.compiler.target>8</maven.compiler.target>
          </properties>
      
          <dependencies>
              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
                  <version>5.1.32</version>
              </dependency>
              <dependency>
                  <groupId>c3p0</groupId>
                  <artifactId>c3p0</artifactId>
                  <version>0.9.1.2</version>
              </dependency>
              <dependency>
                  <groupId>com.alibaba</groupId>
                  <artifactId>druid</artifactId>
                  <version>1.1.10</version>
              </dependency>
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.12</version>
                  <scope>test</scope>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-context</artifactId>
                  <version>5.0.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-test</artifactId>
                  <version>5.0.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-web</artifactId>
                  <version>5.0.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-webmvc</artifactId>
                  <version>5.0.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>javax.servlet-api</artifactId>
                  <version>3.0.1</version>
                  <scope>provided</scope>
              </dependency>
              <dependency>
                  <groupId>javax.servlet.jsp</groupId>
                  <artifactId>javax.servlet.jsp-api</artifactId>
                  <version>2.2.1</version>
                  <scope>provided</scope>
              </dependency>
              <dependency>
                  <groupId>com.fasterxml.jackson.core</groupId>
                  <artifactId>jackson-core</artifactId>
                  <version>2.9.0</version>
              </dependency>
              <dependency>
                  <groupId>com.fasterxml.jackson.core</groupId>
                  <artifactId>jackson-databind</artifactId>
                  <version>2.9.0</version>
              </dependency>
              <dependency>
                  <groupId>com.fasterxml.jackson.core</groupId>
                  <artifactId>jackson-annotations</artifactId>
                  <version>2.9.0</version>
              </dependency>
              <dependency>
                  <groupId>commons-fileupload</groupId>
                  <artifactId>commons-fileupload</artifactId>
                  <version>1.3.1</version>
              </dependency>
              <dependency>
                  <groupId>commons-io</groupId>
                  <artifactId>commons-io</artifactId>
                  <version>2.3</version>
              </dependency>
              <dependency>
                  <groupId>commons-logging</groupId>
                  <artifactId>commons-logging</artifactId>
                  <version>1.2</version>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-log4j12</artifactId>
                  <version>1.7.7</version>
              </dependency>
              <dependency>
                  <groupId>log4j</groupId>
                  <artifactId>log4j</artifactId>
                  <version>1.2.17</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-jdbc</artifactId>
                  <version>5.0.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-tx</artifactId>
                  <version>5.0.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>jstl</groupId>
                  <artifactId>jstl</artifactId>
                  <version>1.2</version>
              </dependency>
      
          </dependencies>
      
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.apache.tomcat.maven</groupId>
                      <artifactId>tomcat7-maven-plugin</artifactId>
                      <version>2.2</version>
                  </plugin>
              </plugins>
          </build>
      </project>
      
    2. 在main包下创建com.zcl.controller包,并在包下创建DemoController

      package com.zcl.controller;
      
      import com.zcl.exception.MyException;
      import com.zcl.service.DemoService;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      import java.io.FileNotFoundException;
      
      @Controller
      public class DemoController {
      
          @Autowired
          private DemoService demoService;
      
          @RequestMapping(value = "/show")
          public String show() throws FileNotFoundException, MyException {
              System.out.println("show running......");
              //demoService.show1();
              //demoService.show2();
              //demoService.show3();
              //demoService.show4();
              demoService.show5();
              return "index";
          }
      
      }
      
      
    3. 在main包下创建com.zcl.service包,并在包下创建DemoService接口

      package com.zcl.service;
      
      import com.zcl.exception.MyException;
      
      import java.io.FileNotFoundException;
      
      public interface DemoService {
          void show1();
      
          void show2();
      
          void show3() throws FileNotFoundException;
      
          void show4();
      
          void show5() throws MyException;
      }
      
      

      在同包下创建DemoServiceImpl接口实现类

      实现类主要是声明了五种常见的异常报错信息

      package com.zcl.service;
      
      import com.zcl.exception.MyException;
      import org.springframework.web.servlet.view.InternalResourceViewResolver;
      
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.InputStream;
      
      public class DemoServiceImpl implements DemoService {
          @Override
          public void show1() {
              System.out.println("抛出类型转换异常....");
              Object str = "zhangsan";
              Integer num = (Integer)str;
          }
      
          @Override
          public void show2() {
              System.out.println("抛出除零异常....");
              int i = 1/0;
          }
      
          @Override
          public void show3() throws FileNotFoundException {
              System.out.println("文件找不到异常....");
              InputStream in = new FileInputStream("C:/xxx/xxx/xxx.txt");
          }
      
          @Override
          public void show4() {
              System.out.println("空指针异常.....");
              String str = null;
              str.length();
          }
      
          @Override
          public void show5() throws MyException {
              System.out.println("自定义异常....");
              throw new MyException();
          }
      }
      
      
    4. 在main包下创建com.zcl.exception包,并在包下创建MyException自定义异常类

      package com.zcl.exception;
      
      public class MyException extends Exception {
      
      }
      
      
    5. resources包下创建applicationContext.xml配置文件

      <?xml version="1.0" encoding="UTF-8"?>
      <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 id="demoService" class="com.zcl.service.DemoServiceImpl"></bean>
      
      
      </beans>
      
    6. webapp.WEB-INF包下的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">
          <context-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>classpath:applicationContext.xml</param-value>
          </context-param>
          <listener>
              <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          </listener>
      
          <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>
      </web-app>
      
    7. resources包下创建spring-mvc.xml配置文件

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             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/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
      ">
      
          <!--1、mvc注解驱动-->
          <mvc:annotation-driven/>
      
          <!--2、配置视图解析器-->
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <property name="prefix" value="/"/>
              <property name="suffix" value=".jsp"/>
          </bean>
      
          <!--3、静态资源权限开放-->
          <mvc:default-servlet-handler/>
      
          <!--4、组件扫描  扫描Controller-->
          <context:component-scan base-package="com.zcl.controller"/>
      
      
      
      </beans>
      
  2. 异常处理的思路

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

    系统的Dao、Service、Controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,如下图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GTINIu5M-1651755937696)(image/image-20220505194524025.png)]

  3. 异常处理的两种方式

    1. 使用Spring MVC提供的简单异常处理器SimpleMapping ExceptionResolver

      SpringMVC已经定义好了该类型转换器,在使用时可以根据项目情况进行相应异常与视图的映射配置

      启动项目访问:http://localhost:8080/spring_exception/show 会出现页面报错提示

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pz7dA7EA-1651755937697)(image/image-20220505204250333.png)]

      页面报错提示都用来体验很不好所以我们在spring-mvc.xml配置一个异常处理器来完成异常页面的跳转

      <!--5、配置异常处理器-->
      <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
          <!--配置之后有异常信息就会跳转到value声明的页面-->
          <!--<property name="defaultErrorView" value="error"/> 默认错误视图-->
          <property name="exceptionMappings">
              <map>
                  <!--key为异常的类型,value为对应异常的跳转路径-->
                  <entry key="java.lang.ClassCastException" value="error"/>
                  <entry key="java.lang.ClassCastException" value="error"/>
              </map>
          </property>
      </bean>
      

      配置这一段之后,如果报错的异常对应上面的key则会跳转页面到后面value指定的页面,就不会在页面直接显示报错信息了

    2. 实现Springl的异常处理接口HandlerExceptionResolver自定义自己的异常处理器

      1. 创建异常处理器类实现HandlerExceptionResolver

        在main包下创建com.zcl.resolver包并创建MyExceptionResolver类实现接口,并重新接口的方法,完成异常的判断

        package com.itheima.resolver;
        
        import com.itheima.exception.MyException;
        import org.springframework.web.servlet.HandlerExceptionResolver;
        import org.springframework.web.servlet.ModelAndView;
        
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        
        /**
         * 项目名称:Spring
         * 描述:自定义异常处理器
         *
         * @author zhong
         * @date 2022-05-05 20:49
         */
        public class MyExceptionResolver implements HandlerExceptionResolver {
            /**
             * 参数Exception:异常对象
             * 返回值ModelAndView:跳转到错误视图信息
             * @param httpServletRequest
             * @param httpServletResponse
             * @param o
             * @param e
             * @return
             */
            @Override
            public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
                ModelAndView modelAndView = new ModelAndView();
                // 根据参数e来判断异常
                if(e instanceof MyException){
                    modelAndView.addObject("info","自定义异常");
                }else if(e instanceof ClassCastException){
                    modelAndView.addObject("info","类转换异常");
                }
                // 设置异常的跳转视图
                modelAndView.setViewName("error");
                return modelAndView;
            }
        }
        
        
      2. 配置异常处理器

        spring-mvc.xml配置文件中修改

        <!--自定义异常配置,如果之前有配置spring-mvc的异常配置需要注释掉-->
        <bean class="com.itheima.resolver.MyExceptionResolver"/>
        
      3. 编写异常页面

        通过EL表达式获取到模型的数据info就行了

      4. 测试异常跳转

        启动项目,自定义异常也可以显示出来

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:02:36  更:2022-05-07 11:03:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:21:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码