JavaEE开发之SpringMVC中的自定义拦截器及异常处理

上篇博客我们聊了《JavaEE开发之SpringMVC中的路由配置及参数传递详解》,本篇博客我们就聊一下自定义拦截器的实现、以及使用ModelAndView对象将Controller的值加载到JSTL上、最后再聊一下异常的捕获处理。这些在日常开发中都是经常使用的东西。具体请看下方内容。

 

一、自定义拦截器

顾名思义,拦截器是负责拦截某些东西的工具。本部分我们创建的拦截器是负责拦截请求的。这个拦截器类似于高速收费站,只要是想上高速的,都得经过我这个拦截器才可以。也就是说,接下来我们所创建的拦截器就类似于收费站的作用、所有的用户请求都会经过我们这个拦截器。废话少说,接下来我们就来创建一个拦截器,并部署到我们的Spring中。

 

1、自定义拦截器的创建

接下来我们就要创建自定义拦截器了,首先我们创建一个Java类,命名为CustomInterceptor。因为我们要创建的是Spring中的拦截器,所以要继承与springframework中的HandlerInterceptorAdapter抽象类。创建CustomInterceptor类的过程如下

  JavaEE开发之SpringMVC中的自定义拦截器及异常处理_第1张图片

 

HandlerInterceptorAdapter是Spring框架中自定义拦截器的适配器,我们可以看一下HandlerInterceptorAdapter抽象类的具体实现,下方是我们关联的Spring框架的源代码中的HandlerInterceptorAdapter抽象类的实现。

从下方源代码中我们不难看出HandlerInterceptorAdapter抽象类实现了AsyncHandlerInterceptor接口,在HandlerInterceptorAdapter的每个方法中并没有具体实现什么东西,所以我们继承HandlerInterceptorAdapter后,要对相应的方法进行实现。这些方法会在拦截用户请求的特定阶段去执行,下方会具体介绍到。

  JavaEE开发之SpringMVC中的自定义拦截器及异常处理_第2张图片

 

 

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中即可。如下所示:

  JavaEE开发之SpringMVC中的自定义拦截器及异常处理_第3张图片

 

 

4、拦截器的测试

创建以及配置好拦截器后,我们就开始测试了。Tomcat重启后,我们发起网络请求。下方是控制台打出的log信息。从输出结果我们不难看出,只要有网络请求,就会执行拦截器中相应的方法。如下所示:

  JavaEE开发之SpringMVC中的自定义拦截器及异常处理_第4张图片

 

 

二、将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 heretitle>
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对象进行返回。如下所示:

  JavaEE开发之SpringMVC中的自定义拦截器及异常处理_第5张图片

 

 

3、对页面的访问

实现完Controller以及相应的JSP文件后,接下来我们就该对其进行访问了。下方是对相应路由的访问结果,从输出结果中我们可以看出,${message_key}的值就是相应Controller中所返回的值。

  JavaEE开发之SpringMVC中的自定义拦截器及异常处理_第6张图片

 

 

 

三、异常的统一处理

接下来我们就来捕获抛出的异常,并将异常信息通过ModelAndView的对象交付给指定错误处理页面来显示。要实现该功能,主要用到的注解是@ControllerAdvice和@ExceptionHandel注解。首先我们将创建的Java类ExceptionHandlerAdvice使用注解@ControllerAdvice进行修饰,然后将exception()方法使用@ExceptionHandler进行注解,使其成为处理异常的方法。

在exception()方法中使用ModelAndView对象将错误信息交付给error.jsp进行显示即可。

  JavaEE开发之SpringMVC中的自定义拦截器及异常处理_第7张图片

 

定义完处理异常的Advice后,接下来就该抛出个异常来测试一下我们异常处理的方法了。下方的这个AdviceController就是我们测试类,其中抛出了一个异常。具体代码如下所示:

  JavaEE开发之SpringMVC中的自定义拦截器及异常处理_第8张图片

 

下方是我们访问“/advice”路由所返回的结果,可以看出,抛出的异常以及在exception()方法中进行处理了。

  JavaEE开发之SpringMVC中的自定义拦截器及异常处理_第9张图片

 

今天的博客就先到这儿吧、下篇博客会继续更新关于SpringMVC的东西。

github代码分享地址:https://github.com/lizelu/SpringMVCWithMaven

 

你可能感兴趣的:(JavaEE开发之SpringMVC中的自定义拦截器及异常处理)