0
点赞
收藏
分享

微信扫一扫

SpringMVC异常处理机制

独西楼Q 2022-05-06 阅读 38

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;
      }
      
      
      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. 异常处理的思路

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

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

  3. 异常处理的两种方式

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

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

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

      <!--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>
      
    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的异常配置需要注释掉-->
        <bean class="com.itheima.resolver.MyExceptionResolver"/>
        
      3. 编写异常页面

      4. 测试异常跳转

举报

相关推荐

0 条评论