1. Spring MVC 中的异常处理器
文章目录
- [1. Spring MVC 中的异常处理器](#1. Spring MVC 中的异常处理器)
- [2. 什么是异常处理器](#2. 什么是异常处理器)
- [3. 自定义的异常处理器](#3. 自定义的异常处理器)
-
- [3.1 通过 XML 配置文件的方式](#3.1 通过 XML 配置文件的方式)
- [3.2 通过注解的方式](#3.2 通过注解的方式)
- [4. 总结:](#4. 总结:)
- [5. 最后:](#5. 最后:)
2. 什么是异常处理器
Spring MVC 在 处理器方法
执行过程中出现了异常,可以采用 异常处理器
进行应对。
一句话概括异常处理器作用:处理器方法执行过程中出现了异常,跳转都对应的视图,在视图上展示友好信息。
Spring MVC 为异常处理提供了一个接口:HandlerExceptionResolver
核心方法是:resolveException。
该方法用来编写具体的异常处理方案。返回值ModelAndView,表示异常处理完之后跳转到哪个视图。
HandlerExceptionResolver 接口有两个常用的默认实现:
-
DefaultHandlerExceptionResolver
-
SimpleMappingExceptionResolver
DefaultHandlerExceptionResolver 是默认的异常处理器。
核心方法:
当请求方式和处理方式不同时,DefaultHandlerExceptionResolver的默认处理态度是:
3. 自定义的异常处理器
自定义异常处理器需要使用:SimpleMappingExceptionResolver
自定义异常处理机制有两种方式:
-
通过XML配置文件
-
通过注解
3.1 通过 XML 配置文件的方式
在 springmvc.xml 配置如下信息即可
xml
<!-- 配置属于自己的异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 这里可以配置很多键值对,key是异常,要提供具体的异常类型,包括报名-->
<!--用来指定出现异常后,跳转的视图-->
<!-- 以下的配置表示,只要发送异常,都跳转到 tip视图-->
<prop key="java.lang.Exception">tip</prop>
</props>
</property>
<!--将异常信息存储到request域,value属性用来指定存储时的key。-->
<!-- 以下配置的含义是:将当前发送的异常对象存储到 request域当中-->
<!-- 底层会执行这样的代码 request.setAttribute("yichang",异常对象 java.lang.Exception )-->
<property name="exceptionAttribute" value="yichang"/>
<!-- request.setAttribute(key,value)-->
</bean>
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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 组件扫描-->
<context:component-scan base-package="com.rainbowsea.springmvc.controller"></context:component-scan>
<!-- 视图解析器-->
<bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver">
<!--作用于视图渲染的过程中,可以设置视图渲染后输出时采用的编码字符集-->
<property name="characterEncoding" value="UTF-8"/>
<!--如果配置多个视图解析器,它来决定优先使用哪个视图解析器,它的值越小优先级越高-->
<property name="order" value="1"/>
<!--当 ThymeleafViewResolver 渲染模板时,会使用该模板引擎来解析、编译和渲染模板-->
<property name="templateEngine">
<bean class="org.thymeleaf.spring6.SpringTemplateEngine">
<!--用于指定 Thymeleaf 模板引擎使用的模板解析器。模板解析器负责根据模板位置、模板资源名称、文件编码等信息,加载模板并对其进行解析-->
<property name="templateResolver">
<bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver">
<!--设置模板文件的位置(前缀)-->
<property name="prefix" value="/WEB-INF/templates/"/>
<!--设置模板文件后缀(后缀),Thymeleaf文件扩展名不一定是html,也可以是其他,例如txt,大部分都是html-->
<property name="suffix" value=".html"/>
<!--设置模板类型,例如:HTML,TEXT,JAVASCRIPT,CSS等-->
<property name="templateMode" value="HTML"/>
<!--用于模板文件在读取和解析过程中采用的编码字符集-->
<property name="characterEncoding" value="UTF-8"/>
</bean>
</property>
</bean>
</property>
</bean>
<!-- 配置视图的控制器,报红是,没有整个文件,ide的误报,这里是没有问题的-->
<!-- <mvc:view-controller path="/" view-name="index" />-->
<!-- 开启默认的Servlet处理-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!-- 开启注解驱动-->
<mvc:annotation-driven/>
<!-- 配置属于自己的异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 这里可以配置很多键值对,key是异常,要提供具体的异常类型,包括报名-->
<!--用来指定出现异常后,跳转的视图-->
<!-- 以下的配置表示,只要发送异常,都跳转到 tip视图-->
<prop key="java.lang.Exception">tip</prop>
</props>
</property>
<!--将异常信息存储到request域,value属性用来指定存储时的key。-->
<!-- 以下配置的含义是:将当前发送的异常对象存储到 request域当中-->
<!-- 底层会执行这样的代码 request.setAttribute("yichang",异常对象 java.lang.Exception )-->
<property name="exceptionAttribute" value="yichang"/>
<!-- request.setAttribute(key,value)-->
</bean>
</beans>
在视图页面上展示异常信息:
html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>出错了,请联系管理员</h1>
<hr>
<!--从获取到请求域当中对应的内容-->
<div th:text="${yichang}"></div>
</body>
</html>
对应异常测试的 Controller 类的编写
java
package com.rainbowsea.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller // 交给 Spring IOC 容器管理
public class IndexController {
//@RequestMapping(value = "/index", method = RequestMethod.POST)
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String toIndex() {
String s = null;
s.toString();
return "index";
}
}
运行测试:
3.2 通过注解的方式
第一步使用:@ControllerAdvice // 标注类的异常
@ControllerAdvice 注解是包含了 @Controller 注解的
第二步:使用@ExceptionHandler // 标注 处理器异常方法,可以标注多个不同异常的,处理方法器。
java/** * 自定义异常 */ @ControllerAdvice // 标注类的异常 public class ExceptionController { @ExceptionHandler // 标注 处理器异常方法 public String tip (Exception e, Model model) { // 将异常信息存储到请求域当中 model.addAttribute("yichang",e); // 逻辑视图 return "tip"; } }
java
package com.rainbowsea.springmvc.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* 自定义异常
*/
@ControllerAdvice // 标注类的异常
public class ExceptionController {
@ExceptionHandler // 标注 处理器异常方法
public String tip (Exception e, Model model) {
// 将异常信息存储到请求域当中
model.addAttribute("yichang",e);
// 逻辑视图
return "tip";
}
// 其他的异常处理视图 ClassCastException
@ExceptionHandler // 标注 处理器异常方法
public String tip (ClassCastException e, Model model) {
// 将异常信息存储到请求域当中
model.addAttribute("yichang",e);
// 逻辑视图
return "tip";
}
// 可以自定义多个异常信息
//@ExceptionHandler
public String tip2 (Exception e, Model model) {
return null;
}
//@ExceptionHandler
public String tip3 (NullPointerException e, Model model) {
return null;
}
}
4. 总结:
Spring MVC 在
处理器方法
执行过程中出现了异常,可以采用异常处理器
进行应对。一句话概括异常处理器作用:处理器方法执行过程中出现了异常,跳转都对应的视图,在视图上展示友好信息。Spring MVC 为异常处理提供了一个接口:HandlerExceptionResolver定义异常处理器需要使用:SimpleMappingExceptionResolver
自定义异常处理机制有两种方式:
通过XML配置文件
通过注解
5. 最后:
"在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。"