1 Star 0 Fork 0

cgrs572/SpringMvcDemo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

SpringMVC异常处理

  • 异常常见位置与诱因

    • 框架内部抛出的异常:因使用不合规导致
    • 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
    • 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
    • 表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
    • 工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)
  • 项目异常分类及处理方案

    项目异常分类 场景 处理步骤
    业务异常(BusinessException) 1.规范的用户行为产生的异常;2.不规范的用户行为操作产生的异常 发送对应消息传递给用户,提醒规范操作
    系统异常(SystemException) 项目运行过程中可预计且无法避免的异常 1.发送固定消息传递给用户,安抚用户;2.发送特定消息给运维人员,提醒维护;3.记录日志
    其他异常(Exception) 编程人员未预期到的异常 1.发送固定消息传递给用户,安抚用户;2.发送特定消息给编程人员,提醒维护(纳入预期范围内)3.记录日志
  • 系统异常分类

    系统异常(SystemException)分类 解决方式
    预期异常 通过捕获异常获取异常信息
    运行时异常RuntimeException 通过规范代码开发、测试等手段减少运行时异常发生
  • 异常处理思路

    在ssm框架中,异常向上抛出,持久层抛给业务层,业务层抛给Controller,Controller继续向上抛出给SpringMVC的核心前端控制器,最后由SpringMVC的核心前端控制器交由异常处理器进行异常处理

    <img alt="image-20241127192154836">

异常处理的两种方式

  • 方式一简单异常处理:使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver

  • 方式二自定义异常处理:实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器

  • 后续示例的环境准备如下

    • 导入坐标(略,可详见快速入门)

    • 右键源代码配置文件目录(即资源文件resources)→NewXML Configuration FileSpring Config,创建Spring和SpringMVC的核心配置文件,代码截图如下

      <img alt="image-20241127195143030">

    • 创建业务层service包、controller包、异常exception包,代码截图如下

      • 注意:在service包中模拟各种异常来进行后续的示例操作

      <img alt="image-20241127201946467">

    • 配置web项目核心目录(即webapp)下的WEB-INF中的web.xml,并在webapp目录下创建jsp文件夹,并写入4个页面success.jsp、error.jsp、errorshow1.jsp、errorshow5.jsp,代码截图如下

      • 注意:success.jsp为无异常时前端显示页面;error.jsp为默认错误视图;errorshow1.jsp、errorshow5.jsp分别为业务层show1()show2()方法抛出异常后所映射的视图

      <img alt="image-20241127203847996">

    • 此时运行后前端页面会报对应异常,分别如下图所示

      <img alt="image-20241127202651332">

      <img alt="image-20241127202744763">

      <img alt="image-20241127202825634">

      <img alt="image-20241127202857382">

      <img alt="image-20241127202933094">

    • 初始项目结构如下

      <img alt="image-20241127204148844">

简单异常处理

  • 注意:SpringMVC已经定义好了该类型的转换器,在使用时可根据项目情况在SpringMVC的核心配置文件中进行相应 异常与视图 的映射配置

  • 简单异常处理只需要在SpringMVC核心配置文件中配置异常处理机制即可,代码如下

    <!--配置异常处理机制-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="error1"/>
        <property name="exceptionMappings">
            <map>
                <entry key="at.guigu.exception.MyException" value="error2"/>
                <entry key="java.lang.ClassCastException" value="error3"/>
            </map>
        </property>
    </bean>
    

    ==原理:== 通过SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver配置异常处理机制。当某个异常抛出时,Spring会根据配置的 exceptionMappings 映射到异常所对应的视图。如果抛出的异常没有在 exceptionMappings 中配置,那么会使用 defaultErrorView 指定的默认错误视图。

    ==示例代码解释:== 当抛出的异常为MyException时则会映射到视图error2.jsp;当抛出异常为ClassCastException时则会映射到视图error3.jsp;若抛出的异常没有在 exceptionMappings 中配置,则此时按照defaultErrorView(即默认异常视图)映射到error1.jsp

    ==注意:== 在配置异常处理机制的代码中,视图均为带后缀名.jsp,是因为已在SpringMVC的核心配置文件中提前配置了内部资源视图解析器

  • 代码运行示例

    • 未在SpringMVC核心配置文件中配置异常处理机制时,此时由于有异常所以前端会显示异常页面,可详见环境准备中的运行截图

    • 在SpringMVC核心配置文件中配置异常处理机制,完整代码如下

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             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/context
             http://www.springframework.org/schema/context/spring-context.xsd
             http://www.springframework.org/schema/mvc
             http://www.springframework.org/schema/mvc/spring-mvc.xsd">
          <!--mvc的注解驱动-->
          <mvc:annotation-driven/>
      
          <!--配置Controller层的注解的组件扫描-->
          <context:component-scan base-package="at.guigu.controller"></context:component-scan>
          <!--等同于
          <context:component-scan base-package="at.guigu">
              type指定要扫描的内容为注解,expression指定要扫描的对应注解的全限定名
              只扫描at.guigu包下有@Controller注解的类
              <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
          </context:component-scan>
          -->
          <!--配置内部资源视图解析器-->
          <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <!--将InternalResourceViewResolver类中的视图名称前缀属性prefix的值设为/jsp/-->
              <property name="prefix" value="/jsp/"></property>
              <!--将InternalResourceViewResolver类中的视图名称后缀属性suffix的值设为.jsp-->
              <property name="suffix" value=".jsp"></property>
          </bean>
          <!--配置静态资源的路径映射,让 Spring MVC 可以处理静态文件-->
          <mvc:default-servlet-handler/>
      
          <!--配置异常处理机制-->
          <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
              <property name="defaultErrorView" value="error"/>
              <property name="exceptionMappings">
                  <map>
                      <entry key="java.lang.ClassCastException" value="errorShow1"/>
                      <entry key="at.guigu.exception.MyException" value="errorshow5"/>
                  </map>
              </property>
          </bean>
      </beans>
      
    • 运行截图如下

      • show1() ClassCastException异常自动映射到errorShow1.jsp页面

        <img alt="image-20241127204445498">

      • show5() 自定义MyException异常自动映射到errorShow5.jsp页面

        <img alt="image-20241127204558231">

      • 其它异常自动映射到error.jsp页面

        <img alt="image-20241127204720478">

自定义异常处理

  • 步骤

    • 创建实现HandlerExceptionResolver接口的异常处理器类
    • 在SpingMVC的核心配置文件中配置自定义异常处理机制
    • 编写异常映射页面
    • 测试异常跳转
  • 代码实现

    • 创建一个与三层架构包同级的resolver包,并在该包下创建一个实现HandlerExceptionResolver接口的异常处理器类MyExceptionResolver,并重写其中的resolveException方法,代码如下

      package at.guigu.resolver;
      
      import at.guigu.exception.MyException;
      import org.springframework.web.servlet.HandlerExceptionResolver;
      import org.springframework.web.servlet.ModelAndView;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      public class MyExceptionResolver implements HandlerExceptionResolver {
          /**
           *
           * @param httpServletRequest
           * @param httpServletResponse
           * @param o
           * @param e:为抛出的异常对象
           * @return :返回ModelAndView对象,为异常映射的视图
           */
          @Override
          public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
              ModelAndView modelAndView = new ModelAndView();
              // 若是ClassCastException异常则映射到errorShow1.jsp页面
              if (e instanceof ClassCastException) {
                  modelAndView.setViewName("errorShow1");
              // 若是自定义MyException异常则映射到errorShow5.jsp页面
              } else if (e instanceof MyException) {
                  modelAndView.setViewName("errorShow5");
              // 若是其它异常则映射到error.jsp页面
              } else {
                  modelAndView.setViewName("error");
              }
              return  modelAndView;
          }
      }
      
    • 在SpingMVC的核心配置文件中配置自定义异常处理机制,代码如下:

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             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/context
             http://www.springframework.org/schema/context/spring-context.xsd
             http://www.springframework.org/schema/mvc
             http://www.springframework.org/schema/mvc/spring-mvc.xsd">
          <!--mvc的注解驱动-->
          <mvc:annotation-driven/>
      
          <!--配置Controller层的注解的组件扫描-->
          <context:component-scan base-package="at.guigu.controller"></context:component-scan>
          <!--等同于
          <context:component-scan base-package="at.guigu">
              type指定要扫描的内容为注解,expression指定要扫描的对应注解的全限定名
              只扫描at.guigu包下有@Controller注解的类
              <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
          </context:component-scan>
          -->
          <!--配置内部资源视图解析器-->
          <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <!--将InternalResourceViewResolver类中的视图名称前缀属性prefix的值设为/jsp/-->
              <property name="prefix" value="/jsp/"></property>
              <!--将InternalResourceViewResolver类中的视图名称后缀属性suffix的值设为.jsp-->
              <property name="suffix" value=".jsp"></property>
          </bean>
          <!--配置静态资源的路径映射,让 Spring MVC 可以处理静态文件-->
          <mvc:default-servlet-handler/>
      
          <!--
          配置异常处理机制
          <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
              <property name="defaultErrorView" value="error"/>
              <property name="exceptionMappings">
                  <map>
                      <entry key="java.lang.ClassCastException" value="errorShow1"/>
                      <entry key="at.guigu.exception.MyException" value="errorShow5"/>
                  </map>
              </property>
          </bean>
          -->
      
          <!--配置自定义异常处理机制-->
          <bean class="at.guigu.resolver.MyExceptionResolver"/>
      </beans>
      
    • 编写异常映射页面。(本步骤已在环境准备工作中实现,此处省略)

    • 运行截图如下

      • show1() ClassCastException异常自动映射到errorShow1.jsp页面

        <img alt="image-20241127204445498">

      • show5() 自定义MyException异常自动映射到errorShow5.jsp页面

        <img alt="image-20241127204558231">

      • 其它异常自动映射到error.jsp页面

        <img alt="image-20241127204720478">

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/cgrs572/spring-mvc-demo.git
git@gitee.com:cgrs572/spring-mvc-demo.git
cgrs572
spring-mvc-demo
SpringMvcDemo
master

搜索帮助