前言:
一、总共有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的启动时加载的属性类似。
相关推荐
在Spring 3.x的MVC框架中,配置文件起着至关重要的作用,它们定义了Spring MVC应用程序的行为和组件。这篇博客“Spring3.X @MVC - (一)重要的配置文件”可能探讨了如何设置和理解这些配置文件,以及它们如何与...
5. **请求处理与拦截器** Controller接口的处理方法可以使用注解来定义,如@RequestMapping。此外,Interceptor接口提供了预处理和后处理请求的能力,可以实现如权限检查、日志记录等功能。 6. **本地化与主题支持...
5. **Spring的扩展性**:Spring框架提供了丰富的扩展点,如自定义拦截器、AOP切面、事件监听等。熟悉这些扩展点,可以让我们更好地利用Spring定制化我们的应用。 通过以上步骤和对Spring 3.2.x关键知识点的掌握,你...
7. **拦截器(Interceptor)**:Spring MVC提供了一种预处理和后处理请求的能力,通过实现HandlerInterceptor接口,可以在请求被处理前后执行自定义逻辑。 8. **异常处理**:通过@ControllerAdvice和@...
Spring MVC是Spring提供的Web开发框架,它提供了模型-视图-控制器架构,支持RESTful风格的URL设计,以及视图渲染、拦截器、数据绑定等功能,让Web开发更高效。 8. **消息传递** Spring支持JMS(Java Message ...
Spring MVC--自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器
3.1.1.RELEASE对通知(advisors)、切点(pointcuts)和自定义拦截器的定义进行了优化,提供了更强大的AOP能力。 3. **数据访问/集成**:Spring提供了JDBC抽象层,简化了数据库操作,并支持ORM(对象关系映射)框架...
这个“Spring.Web.Mvc3.zip bug修改版”可能是一个修复了原版Spring.Web.Mvc3框架中特定问题的更新版本,特别是针对描述中提到的“cshtml页面不能用多个controller的问题”。 首先,我们来深入理解这个问题的核心。...
Spring3.x MVC是Java开发中广泛使用的一个框架,它提供了模型-视图-控制器(MVC)架构,用于构建高效、可维护的Web应用程序。在本教程中,我们将深入探讨Spring3.x MVC的关键特性,通用配置,以及在企业级项目中的...
4. **Spring-AOP**: `spring-aop-4.2.4.RELEASE.jar`是Spring对AOP的支持,允许开发者定义方法拦截器和切面。AOP是将关注点分离的一种编程范式,常用于日志记录、事务管理、性能统计等横切关注点。 5. **Spring-Web...
3. **Spring AOP**:实现了面向切面编程,允许定义方法拦截器和切入点表达式。 4. **Spring MVC**:用于构建Web应用的Model-View-Controller框架,提供了灵活的配置和丰富的视图技术支持。 5. **Spring JDBC**:...
此外,还可以配置拦截器、视图控制器和异常处理器。 2. **spring-mybatis.xml**: 这个文件是Spring与MyBatis集成的关键,用于配置数据源、事务管理器、SqlSessionFactory以及Mapper扫描器。通过这个配置,Spring...
4. **spring-aop**: 实现了面向切面编程(AOP),允许定义方法拦截器和切面,用于实现如日志、事务管理等功能。 5. **spring-web**: 为Web应用提供支持,包括HTTP多部分请求处理、Servlet监听器等。 6. **spring-web...
`spring-webmvc-struts.jar`是Spring框架为了与Struts框架集成而设计的一个模块,它提供了对Struts应用的Spring支持,使得开发者可以在Struts应用中利用Spring的特性,如依赖注入(DI)、面向切面编程(AOP)等。...
在本讨论中,我们将深入探讨两个核心组件——`spring-web.jar`和`spring-webmvc.jar`,它们在Spring MVC框架中扮演着关键角色。 首先,`spring-web.jar`是Spring框架的Web层组件,它提供了与Web相关的功能。这个库...
在本篇基于注解的Spring 3.0.x MVC学习笔记中,我们将深入探讨Spring MVC在3.0版本中的...接下来,你可以进一步探索如数据绑定、转换器和格式化器、拦截器、AOP等方面的内容,以全面掌握Spring 3.0.x MVC的强大功能。
`org.springframework.web-3.0.2.RELEASE.jar`:这个库包含了一些 Web 相关的支持类,如 Web 应用上下文(WebApplicationContext)、HTTP 拦截器(HandlerInterceptor)和请求映射(RequestMapping)等,它们与 MVC ...
标题 "spring.mvc.hibernate231security-CRUD" 暗示了这是一个关于Spring MVC、Hibernate和Spring Security的项目,其中包含了创建、读取、更新和删除(CRUD)操作的实现。在这个项目中,我们将深入探讨这三大核心...
在搭建Spring 3.x开发环境时,我们首先要理解Spring的核心概念和它在Java应用程序中的作用。Spring是一个开源的Java框架,主要用于简化企业级应用的开发,通过依赖注入(Dependency Injection, DI)和面向切面编程...
3. Spring AOP:实现面向切面编程,允许我们定义拦截器,进行横切关注点的分离,如日志、事务管理等。 4. Spring MVC:Spring的Web框架,用于构建高效、灵活的Web应用,支持RESTful风格的编程模型。 三、Spring MVC...