JavaEE开发之SpringMVC中的自定义拦截器及异常处理
上篇博客我们聊了《JavaEE开发之SpringMVC中的路由配置及参数传递详解》,本篇博客我们就聊一下自定义拦截器的实现、以及使用ModelAndView对象将Controller的值加载到JSTL上、最后再聊一下异常的捕获处理。这些在日常开发中都是经常使用的东西。具体请看下方内容。
一、自定义拦截器
顾名思义,拦截器是负责拦截某些东西的工具。本部分我们创建的拦截器是负责拦截请求的。这个拦截器类似于高速收费站,只要是想上高速的,都得经过我这个拦截器才可以。也就是说,接下来我们所创建的拦截器就类似于收费站的作用、所有的用户请求都会经过我们这个拦截器。废话少说,接下来我们就来创建一个拦截器,并部署到我们的Spring中。
1、自定义拦截器的创建
接下来我们就要创建自定义拦截器了,首先我们创建一个Java类,命名为CustomInterceptor。因为我们要创建的是Spring中的拦截器,所以要继承与springframework中的HandlerInterceptorAdapter抽象类。创建CustomInterceptor类的过程如下
HandlerInterceptorAdapter是Spring框架中自定义拦截器的适配器,我们可以看一下HandlerInterceptorAdapter抽象类的具体实现,下方是我们关联的Spring框架的源代码中的HandlerInterceptorAdapter抽象类的实现。
从下方源代码中我们不难看出HandlerInterceptorAdapter抽象类实现了AsyncHandlerInterceptor接口,在HandlerInterceptorAdapter的每个方法中并没有具体实现什么东西,所以我们继承HandlerInterceptorAdapter后,要对相应的方法进行实现。这些方法会在拦截用户请求的特定阶段去执行,下方会具体介绍到。
2、自定义拦截器中相应方法的重写
下方代码段就是我们CustomInterceptor类中所重写的方法。preHandle()方法会在请求处理之前执行,postHandle()方法会在请求处理后执行,afterCompletion()方法会在请求完成并拦截完成后执行。下方是对相应的方法进行了重写。
1 public class CustomInterceptor extends HandlerInterceptorAdapter { 2 //请求处理之前执行的方法 3 @Override 4 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 5 throws Exception { 6 System.out.println("在请求处理之前执行该方法-preHandle"); 7 request.setAttribute("startTime", System.currentTimeMillis()); 8 return true; 9 } 10 11 //在请求处理之后执行该方法 12 @Override 13 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 14 ModelAndView modelAndView) throws Exception { 15 System.out.println("在请求处理之后执行该方法-postHandle"); 16 long startTime = (Long) request.getAttribute("startTime"); 17 long handleTime = System.currentTimeMillis() -startTime; 18 System.out.println("本次请求花费了:" + handleTime + "ms\n"); 19 } 20 21 //请求处理完成所执行的方法 22 @Override 23 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 24 throws Exception { 25 System.out.println("请求处理完成所执行的方法-afterCompletion"); 26 } 27 28 }
3.配置自定义拦截器
创建完相应的拦截器后,我们还需将其配置到Spring中该拦截器才起作用。因为我们的Spring配置类继承了WebMvcConfigurerAdapter抽象类,而在WebMvcConfigurerAdapter抽象类中就有添加拦截器的方法addInterceptors()。我们可以重写此方法,通过该方法我们可以添加多个拦截器。
下方截图中的代码段就是在Spring的配置文件中来配置Interceptor的代码段。首先我们创建了一个自定义拦截器Bean,然后将拦截器的Bean通过addInterceptors()方法添加到Spring中即可。如下所示:
4、拦截器的测试
创建以及配置好拦截器后,我们就开始测试了。Tomcat重启后,我们发起网络请求。下方是控制台打出的log信息。从输出结果我们不难看出,只要有网络请求,就会执行拦截器中相应的方法。如下所示:
二、将Controller返回的信息展示到JSP模板(ModelAndView)
本部分是为下一部分做铺垫的,本部分所做的事情就是将Controller中路由所映射的方法所返回的内容输出到JSTL模板上。当然主要还是用到了spring框架中的ModelAndView对象。该对象会将返回的信息与JSTL模板上的参数进行绑定,然后在JPS页面上进行显示,当然这与PHP中的Smarty模板引擎的工作方式是极为相似的。下方就使用ModelAndView对象将信息输出到JSTL模板上。
1.创建JSTL模板文件
首先我们创建接纳Controller返回信息的页面模板,在此我们在src/main/resources目录的views下面创建一个message.jsp文件。文本内容比较简单,只有一个JSTL标签${message_key}, 该标签可以接受Controller中相应的方法所返回的信息。
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title> </head> <body><h1>${message_key}</h1> </body> </html>
2、给JSTL标签赋值
接下来所做的就是在相应的Controller相应的方法中给message_key标签绑定相应的值,并在相应的模板文件中进行显示。接下来我们就来创建一个ModelViewController控制器类,来负责值的绑定。下方代码段就是我们的ModeViewController的实现内容。
主要还是ModelAndView的使用。首先我们创建了一个ModelAndView的对象,在ModelAndView的构造器中传入的参数就是JSTL模板所在的JSP页面的文件名。然后ModelAndView对象通过调用addObject()方法对“message_key”进行了“Hello world”的值的绑定,最后将modelAndView对象进行返回。如下所示:
3、对页面的访问
实现完Controller以及相应的JSP文件后,接下来我们就该对其进行访问了。下方是对相应路由的访问结果,从输出结果中我们可以看出,${message_key}的值就是相应Controller中所返回的值。
三、异常的统一处理
接下来我们就来捕获抛出的异常,并将异常信息通过ModelAndView的对象交付给指定错误处理页面来显示。要实现该功能,主要用到的注解是@ControllerAdvice和@ExceptionHandel注解。首先我们将创建的Java类ExceptionHandlerAdvice使用注解@ControllerAdvice进行修饰,然后将exception()方法使用@ExceptionHandler进行注解,使其成为处理异常的方法。
在exception()方法中使用ModelAndView对象将错误信息交付给error.jsp进行显示即可。
定义完处理异常的Advice后,接下来就该抛出个异常来测试一下我们异常处理的方法了。下方的这个AdviceController就是我们测试类,其中抛出了一个异常。具体代码如下所示:
下方是我们访问“/advice”路由所返回的结果,可以看出,抛出的异常以及在exception()方法中进行处理了。
今天的博客就先到这儿吧、下篇博客会继续更新关于SpringMVC的东西。
github代码分享地址:https://github.com/lizelu/SpringMVCWithMaven
JavaEE开发之SpringMVC中的自定义拦截器及异常处理相关推荐
- SpringMVC自定义拦截器与异常处理(自定义异常)
SpringMVC自定义拦截器与异常处理 拦截器概念 拦截器代码演示 创建maven工程 pom.xml <?xml version="1.0" encoding=" ...
- SpringMVC——自定义拦截器、异常处理以及父子容器配置
SpringMVC--自定义拦截器.异常处理以及父子容器配置 参考文章: (1)SpringMVC--自定义拦截器.异常处理以及父子容器配置 (2)https://www.cnblogs.com/so ...
- SpringMVC中使用Interceptor拦截器
2019独角兽企业重金招聘Python工程师标准>>> SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理. ...
- 在struts2中配置自定义拦截器放行多个方法
源码: 自定义的拦截器类: //自定义拦截器类:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet ...
- SpringMVC中过滤器和拦截器的区别
文章目录 1.引言 2.共同点 3.区别 3.1.拦截器 3.2.过滤器 4.具体实现 4.1.拦截器 4.1.1.拦截实现方式 4.1.2.拦截实现 4.2.过滤器 4.2.1.过滤器实现方式 4. ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- springboot-2.2.5中自定义拦截器、静态资源映射、视图控制器和其他功能
在spring-boot-2.2.5中对MVC自动配置类进行的更改,之前的WebMvcConfigurerAdapter类声明为过时的,现在进行自定义扩展需要实现WebMvcConfigurer类重写 ...
- spring拦截器覆盖_Spring中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- springMVC之mvc:interceptors拦截器的用法
1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors><!-- 日志拦截器 --><mvc:interceptor>< ...
最新文章
- 考c语言三级需要什么软件,全国计算机三级网络技术上机考C语言的软件是什么哈?...
- jquery学习手记(4)元素的选择与操作
- python函数中可变参数的传递方式是_详解Python函数可变参数定义及其参数传递方式...
- Python 爬虫利器三之 Xpath 语法与 lxml 库的用法
- 聚类分析(一)基本思想
- sendBroadcast和sendStickyBroadcast的区别
- DreamFacotry 第6章 将业务逻辑集成到DreamFactory API中
- RK3288_Android7.1调试RTC总结(一)
- Spring源码系列(十一)——Spring源码总结
- 在Windows中用VMWare虚拟机安装Linux 64位Gaussian 09手记
- 双线性对在密码学中的应用(上)
- Gerber文件解析
- 2019年计算机二级获证条件,2019年下半年全国计算机等级考试报考简章
- 微信小程序搜索框 回车搜索事件
- 论文翻译 —— Model Free Episodic Control
- 【Unity Shaders】Transparency —— 使用渲染队列进行深度排序
- MFC中如何将两个独立的程序合并为一个程序(障眼法)
- 计算机ct检查,什么是CT检查?CT检查设备介绍
- 教你同时查询百世多个未签收单号的物流情况
- 涂鸦TuyaOS SDK 网关例程-wifi配网
热门文章
- android文件添加一行代码怎么写,Android:以编程方式添加Textview,而不是将文本包装到下一行(示例代码)...
- 联发科技嵌入式_【MTK联发科技嵌入式面试】联发科技校招最新面试经验-看准网...
- linux 多核线程 调度,通过轻型线程提高多核设备中的Linux实时性能
- mvc ajax控制器无反应,关于ASP.NET MVC 3:无法通过AJAX将数据传递到控制器
- 微擎php5.6无法上传图片,解决PHP5.6版本“No input file specified”的问题
- java 资源锁_concurrent包 线程池、资源封锁和队列、ReentrantReadWriteLock介绍
- 导入项目报错报错Error:java: Cannot run program “D:/jdk/jdk1.7.0_67/bin/java“
- vue 调用c++_electron-vue跨平台桌面应用开发实战教程(七)——ffi调用C++(macOS平台)...
- 2017.9.28 lca 失败总结
- Pentium 4处理器架构/微架构/流水线(1) - 概述