• 分享知识-快乐自己: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 类去继承我们的注解类:

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

  • 相关阅读:
    当年偶然发现的 Java Bug(JDK 9及之前仍未修复)
    Centos 网卡命名规范及信息查看(物理网卡,虚拟网卡)
    Git 合并多个 commit,保持历史简洁
    Java 常用验证方法(commons-validator,hutool)
    Linux 日常操作(质量团队培训材料)
    Linux 帮助命令及工具(tldr,man,help,info)
    springmvc返回html页面解决方案
    二进制和十进制来回转换
    二进制按位与(&) 按位或(|) 异或运算(^)
    Spring容器和springmvc容器的区别联系
  • 原文地址:https://www.cnblogs.com/mlq2017/p/9680920.html
Copyright © 2020-2023  润新知