`
Josh_Persistence
  • 浏览: 1653564 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Spring3.X @MVC - (三)Spring3中的拦截器

阅读更多

前言:

一、总共有10节,也就是10篇博客来讲述Spring的MVC,几乎涵盖了所有Spring MVC中的内容。

 

二、我创建的例子是一个球场预订系统,例子我已经测试调试通过,是一个Maven的project,包含一个Parent project:wsheng-spring-base和一个子Module:wsheng-spring-mvc.

 

三、在Eclipse中直接import maven的project即可,会同时引入上诉两个project的。

 

四、如果你没有耐心,可以不必往下学习,因为网上有很多例子,但是都是讲的Spring MVC很少的面,而且你可以快速的上手,但如果你想真正了解Spring MVC中的很多细节,就可以慢慢的去看博客(从第一节到第十节),如果有什么问题,欢迎信息告诉我。

 

五、学习的方法是你可以先将源码导入到eclipse中,然后根据博客上的内容,对照源码,慢慢消化,这是个漫长的过程,但是会帮助你了解很多Spring MVC的细节。

===================================================================================

 

 

用Spring处理程序拦截器拦截请求

在Spring3.X @MVC - (二)So Easy的注解功能的学习基础上

http://josh-persistence.iteye.com/admin/blogs/1873733 接着学习Spring拦截器功能。

学过Java Web编程的开发人员都知道,Servlet API中有Servlet过滤器,该过滤器可以可以在Servlet进行Web请求先后进行相关的处理。其实Spring中也可以实现类似而且更加强大的功能。可以在Spring Web上下文中配置和过滤器相似的功能部件,这样就可以使用Spring强大的容器特性。

 

SpringMVC中可以使用拦截器(Handler Interceptors)拦截web请求进行预先和事后的处理。每个程序拦截器都必须实现HandlerInterceptor接口,实现该接口必须实现3个方法:preHandler(), postHandle(),afterCompletion()

preHandle(): 处理Request之前执行。

postHandler():处理Request方法之后但是还没有返回View之前执行,并允许处理ModelAndView对象。

afterCompletion():在所有请求处理完成之后(也就是显示视图之后)调用。

 

实战和原理:

需求: 测试每个Web请求的处理时间,并由视图将这个时间显示给用户。

package com.wsheng.spring.web;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

 

/**

 * 

 * @author Wang Sheng(Josh)

 *

 */

public class MeasurementInterceptor extends HandlerInterceptorAdapter {

 

    public boolean preHandle(HttpServletRequest request,

            HttpServletResponse response, Object handler) throws Exception {

        long startTime = System.currentTimeMillis();

        request.setAttribute("startTime", startTime);

        return true;

    }

 

    public void postHandle(HttpServletRequest request,

            HttpServletResponse response, Object handler,

  //Model model) throws Exception {

  ModelAndView modelAndView) throws Exception {

        long startTime = (Long) request.getAttribute("startTime");

        request.removeAttribute("startTime");

        long endTime = System.currentTimeMillis();

        //model.addAttribute("handlingTime", endTime - startTime);

        System.out.println("handlingTime:" + (endTime - startTime));

        modelAndView.addObject("handlingTime", endTime - startTime);

    }

 

}

 

你可能会注意到,这个地方MeasurementInterceptor继承了HandlerInterceptorAdapter,而不是实现了HandlerInterceptor接口,这是因为这个地方如果实现了HandlerInterceptor接口,那么就需要实现该接口中的所有方法,而这个地方我们只是简单的记录一下处理Request的时间,是不需要重写afterCompletion()方法的,最简单的方法是让在程序中让该方法体为空。还有另一种更好的方法是继承抽象类HandlerInterceptorAdapter ,实际上HandlerInterceptorAdpater是实现了HandlerInterceptor接口的,并重写了preHandle(), postHandle()和AfterCompletion()方法,而且这些方法都是具体的public方法,只不过preHandle()方法是返回true,postHandle()和afterCompletion()是空实现。所以用户在继承HandlerInterceptorAdapter后,可以根据自己的需要去进行重写。

 

接着需要将自定义的拦截器注册到DefaultAnnotationHandlerMapping bean中。这个bean的作用是将拦截器应用到所有以@Controller注解标注的类,意思是说所有的控制器都要受到拦截器的控制。(可以在数组类型的interceptors属性中指定多个拦截器)

<!-- Annotation handlers (Applied by default to ALL @controllers -->

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

        <property name="order" value="1"/>

        <!-- Interceptors are applied to all annotated controllers -->

         <property name="interceptors">

            <list>

                <ref bean="measurementInterceptor" />

            </list>

        </property>

    </bean>

 

然后可以在welcome.jsp中显示这个页面:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

 

<html>

<head>

<title><spring:message code="welcome.title" text="Welcome" /></title>

</head>

 

<body>

<h2><spring:message code="welcome.message" text="Welcome to Court Reservation System" /></h2>

 

Today is <fmt:formatDate value="${today}" pattern="yyyy-MM-dd" />.

<hr />

Handling time : ${handlingTime} ms

<br />

Locale : ${pageContext.response.locale}

</body>

</html>

 

DefaultAnnoationHandlerMapping的缺点:

如上所述,DefaultAnnoationHandlerMapping会将其中定义的所有的拦截器分配给所有的@Controller注解定义的类,如果想将不同的拦截器应用于不同的@Controller控制器上DefaultAnnoationHandlerMapping显然不能完成。幸运的是这是一个常见的需求,所以Scott Murphy的Spring-plugins项目就可以完成该功能,该项目允许你使用URL在控制器的基础上应用拦截器。

你可以在http://code.goole.com/p/springplugins/downloads/list中下载该项目,并将相关的jar配置到maven-repository中,但是很不幸的是,截止我发布这篇博客的时候,springplugins.jar还是没有在maven官方的repository中,最简单的方法是将其jar放在应用的WEB-INF/lib中,但是这个显然忽视了Maven强大的功能,比较好的解决办法是将其加到本地的maven repository中。可参照我的另一篇博客:

http://josh-persistence.iteye.com/admin/blogs/1874906

将jar包加到项目中后,接下来只需要配置一个springplugin中称作SelectedAnnotationHandlerMapping的一个类,并且将其配置和DefaultAnnoationHandlerMapping bean的配置放在一起就可以了。如:

<!-- Interceptors --> 

    <bean id="measurementInterceptor"

        class="com.wsheng.spring.web.MeasurementInterceptor" />

 

 

   <bean id="summaryReportInterceptor"

        class="com.wsheng.spring.web.ExtensionInterceptor" />

 

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

        <property name="order" value="1"/>

        <!-- Interceptors are applied to all annotated controllers -->

         <property name="interceptors">

            <list>

                <ref bean="measurementInterceptor" />

            </list>

        </property>

    </bean>

 

    <bean id="publicMapper" class="org.springplugins.web.SelectedAnnotationHandlerMapping">

        <property name="order" value="0" />

<property name="urls">

<list>

             <value>/reservationSummary*</value>

</list>

</property>

<property name="interceptors">

<list>

         <ref bean="summaryReportInterceptor" />

</list>

</property>

    </bean>

上面的配置会产生如下的效果:measurementInterceptor拦截器应用到所有以@Controller注解的控制器,而summaryReportInterceptor拦截器只用到用@Controller注解的,映射到/reservationSummary*URL的那些控制器。order值越小的,处理优先级越高。order值越大的,处理优先级越低。为处理程序拦截器分配order值的过程与当初在web.xml中分配给servlet的启动时加载的属性类似。

分享到:
评论

相关推荐

    Spring3.X @MVC - (一)重要的配置文件

    在Spring 3.x的MVC框架中,配置文件起着至关重要的作用,它们定义了Spring MVC应用程序的行为和组件。这篇博客“Spring3.X @MVC - (一)重要的配置文件”可能探讨了如何设置和理解这些配置文件,以及它们如何与...

    org.springframework.web.servlet-3.0.5.RELEASE.jar

    5. **请求处理与拦截器** Controller接口的处理方法可以使用注解来定义,如@RequestMapping。此外,Interceptor接口提供了预处理和后处理请求的能力,可以实现如权限检查、日志记录等功能。 6. **本地化与主题支持...

    spring-framework-3.2.x-for-eclipse.rar

    5. **Spring的扩展性**:Spring框架提供了丰富的扩展点,如自定义拦截器、AOP切面、事件监听等。熟悉这些扩展点,可以让我们更好地利用Spring定制化我们的应用。 通过以上步骤和对Spring 3.2.x关键知识点的掌握,你...

    org.springframework.web.servlet-3.1.0.RELEASE.jar.zip

    7. **拦截器(Interceptor)**:Spring MVC提供了一种预处理和后处理请求的能力,通过实现HandlerInterceptor接口,可以在请求被处理前后执行自定义逻辑。 8. **异常处理**:通过@ControllerAdvice和@...

    spring3.x-framework-reference.rar

    Spring MVC是Spring提供的Web开发框架,它提供了模型-视图-控制器架构,支持RESTful风格的URL设计,以及视图渲染、拦截器、数据绑定等功能,让Web开发更高效。 8. **消息传递** Spring支持JMS(Java Message ...

    Spring MVC--13.自定义拦截器

    Spring MVC--自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器

    spring-framework-3.1.1.RELEASE-with-docs

    3.1.1.RELEASE对通知(advisors)、切点(pointcuts)和自定义拦截器的定义进行了优化,提供了更强大的AOP能力。 3. **数据访问/集成**:Spring提供了JDBC抽象层,简化了数据库操作,并支持ORM(对象关系映射)框架...

    Spring.Web.Mvc3.zip bug修改版

    这个“Spring.Web.Mvc3.zip bug修改版”可能是一个修复了原版Spring.Web.Mvc3框架中特定问题的更新版本,特别是针对描述中提到的“cshtml页面不能用多个controller的问题”。 首先,我们来深入理解这个问题的核心。...

    官方原版完整包 spring-framework-5.3.1.RELEASE.zip

    4. **spring-aop**: 实现了面向切面编程(AOP),允许定义方法拦截器和切面,用于实现如日志、事务管理等功能。 5. **spring-web**: 为Web应用提供支持,包括HTTP多部分请求处理、Servlet监听器等。 6. **spring-web...

    Spring3.x MVC 例子

    Spring3.x MVC是Java开发中广泛使用的一个框架,它提供了模型-视图-控制器(MVC)架构,用于构建高效、可维护的Web应用程序。在本教程中,我们将深入探讨Spring3.x MVC的关键特性,通用配置,以及在企业级项目中的...

    spring 4.2.4.RELEASE核心jar包

    4. **Spring-AOP**: `spring-aop-4.2.4.RELEASE.jar`是Spring对AOP的支持,允许开发者定义方法拦截器和切面。AOP是将关注点分离的一种编程范式,常用于日志记录、事务管理、性能统计等横切关注点。 5. **Spring-Web...

    spring-5.2.3.RELEASE-dist.zip

    3. **Spring AOP**:实现了面向切面编程,允许定义方法拦截器和切入点表达式。 4. **Spring MVC**:用于构建Web应用的Model-View-Controller框架,提供了灵活的配置和丰富的视图技术支持。 5. **Spring JDBC**:...

    项目配置文件( spring-mvc.xml spring-mybatis.xml web.xml log4j.properties)

    此外,还可以配置拦截器、视图控制器和异常处理器。 2. **spring-mybatis.xml**: 这个文件是Spring与MyBatis集成的关键,用于配置数据源、事务管理器、SqlSessionFactory以及Mapper扫描器。通过这个配置,Spring...

    spring-webmvc-struts.jar

    `spring-webmvc-struts.jar`是Spring框架为了与Struts框架集成而设计的一个模块,它提供了对Struts应用的Spring支持,使得开发者可以在Struts应用中利用Spring的特性,如依赖注入(DI)、面向切面编程(AOP)等。...

    spring-web.jar spring-webmvc.jar

    在本讨论中,我们将深入探讨两个核心组件——`spring-web.jar`和`spring-webmvc.jar`,它们在Spring MVC框架中扮演着关键角色。 首先,`spring-web.jar`是Spring框架的Web层组件,它提供了与Web相关的功能。这个库...

    基于注解的spring_3.0.x_MVC学习笔记

    在本篇基于注解的Spring 3.0.x MVC学习笔记中,我们将深入探讨Spring MVC在3.0版本中的...接下来,你可以进一步探索如数据绑定、转换器和格式化器、拦截器、AOP等方面的内容,以全面掌握Spring 3.0.x MVC的强大功能。

    spring mvc jar包

    `org.springframework.web-3.0.2.RELEASE.jar`:这个库包含了一些 Web 相关的支持类,如 Web 应用上下文(WebApplicationContext)、HTTP 拦截器(HandlerInterceptor)和请求映射(RequestMapping)等,它们与 MVC ...

    spring.mvc.hibernate231security-CRUD

    标题 "spring.mvc.hibernate231security-CRUD" 暗示了这是一个关于Spring MVC、Hibernate和Spring Security的项目,其中包含了创建、读取、更新和删除(CRUD)操作的实现。在这个项目中,我们将深入探讨这三大核心...

    第一次搭建spring3.x需要的jar和搭建源码

    在搭建Spring 3.x开发环境时,我们首先要理解Spring的核心概念和它在Java应用程序中的作用。Spring是一个开源的Java框架,主要用于简化企业级应用的开发,通过依赖注入(Dependency Injection, DI)和面向切面编程...

    spring-framework-3.2.1--3.x

    3. Spring AOP:实现面向切面编程,允许我们定义拦截器,进行横切关注点的分离,如日志、事务管理等。 4. Spring MVC:Spring的Web框架,用于构建高效、灵活的Web应用,支持RESTful风格的编程模型。 三、Spring MVC...

Global site tag (gtag.js) - Google Analytics