spring 笔记八 SpringMVC异常处理和SpringMVC拦截器

文章目录

  • SpringMVC拦截器
    • 拦截器(interceptor)的作用
    • 拦截器和过滤器区别
    • 拦截器是快速入门
    • 拦截器方法说明
  • SpringMVC拦截器
    • 拦截器(interceptor)的作用
    • 拦截器和过滤器区别
    • 拦截器是快速入门
    • 拦截器方法说明
  • SpringMVC异常处理
    • 异常处理的思路
    • 异常处理两种方式
    • 简单异常处理器SimpleMappingExceptionResolver
    • 自定义异常处理步骤

SpringMVC拦截器

拦截器(interceptor)的作用

Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。

拦截器和过滤器区别

区别过滤器(Filter)拦截器(Interceptor)
使用范围是servlet 规范中的一部分,任何Java Web 工程都可以使用是SpringMVC 框架自己的,只有使用了SpringMVC 框架的工程才能用
拦截范围在url-pattern 中配置了/*之后,可以对所有要访问的资源拦截在<mvc:mappingpath=“”/>中配置了/**之后,也可以多所有资源进行拦截,但是可以通过<mvc:exclude-mapping path=“”/>标签排除不需要拦截的资源

拦截器是快速入门

自定义拦截器很简单,只有如下三步:
① 创建拦截器类实现HandlerInterceptor接口
② 配置拦截器
③ 测试拦截器的拦截效果

① 创建拦截器类实现HandlerInterceptor接口

public class MyHandlerInterceptor1 implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse 
response, Object handler) {System.out.println("preHandle running...");return true;}public void postHandle(HttpServletRequest request, HttpServletResponse 
response, Object handler, ModelAndView modelAndView) {System.out.println("postHandle running...");}public void afterCompletion(HttpServletRequest request, HttpServletResponse 
response, Object handler, Exception ex) {System.out.println("afterCompletion running...");}}

② 配置拦截器

<!--配置拦截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/></mvc:interceptor><bean class="com.onenewcode.interceptor.MyHandlerInterceptor1"/></mvc:interceptors>

③测试拦截器的拦截效果(编写目标方法)

@RequestMapping("/quick23")@ResponseBodypublic ModelAndView quickMethod23() throws IOException, ParseException {System.out.println("目标方法执行....");ModelAndView modelAndView= new ModelAndView();modelAndView.addObject("name","onenewcode");modelAndView.setViewName("index");return modelAndView;}

③ 测试拦截器的拦截效果(访问网址)

http://localhost:8080/onenewcode_springmvc1/quick23

控制台打印结果
在这里插入图片描述

拦截器方法说明

方法名说明
preHandle()方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的,
当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle方法
postHandle()该方法是在当前请求进行处理之后被调用,前提是preHandle方法的返回值为true 时才能被调用,且它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView对象进行操作
afterCompletion()该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行,前提是preHandle方法的返回值为true 时才能被调用

SpringMVC拦截器

拦截器(interceptor)的作用

Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。

拦截器和过滤器区别

区别过滤器(Filter)拦截器(Interceptor)
使用范围是servlet 规范中的一部分,任何Java Web 工程都可以使用是SpringMVC 框架自己的,只有使用了SpringMVC 框架的工程才能用
拦截范围在url-pattern 中配置了/*之后,可以对所有要访问的资源拦截在<mvc:mappingpath=“”/>中配置了/**之后,也可以多所有资源进行拦截,但是可以通过<mvc:exclude-mapping path=“”/>标签排除不需要拦截的资源

拦截器是快速入门

自定义拦截器很简单,只有如下三步:
① 创建拦截器类实现HandlerInterceptor接口
② 配置拦截器
③ 测试拦截器的拦截效果

① 创建拦截器类实现HandlerInterceptor接口

public class MyHandlerInterceptor1 implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse 
response, Object handler) {System.out.println("preHandle running...");return true;}public void postHandle(HttpServletRequest request, HttpServletResponse 
response, Object handler, ModelAndView modelAndView) {System.out.println("postHandle running...");}public void afterCompletion(HttpServletRequest request, HttpServletResponse 
response, Object handler, Exception ex) {System.out.println("afterCompletion running...");}}

② 配置拦截器

<!--配置拦截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/></mvc:interceptor><bean class="com.onenewcode.interceptor.MyHandlerInterceptor1"/></mvc:interceptors>

③测试拦截器的拦截效果(编写目标方法)

@RequestMapping("/quick23")@ResponseBodypublic ModelAndView quickMethod23() throws IOException, ParseException {System.out.println("目标方法执行....");ModelAndView modelAndView= new ModelAndView();modelAndView.addObject("name","onenewcode");modelAndView.setViewName("index");return modelAndView;}

③ 测试拦截器的拦截效果(访问网址)

http://localhost:8080/onenewcode_springmvc1/quick23

控制台打印结果
在这里插入图片描述

拦截器方法说明

方法名说明
preHandle()方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的,
当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle方法
postHandle()该方法是在当前请求进行处理之后被调用,前提是preHandle方法的返回值为true 时才能被调用,且它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView对象进行操作
afterCompletion()该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行,前提是preHandle方法的返回值为true 时才能被调用

SpringMVC异常处理

异常处理的思路

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。
系统的Dao、Service、Controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,如下图:
在这里插入图片描述

异常处理两种方式

 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver
 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器

简单异常处理器SimpleMappingExceptionResolver

SpringMVC已经定义好了该类型转换器,在使用时可以根据项目情况进行相应异常与视图的映射配置

<!--配置简单映射异常处理器--><bean 
class=“org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”><property name=“defaultErrorView” value=“error”/>   默认错误视图
<property name=“exceptionMappings”><map>异常类型错误视图
<entry key="com.onenewcode.exception.MyException" value="error"/><entry key="java.lang.ClassCastException" value="error"/></map></property></bean>

自定义异常处理步骤

① 创建异常处理器类实现HandlerExceptionResolver
② 配置异常处理器
③ 编写异常页面
④ 测试异常跳转

①创建异常处理器类实现HandlerExceptionResolver

 public class MyExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, 
HttpServletResponse response, Object handler, Exception ex) {//处理异常的代码实现
//创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("exceptionPage");return modelAndView;}}

②配置异常处理器

<bean id="exceptionResolver" 
class="com.onenewcode.exception.MyExceptionResolver"/>

③编写异常页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这是一个最终异常的显示页面
</body>
</html>

④ 测试异常跳转

@RequestMapping("/quick22")
@ResponseBody
public void quickMethod22() throws IOException, ParseException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
simpleDateFormat.parse("abcde");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

autosar引入了Secure SOME/IP-ACL 有什么目的?如何实现的?

Secure SOME/IP-ACL 是一种基于 AUTOSAR 的安全机制&#xff0c;用于保护车载以太网上的 SOME/IP 通信。它的目的是防止未经授权的客户端或服务端访问或提供敏感的服务。 Secure SOME/IP-ACL 的实现主要依赖于两个模块&#xff1a; Secure Onboard Communication (SecOC) Sec…

网络服务IP属地发生变化的原因有哪些?

近期&#xff0c;许多用户发现自己的网络服务IP属地发生了变化。原本固定的IP地址不再是静态的&#xff0c;而是发生了变动。这一现象引起了广大用户的关注和疑惑&#xff0c;对网络服务的使用和信息安全产生了影响。为了解决用户的疑虑&#xff0c;我们对此现象进行了深入探究…

Linux 服务器查看每个用户或者当前用户的磁盘占用量及文件同步

1、查看每个用户的磁盘占用量 #参考du -sh 目录 sudo du -sh /home/*1、两台服务器文件夹同步 rsync -avz -e "ssh -p 端口号" /home/cb215/ 用户名ip地址:/home/dell/16000_port/yf215/参考文献 [1]ubuntu查看每个用户或者当前用户的磁盘占用量及磁盘空间清理

java.lang.UnsupportedOperationException

一、背景 记录一次小坑… 最近在写一个关于Excel导出的小需求&#xff0c;由于系统都有一些工具类&#xff0c;还有原来已经做好的导出&#xff0c;直接拿过来改了改就用了&#xff0c;没想到直接报错&#xff0c;尴尬。 还是那句话&#xff0c;别人都能用&#xff0c;我复制…

AUTOSAR从入门到精通-面向服务的中间件SOME/IP(六)

目录 前言 原理 SOME/IP 协议服务接口 SOME/IP-SD协议文档 1.概述 1

LeetCode260. Single Number III

文章目录 一、题目二、题解 一、题目 Given an integer array nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once. You can return the answer in any order. You must …

国产浪潮服务器:风扇免手动调节脚本

简介&#xff1a;浪潮集团&#xff0c;是中国本土顶尖的大型IT企业之一&#xff0c;中国领先的云计算、大数据服务商。浪潮集团旗下拥有浪潮信息、浪潮软件、浪潮国际&#xff0c;业务涵盖云计算、大数据、工业互联网等新一代信息技术产业领域&#xff0c;为全球120多个国家和地…

【人工智能】模糊推理

模糊推理:交叉的隶属函数&#xff0c;方法如模糊规则中推理方法一致&#xff0c;step3中的每一个格子都有所应的隶属关系函数 引言&#xff1a;“生活中的模糊关系”模糊集合模糊集合的定义模糊集合的表示法模糊集合表示法示例 隶属函数 模糊规则模糊计算的流程 引言&#xff1…

RT-DETR 目标过线计数

使用 Ultralytics RT-DETR 进行目标计数 🚀 实际应用场景 物流水产养殖使用 Ultralytics RT-DETR 进行传送带包裹计数使用 Ultralytics RT-DETR 在海中进行鱼类计数请使用最新代码(2023年12月8日后),旧版本不支持! 示例 “目标计数示例” 目标计数 from ultralytics

Java8 IfPresent 与 forEach 的组合操作

一、需求背景 Java8的Optional接口是我们经常使用的一个接口&#xff0c;尤其是对对象进行判空的时候&#xff0c;需要经常使用到IfPresent()。 但是&#xff0c;如果是对List进行判空、循环的话&#xff0c;就稍显繁杂了&#xff0c;因为几乎每次对List进行操作的时候&a…

AI视频-stable-video-diffusio介绍

介绍 stbilityai/stable-video-diffusion-img2vid-xt模型&#xff0c;由Stability AI开发和训练的基于散度的图像到视频生成模型。该模型可以接受一张静态图像作为条件,并生成出一个短视频。 该模型通过在SVD Image-to-Video [14帧]的基础上进行微调而来,可以生成576x1024分辨…

初识Redis缓存,一文掌握Redis重要知识文集。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

存储拆分后,如何解决唯一主键问题?

之前我们讲到了分库分表&#xff0c;现在考虑这样一个问题&#xff1a;在单库单表时&#xff0c;业务 ID 可以依赖数据库的自增主键实现&#xff0c;现在我们把存储拆分到了多处&#xff0c;如果还是用数据库的自增主键&#xff0c;势必会导致主键重复。 那么我们应该如何解决…

Windows 10/11 免费安装HEVC/H.265视频扩展

将系统从 Win 10 升级到 Win 11 后&#xff0c;用系统自带播放器打开 HEVC &#xff08;H.265编码&#xff09;格式视频时&#xff0c;提示缺少编码器无法播放&#xff1b;以前可以通过浏览器访问 ms-windows-store://pdp/?ProductId9n4wgh0z6vhq 跳转到微软应用店免费安装解…

【算法】【动规】乘积为正数的最长子数组长度

跳转汇总链接 &#x1f449;&#x1f517;算法题汇总链接 1.1 乘积为正数的最长子数组长度 &#x1f517;题目链接 给你一个整数数组 nums &#xff0c;请你求出乘积为正数的最长子数组的长度。 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积…

docker镜像与容器的迁移

docker容器迁移有两组命令&#xff0c;分别是 save & load &#xff1a;操作的是images&#xff0c; 所以要先把容器commit成镜像export & import&#xff1a;直接操作容器 我们先主要看看他们的区别&#xff1a; 一 把容器打包为镜像再迁移到其他服务器 如把mysq…

RMQ算法总结

知识概览 RMQ又叫ST表、跳表&#xff0c;可以用来解决区间最值问题&#xff0c;这里这有查询没有修改。当然&#xff0c;这样的问题用线段树也是可以解决的。RMQ算法本质上是倍增动态规划&#xff0c;它的思想是先倍增预处理再查询。f(i, j)表示从i开始&#xff0c;长度是的区…

【Jeecg Boot 3 - 第二天】2.1、nginx 部署 JEECGBOOT VUE3

一、场景 二、实战 ▶ 2.1、打包&#xff08;build 前端&#xff09; &#xff1e; Stage 1&#xff1a;修改配置文件 .env.production&#xff08;作用&#xff1a;指向后端接口地址&#xff09; &#xff1e; Stage 2&#xff1a;点击build&#xff08;作用&#xff1…

【Ubuntu】Linux常用录屏软件

SimpleScreenRecorder SimpleScreenRecorder 是一款功能强大而易于使用的录屏工具&#xff0c;支持多种输出格式和编码器。 安装命令&#xff1a; sudo apt-get update sudo apt-get install simplescreenrecorder使用 SimpleScreenRecorder&#xff1a; 打开 SimpleScreenR…

虚幻学习笔记13—C++静态和动态加载

一、前言 我们在蓝图中可以很方便的添加各种需要的组件&#xff0c;那么在C代码中要如何实现呢。在代码中分静态和动态加载&#xff0c;而无论静态和动态&#xff0c;加载的内容有资源和资源类&#xff0c;资源类通常为带资源的蓝图类。 二、实现 在实现静态或动态加载时&…