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()方法会在请求完成并拦截完成后执行。下方是对相应的方法进行了重写。
public class CustomInterceptor extends HandlerInterceptorAdapter {
//请求处理之前执行的方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("在请求处理之前执行该方法-preHandle");
request.setAttribute("startTime", System.currentTimeMillis());
return true;
}
//在请求处理之后执行该方法
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("在请求处理之后执行该方法-postHandle");
long startTime = (Long) request.getAttribute("startTime");
long handleTime = System.currentTimeMillis() -startTime;
System.out.println("本次请求花费了:" + handleTime + "ms\n");
}
//请求处理完成所执行的方法
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("请求处理完成所执行的方法-afterCompletion");
}
}
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中的自定义拦截器及异常处理的更多相关文章
- JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术
在上篇博客中,我们聊了<JavaEE开发之SpringMVC中的自定义拦截器及异常处理>.本篇博客我们继续的来聊SpringMVC的东西,下方我们将会聊到js.css这些静态文件的加载配置 ...
- JavaEE开发之SpringMVC中的自定义消息转换器与文件上传
上篇博客我们详细的聊了<JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术>,本篇博客依然是JavaEE开发中的内容,我们就来聊一下SpringMVC中的自定义消息转发器 ...
- JavaEE开发之SpringMVC中的路由配置及参数传递详解
在之前我们使用Swift的Perfect框架来开发服务端程序时,聊到了Perfect中的路由配置.而在SpringMVC中的路由配置与其也是大同小异的.说到路由,其实就是将URL映射到Java的具体类 ...
- JavaEE开发之Spring中Bean的作用域、Init和Destroy方法以及Spring-EL表达式
上篇博客我们聊了<JavaEE开发之Spring中的依赖注入以及AOP>,本篇博客我们就来聊一下Spring框架中的Bean的作用域以及Bean的Init和Destroy方法,然后在聊一下 ...
- JavaEE开发之Spring中的多线程编程以及任务定时器详解
上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...
- JavaEE开发之Spring中的条件注解组合注解与元注解
上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条 ...
- JavaEE开发之Spring中的条件注解、组合注解与元注解
上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条 ...
- SpringMVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- SpringMVC 中的Interceptor 拦截器
1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors> <!-- 日志拦截器 --> <mvc:interceptor> ...
随机推荐
- APP H5 混合自动化使用说明 [基于 Appium+Python 系列]
背景 前几天接到H5开发人员那边的业务开发需求单,说想将H5接入到自动化系列中,特此记录分享一下. 环境前置准备 手机与电脑USB连接,开启USB调试模式,通过adb devices可查看到此设备. ...
- Jquery弹出窗口
今天讲了Jquery的弹出窗口的组成和用法: 先把引用文件的代码写好: // 每个弹窗的标识 var x =0; var idzt = new Array(); var Window = functi ...
- 香港多IP站群服务器-搭建多IP代理服务器、游戏加速服务器
耀磊花楹qq82521463香港WK自营机房多IP服务器租用,多IP站群服务器,多IP多C段 站群服务器租用 耀磊数据拥有3万个自由香港IP以及独立AS号,是APNIC核心成员,机房通过BGP融合 多 ...
- 1583: [Usaco2009 Mar]Moon Mooing 哞哞叫
1583: [Usaco2009 Mar]Moon Mooing 哞哞叫 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 244 Solved: 126 ...
- 安装rabbitmq以及集群配置
前言: (一些有用没用的唠叨,反正看了也不少肉,跳过也没啥) 情况是这样的:虚拟机.CentOS 6.5.免编译包安装rabbitmq集群,可不用连外网. 我原计划是安装在虚拟机上wyt1/wyt2/ ...
- JavaScript 再认识(一):Function调用模式对this的影响
近来,学习了一下<JavaScript精粹>,读到了函数这章,理清了JavaScript中this在不同调用模式下的指向. 1.Function调用模式:Function是JavaScri ...
- SignalR指定用户推送消息
一.首先,在MVC项目中安装SingalR包(SingalR2.0需要.net4.5以上,VS2010可以安装1.1.3版本,本例为VS2010+SignalR1.1.3). 打开工具-NuGet程序 ...
- CSS后代选择器、子元素选择器、相邻兄弟选择器区别与详解
派生选择器用的很多,派生选择器具体包括为后代选择器.子元素选择器.相邻兄弟选择器,我们来理解一下他们之间的具体用法与区别. 1.css后代选择器语法:h1 em {color:red;} 表示的是从h ...
- Parallel.For 你可能忽视的一个非常实用的重载方法
说起Parallel.For大家都不会陌生,很简单,不就是一个提供并行功能的for循环吗? 或许大家平时使用到的差不多就是其中最简单的那个重载方法,而真实情况 下Parallel.For里面有14个重 ...
- C#_扩展方法
这里我先引用一个实例,需求是这样:我们要将一个字符串中的字幕大小写变换,即大写变小写,小写变大写. 通常,我们首先会考虑在当前类中写一个方法,将字符串传进去,然后返回变换后的字符串.这样写当然不会错, ...