上篇博客我们聊了《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中的自定义拦截器及异常处理相关推荐

  1. SpringMVC自定义拦截器与异常处理(自定义异常)

    SpringMVC自定义拦截器与异常处理 拦截器概念 拦截器代码演示 创建maven工程 pom.xml <?xml version="1.0" encoding=" ...

  2. SpringMVC——自定义拦截器、异常处理以及父子容器配置

    SpringMVC--自定义拦截器.异常处理以及父子容器配置 参考文章: (1)SpringMVC--自定义拦截器.异常处理以及父子容器配置 (2)https://www.cnblogs.com/so ...

  3. SpringMVC中使用Interceptor拦截器

    2019独角兽企业重金招聘Python工程师标准>>> SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理. ...

  4. 在struts2中配置自定义拦截器放行多个方法

    源码: 自定义的拦截器类: //自定义拦截器类:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet ...

  5. SpringMVC中过滤器和拦截器的区别

    文章目录 1.引言 2.共同点 3.区别 3.1.拦截器 3.2.过滤器 4.具体实现 4.1.拦截器 4.1.1.拦截实现方式 4.1.2.拦截实现 4.2.过滤器 4.2.1.过滤器实现方式 4. ...

  6. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  7. springboot-2.2.5中自定义拦截器、静态资源映射、视图控制器和其他功能

    在spring-boot-2.2.5中对MVC自动配置类进行的更改,之前的WebMvcConfigurerAdapter类声明为过时的,现在进行自定义扩展需要实现WebMvcConfigurer类重写 ...

  8. spring拦截器覆盖_Spring中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  9. springMVC之mvc:interceptors拦截器的用法

    1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors><!-- 日志拦截器 --><mvc:interceptor>< ...

最新文章

  1. 考c语言三级需要什么软件,全国计算机三级网络技术上机考C语言的软件是什么哈?...
  2. jquery学习手记(4)元素的选择与操作
  3. python函数中可变参数的传递方式是_详解Python函数可变参数定义及其参数传递方式...
  4. Python 爬虫利器三之 Xpath 语法与 lxml 库的用法
  5. 聚类分析(一)基本思想
  6. sendBroadcast和sendStickyBroadcast的区别
  7. DreamFacotry 第6章 将业务逻辑集成到DreamFactory API中
  8. RK3288_Android7.1调试RTC总结(一)
  9. Spring源码系列(十一)——Spring源码总结
  10. 在Windows中用VMWare虚拟机安装Linux 64位Gaussian 09手记
  11. 双线性对在密码学中的应用(上)
  12. Gerber文件解析
  13. 2019年计算机二级获证条件,2019年下半年全国计算机等级考试报考简章
  14. 微信小程序搜索框 回车搜索事件
  15. 论文翻译 —— Model Free Episodic Control
  16. 【Unity Shaders】Transparency —— 使用渲染队列进行深度排序
  17. MFC中如何将两个独立的程序合并为一个程序(障眼法)
  18. 计算机ct检查,什么是CT检查?CT检查设备介绍
  19. 教你同时查询百世多个未签收单号的物流情况
  20. 涂鸦TuyaOS SDK 网关例程-wifi配网

热门文章

  1. android文件添加一行代码怎么写,Android:以编程方式添加Textview,而不是将文本包装到下一行(示例代码)...
  2. 联发科技嵌入式_【MTK联发科技嵌入式面试】联发科技校招最新面试经验-看准网...
  3. linux 多核线程 调度,通过轻型线程提高多核设备中的Linux实时性能
  4. mvc ajax控制器无反应,关于ASP.NET MVC 3:无法通过AJAX将数据传递到控制器
  5. 微擎php5.6无法上传图片,解决PHP5.6版本“No input file specified”的问题
  6. java 资源锁_concurrent包 线程池、资源封锁和队列、ReentrantReadWriteLock介绍
  7. 导入项目报错报错Error:java: Cannot run program “D:/jdk/jdk1.7.0_67/bin/java“
  8. vue 调用c++_electron-vue跨平台桌面应用开发实战教程(七)——ffi调用C++(macOS平台)...
  9. 2017.9.28 lca 失败总结
  10. Pentium 4处理器架构/微架构/流水线(1) - 概述