文章目录

  • SpringMVC 异常处理
  • 1. 异常处理思路
  • 1.1 springmvc 执行的过程
  • 1.2 异常处理的思路
  • 2. 处理异常的实例
  • 2.1 配置环境
  • 2.2 编写异常处理


SpringMVC 异常处理

1. 异常处理思路

1.1 springmvc 执行的过程

浏览器发送请求;

请求到达前端控制器;

前端控制器调用控制器;

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

spring mvc 复杂对象 spring mvc异常处理_springmvc

1.2 异常处理的思路

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

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

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

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

spring mvc 复杂对象 spring mvc异常处理_异常处理_02

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>
  1. 将项目文件夹补充完整
  2. 在 webapp 文件夹下创建 pages/success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>执行成功</h3>
</body>
</html>
  1. 编写 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>
  1. 在源包下创建 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";
    }
}
  1. 配置前端控制器:
<!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>
  1. 配置 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>
  1. 然后进行测试

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";
    }
}
  1. 创建 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;
    }
}
  1. 创建异常处理器类:
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;
    }
}
  1. 然后,在springmvc配置文件中配置异常处理器
<!-- 配置异常处理器 -->
    <bean id="sysExceptionResovler" class="com.springmvc.exception.SysExceptionResovler"></bean>
  1. 最后进行测试