Spring MVC 框架学习4 - 异常处理

SpringMVC 异常处理

1. 异常处理思路

1.1 springmvc 执行的过程

浏览器发送请求;

请求到达前端控制器;

前端控制器调用控制器;

控制器调用持久层,进行数据库操作。

在这里插入图片描述

1.2 异常处理的思路

以后在进行 ssm (spring+springmvc+mybatis)编写网页的时候,默认情况下,异常是一层一层向上抛出的。

如果 dao 发生了异常,那么持久层将异常抛出,抛给业务层;业务层将异常抛出,抛给显示层的控制器。控制器将异常继续向上抛出,前端控制器接受异常,继续向上抛出,最后浏览器接受异常,以网页的形式显示异常。

如果当异常被前端控制器接受,如果有异常处理器,那么前端控制器就会调用异常处理器,交由异常处理器来进行处理。

异常处理器处理完成之后,进行跳转,跳转到一个错误提示页面。这样,就可以提供一个友好的错误页面了。

在这里插入图片描述

2. 处理异常的实例

2.1 配置环境

  1. 创建一个新的webapp maven项目:

    在这里插入图片描述

  2. 配置项目的依赖项:

      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.1.9.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>5.1.9.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.1.9.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>4.0.1</version>
          <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>javax.servlet.jsp-api</artifactId>
          <version>2.3.3</version>
          <scope>provided</scope>
        </dependency>
      </dependencies>
    
  3. 将项目文件夹补充完整

  4. 在 webapp 文件夹下创建 pages/success.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h3>执行成功</h3>
    </body>
    </html>
    
  5. 编写 index.jsp 页面:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h3>异常处理</h3>
    
        <a href="user/testException">异常处理</a>
    </body>
    </html>
    
  6. 在源包下创建 controller 类,控制器:

    import com.springmvc.exception.SysException;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        /**
         *
         * @return
         */
        @RequestMapping("/testException")
        public String testException() throws SysException{
            System.out.println("testException 执行了");
            return "success";
        }
    }
    
  7. 配置前端控制器:

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <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:springmvc.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>
    
      <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    </web-app>
    
  8. 配置 springmvc 的配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <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.springmvc"></context:component-scan>
    
        <!-- 视图解析器 -->
        <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    
        <!-- 告诉前端控制器,哪些静态资源不拦截 -->
        <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
    
        <!-- 开启 springmvc 框架注解的支持 -->
        <mvc:annotation-driven></mvc:annotation-driven>
    </beans>
    
  9. 然后进行测试

2.2 编写异常处理

  1. 首先,手动添加一个错误,并使用try catch 捕获:

    import com.springmvc.exception.SysException;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        /**
         *
         * @return
         */
        @RequestMapping("/testException")
        public String testException() throws SysException{
            System.out.println("testException 执行了");
            try {
                // 模拟一个异常
                int a = 10/0;
            } catch (Exception e) {
                // 控制台打印异常信息
                e.printStackTrace();
                // 抛出自定义异常信息
                throw new SysException("查询所有的用户出现的错误...");
            }
            return "success";
        }
    }
    
  2. 创建 exception/SysException 类,这个是异常类:

    /**
     * 自定义的异常类
     */
    public class SysException extends Exception {
    
        // 存储提示信息
        private String message;
    
        @Override
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public SysException(String message) {
            this.message = message;
        }
    }
    
  3. 创建异常处理器类:

    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 异常处理器
     */
    public class SysExceptionResovler implements HandlerExceptionResolver {
        /**
         * 处理异常的业务逻辑
         * @param httpServletRequest
         * @param httpServletResponse
         * @param o
         * @param e
         * @return
         */
        @Override
        public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
            // 获取到异常对象
            SysException ex = null;
            if(e instanceof SysException) {
                ex = (SysException) e;
            } else {
                e = new SysException("系统正在维护");
            }
            // 创建 ModelAndView 对象
            ModelAndView mv = new ModelAndView();
            mv.addObject("errorMsg", e.getMessage());
            mv.setViewName("error");
            return mv;
        }
    }
    
  4. 然后,在springmvc配置文件中配置异常处理器

        <!-- 配置异常处理器 -->
        <bean id="sysExceptionResovler" class="com.springmvc.exception.SysExceptionResovler"></bean>
    
    
  5. 最后进行测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值