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> ...
随机推荐
- abstract和interface的区别
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...
- php数组的使用
<?php echo "<h2>--------普通数组--------</h2>"; $arr1 = array(1,2,3,4); print_r ...
- java中的对象
对象 --计算机语言中的对象 通常,我们可以从一般事物的三个方面,去认识事物: 一.是什么? 二.为什么? 三.怎么样? 接下来,我们也利用这三个方面的思维,去 ...
- 关于struts2中的default-action-ref
struts2中的default-action-ref一般用于,在请求无效或错误时将请求指引到错误页面.我这次的用法是在请求首页之前先发送请求到后台,进行数据获取后再转至首页显示,但是出了一个问题,d ...
- 用shell实现linux系统应用文件清理工具
用shell实现linux系统文件清理工具 1:原始需求 在系统运维中,会产生大量应用备份文件.落地文件等,这些文件需要定时清理.一般来说,都是使用crontab 拉起一个脚本来清理.类似这样: 30 ...
- yii中调整ActiveForm表单样式
Yii2中对于表单和字段的支持组件为ActiveForm和ActiveField, <?php $form = ActiveForm::begin([ 'id' => 'login-for ...
- HTML 表单常用的代码元素
表单: 将数据通过浏览器提交到服务器的媒介.<form action="" method="get/post" ></form> get ...
- HTTP [TCP Retransmission] Continuation or non-HTTP traffic[Packet size limited during capture]
http://www.xianren.org/blog/net/wireshark-q.html 抓到的包数据中常见的错误..待细看,先记下. tcpdump 抓包后发现,出现大量标题字样显示,不利 ...
- 服务器中 配置phpstudy一键安装包
在线phpstudy一键安装包 安装版: (很简单) wget -c http://lamp.phpstudy.net/phpstudy.bin chmod +x phpstudy.bin ...
- JPlayer Jquery video视频插件
近日一直在搜关于视频的jquery插件,要求功能全,跨平台,百思不得其解,偶尔找到一个插件JPlayer,国产的,很全.为什么选择JPlayer 简单:几分钟就可以上手编码.部署 可定制:可以方便地用 ...