上篇博客我们聊了《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 classCustomInterceptorextends HandlerInterceptorAdapter {
- 2 //请求处理之前执行的方法
- 3 @Override
- 4 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- 5 throws Exception {
- 6System.out.println("在请求处理之前执行该方法-preHandle");
- 7request.setAttribute("startTime", System.currentTimeMillis());
- 8 return true;
- 9 }
- 10
- 11 //在请求处理之后执行该方法
- 12 @Override
- 13 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
- 14ModelAndView modelAndView)throws Exception {
- 15System.out.println("在请求处理之后执行该方法-postHandle");
- 16 longstartTime = (Long) request.getAttribute("startTime");
- 17 longhandleTime = System.currentTimeMillis() -startTime;
- 18System.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 {
- 25System.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
来源: http://www.cnblogs.com/ludashi/p/6518296.html