分享知识-快乐自己:Spring中的(三种)异常处理机制

案例目录结构:

Web.xml 配置:

<!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>
  <!--设置乱码-->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--设置核心控制器-->
  <servlet>
    <servlet-name>mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:Spring-*.xml</param-value>
    </init-param>
    <!--优先加载-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>mvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

第一种:使用Spring自带的异常处理机制:

ControllerWelcome:控制层:

package controller;
import exception.NameException;
import exception.PwdException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * @author asus
 */
@Controller
@RequestMapping("/user")
public class ControllerWelcome{
    @RequestMapping("/name")
    public String nameException() {
        System.out.println("用户名异常!!!");
        if (true) {
            throw new NameException("用户名异常");
        }
        return "Welcome";
    }
    @RequestMapping("/pwd")
    public String pwdException() {
        System.out.println("密码异常!!!");
        if (true) {
            throw new PwdException("密码异常");
        }
        return "Welcome";
    }
    @RequestMapping("/other")
    public String otherException() {
        System.out.println(5 / 0);
        return "Welcome";
    }
}

定义的异常类:NameException  (OtherException、PwdException;结构都一样 都继承 RuntimeException 实现三个方法)这里列举一个

package exception;

/**
 * 密码异常
 * @author asus
 */
public class PwdException extends RuntimeException{

    public PwdException() {
        super();
    }

    public PwdException(String message) {
        super(message);
    }

    public PwdException(String message, Throwable cause) {
        super(message, cause);
    }
}

定义的 exception下的 jsp 页面同样这里列举一个:(其他两个只是换了一下 h1的内容做了一下区分而已)

NameException.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>用户名异常</h1>
</body>
</html>

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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--指定Controller扫描器-->
    <context:component-scan base-package="controller"/>
    <!--配置试图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

Spring-excption.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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--系统自带异常机制映射配置-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="exception.NameException">exception/NameException</prop>
                <prop key="exception.PwdException">exception/PwdException</prop>
            </props>
        </property>
        <!--默认异常页面-->
        <property name="defaultErrorView" value="exception/OtherException"/>
    </bean>

</beans>

 提示:按住  SimpleMappingExceptionResolver 进来我们的底层查看,发现有个一常量值,就是用来获取我们编写的错误信息的(存放在了request作用域下)。如下所示

 Welcome.jsp :

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--获取错误信息--%>
${exception}
</body>
</html>

 例如要访问:localhost:8080/user/name:这时页面就会跳转 Welcome.jsp 并且显示 用户名异常

第二种:自定义异常处理机制:

在上述中的 exception 包下添加我们的自定义的类:MyExceptionResolve 并且继承 AbstractHandlerExceptionResolver

MyExceptionResolve :

package exception;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义异常处理机制
 * @author asus
 */
public class MyExceptionResolve extends AbstractHandlerExceptionResolver {
    /**
     * @param request:请求
     * @param response:响应
     * @param handler:执行的某一Controller 控制器
     * @param ex:异常信息
     * @return
     */
    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        //默认为其他异常页面
        ModelAndView modelAndView=new ModelAndView("exception/OtherException");
        //判断是什么类型的异常
        if(ex instanceof NameException)
        {
            modelAndView.setViewName("exception/NameException");
        }else if(ex instanceof PwdException)
        {
            modelAndView.setViewName("exception/PwdException");
        }
        modelAndView.addObject("exception",ex);
        return modelAndView;
    }
}

修改我们的配置文件:Spring-excption.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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    <!--自定义的异常类:-->
    <bean class="exception.MyExceptionResolve"/>
    
</beans>

还是按照上述的 方式运行页面即可 查看效果......

第三种:使用注解实现异常处理机制:

 为了方便阅读:专门提升了一个编写注解方式的类:BaseControllerEx

package exception;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
/**
 * 使用注解实现异常处理机制
 * @author asus
 */
@Controller
public class BaseControllerEx {
    @ExceptionHandler(NameException.class)
    public ModelAndView nameEx(NameException ex)
    {
        ModelAndView modelAndView=new ModelAndView("exception/NameException");
        modelAndView.addObject("exception",ex.getMessage());
        return modelAndView;
    }
    @ExceptionHandler(PwdException.class)
    public ModelAndView nameEx(PwdException ex)
    {
        ModelAndView modelAndView=new ModelAndView("exception/PwdException");
        modelAndView.addObject("exception",ex.getMessage());
        return modelAndView;
    }
}

注解的方式就不需要 Spring-excption.xml 配置了,所以直接干掉就可以或者注释掉配置

这时我们只需要稍微改动一下我们的 ControllerWelcome 类去继承我们的注解类:

运行方式同上述一致......

原文地址:https://www.cnblogs.com/mlq2017/p/9680920.html