`
ssxxjjii
  • 浏览: 938056 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring mvc例子

 
阅读更多

使用拦截器

和Struts2一样,Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。

【示例23-9】HandlerInterceptor接口的代码如下:

  1. package org.springframework.web.servlet;  
  2. import Javax.servlet.http.HttpServletRequest;  
  3. import Javax.servlet.http.HttpServletResponse;  
  4. public interface HandlerInterceptor {  
  5.     // preHandle()方法在业务处理器处理请求之前被调用  
  6.     boolean preHandle(HttpServletRequest request,  HttpServletResponse response,  
  7.     Object handler)  
  8.         throws Exception;  
  9.     // postHandle()方法在业务处理器处理请求之后被调用  
  10.     void postHandle(  
  11.             HttpServletRequest request, HttpServletResponse  response, Object  
  12.             handler, ModelAndView modelAndView)  
  13.             throws Exception;  
  14.     // afterCompletion()方法在DispatcherServlet完全处理完请求后被调用  
  15.     void afterCompletion(  
  16.             HttpServletRequest request, HttpServletResponse response, Object  
  17.             handler, Exception ex)  
  18.             throws Exception;  
  19.  

下面对代码中的三个方法进行解释。

preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进 行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。

postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回请求前被调用,在该方法中对用户请求request进行处理。

afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

下面通过一个例子来说明如何使用Spring MVC框架的拦截器。

【示例23-10】要求编写一个拦截器,拦截所有不在工作时间的请求,把这些请求转发到一个特定的静态页面,而不对它们的请求进行处理。

首先编写TimeInterceptor.Java,代码如下:

  1. package com.examp.ch23;  
  2. import Java.util.Calendar;  
  3. import Javax.servlet.http.HttpServletRequest;  
  4. import Javax.servlet.http.HttpServletResponse;  
  5. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  6.  
  7. public class TimeInterceptor extends HandlerInterceptorAdapter {  
  8.                                         //继承HandlerInterceptorAdapter类  
  9.  
  10.     private int openingTime;            //openingTime 属性指定上班时间  
  11.     private int closingTime;            //closingTime属性指定下班时间  
  12.     private String outsideOfficeHoursPage;  
  13.                                         //outsideOfficeHoursPage属性指定错误  
  14.                                           提示页面的URL  
  15.     public void setOpeningTime(int openingTime) {  
  16.         this.openingTime = openingTime;  
  17.     }  
  18.     public void setClosingTime(int closingTime) {  
  19.         this.closingTime = closingTime;  
  20.     }  
  21.     public void setOutsideOfficeHoursPage(String outsideOfficeHoursPage) {  
  22.         this.outsideOfficeHoursPage = outsideOfficeHoursPage;  
  23.     }  
  24.     //重写 preHandle()方法,在业务处理器处理请求之前对该请求进行拦截处理  
  25.     public boolean preHandle(  
  26.             HttpServletRequest request,  
  27.             HttpServletResponse response,  
  28.             Object handler)  
  29.     throws Exception {  
  30.         Calendar cal = Calendar.getInstance();  
  31.         int hour = cal.get(Calendar.HOUR_OF_DAY);       //获取当前时间  
  32.         if (openingTime<=hour && hour<closingTime) {    //判断当前是否处于工作  
  33.                                                           时间段内  
  34.             return true;  
  35.         } else {  
  36.             response.sendRedirect(outsideOfficeHoursPage);  //返回提示页面  
  37.             return false;  
  38.         }  
  39.     }  

可以看出,上面的代码重载了preHandle()方法,该方法在业务处理器处理请求之前被调用。在该方法中,首先获得当前的时间,判断其是否在 openingTime和closingTime之间,如果在,返回true,这样才会调用业务控制器去处理该请求;否则直接转向一个静态页面,返回 false,这样该请求就不会被处理。

下面是在dispatcherServlet-servlet.xml中对拦截器进行的配置,代码如下:

  1. <bean id="urlMapping" class="org.springframework.web.servlet.handler.Simple-  
  2. UrlHandlerMapping">  
  3.         <property name="mappings">  
  4.             <props>  
  5.                 <prop key="helloWorld.do">helloWorldAction</prop>  
  6.                 <prop key="login.do">loginController</prop>  
  7.             </props>  
  8.         </property>  
  9.         <property name="interceptors">  
  10.                                 <!--在interceptors 属性中定义所有的拦截器-->  
  11.             <list>  
  12.                 <ref bean="officeHoursInterceptor"/>  
  13.                                 <!--引用officeHoursInterceptor 拦截器-->  
  14.             </list>  
  15.         </property>  
  16.           
  17. </bean>  
  18. <!--定义TimeInterceptor拦截器,id为officeHoursInterceptor -->  
  19. <bean id="officeHoursInterceptor" 
  20.       class="com.examp.ch23.TimeInterceptor">  
  21.     <!--openingTime 属性指定上班时间-->  
  22.     <property name="openingTime"><value>9</value></property>  
  23.     <!--closingTime属性指定下班时间-->  
  24.     <property name="closingTime"><value>18</value></property>  
  25.      <!--outsideOfficeHoursPage属性指定提示页面的URL-->  
  26.     <property name="outsideOfficeHoursPage"><value>http://localhost:8080/  
  27.     ch23/outsideOfficeHours.html</value></property>  
  28. </bean> 

可以看出,上面代码用bean标签去定义TimeInterceptor,令其id为officeHoursInterceptor,并给它的3个 属性赋值。在urlMapping中通过<property name="interceptors">去指定officeHoursInterceptor为一个拦截器,读者可以在<list> 和</list>之间定义多个拦截器。

outsideOfficeHours.html的代码很简单,只是输出一句提示语。

运行程序,在浏览器中随便访问一个页面,如果请求的时间在9点~18点之间,则该请求可以被处理;否则,返回一句提示语,如图23-5所示。

 
(点击查看大图)图23-5  请求被拦截效果图

说 明:在第22章中介绍过控制反转是Spring框架的核心思想,即用一个接口去定义一些操作,在接口的实现类中去重写这些操作,然后在Spring的配置 文件中去把该接口的实现类注入到应有框架中,这样就可以通过调用接口去调用接口的实现类。本节讲的拦截器就体现了这种思想,即实现 HandlerInterceptorAdapter接口,重写preHandle()方法并在配置文件中实现TimeInterceptor的注入。这 样当框架调用HandlerInterceptorAdapter时,就可以调用到TimeInterceptor类的preHandle()方法。

分享到:
评论

相关推荐

    spring mvc 例子

    spring mvc 例子,spring mvc 例子,spring mvc 例子。

    一个简单的Spring MVC 例子

    在这个"一个简单的Spring MVC 例子"中,我们可以通过分析标题和描述,理解这是一个基础的实践项目,虽然功能简单,但它包含了Spring MVC框架的核心组件和基本流程。 首先,Spring MVC是Spring框架的一部分,它提供...

    Spring MVC 入门实例

    首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后, Spring 将这个请求交给一个名为 helloController ...

    Spring MVC 例子Demo源码

    Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、高性能和灵活的Web应用程序。它在Spring框架的基础上,为开发者提供了处理HTTP请求、视图渲染和数据绑定的能力。本示例Demo是基于Spring MVC实现的一个...

    Spring MVC 例子

    Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、模块化且松散耦合的Web应用程序。在Spring MVC中,控制器是处理用户请求并协调应用程序逻辑的关键组件。本示例将深入探讨`SimpleFormController`和`...

    spring mvc 例子,临时存放。

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用来处理 Web 请求和响应。这个压缩包看起来是一个 Spring MVC 示例项目的存储空间,包含了一些开发环境中常见的文件和目录。 1...

    Spring MVC例子

    这个例子将深入探讨 Spring MVC 的核心概念和使用方法。 在 Spring MVC 中,模型(Model)负责存储应用的数据,视图(View)用于呈现这些数据,控制器(Controller)处理用户请求并协调模型和视图。这种分层架构...

    Spring mvc例子程序

    基于注解spring mvc 整理的示范小程序,欢迎下载!

    wa-spring1-SpringProject.zip_spring mvc 例子

    spring的例子 很实用的,例子的源码啊

    Spring MVC简单例子

    Spring MVC 是一个强大的Java web...通过这个简单的例子,初学者可以全面地了解Spring MVC的工作原理和流程,为更深入的Web开发打下基础。实践中遇到的问题和解决方法也会加深对Spring MVC的理解,有助于提升开发技能。

    spring_aop1.rar_java aop_spring mvc 例子

    spring中aop入门的例子,里面有说明文件,希望对理解spring的aop有帮助

    自己做的spring MVC 例子

    NULL 博文链接:https://horsezp.iteye.com/blog/1447216

    Spring mvc整合mybatis例子

    Spring mvc整合mybatis例子

    springmvc4简单例子

    springmvc4简单例子,springmvc例子,适合学习。。。。。。

    mybatis分页例子(spring MVC mybatis 分页)

    mybatis 3.1.1, spring-3.1.3 与 mybatis-spring -1.1.1 集成的 分页程序,以及spring MVC 例子. 没分了,收取一分,如果有和我一样穷的兄弟,你可以到我的博客上去下载,不需要积分:...

    spring mvc简单的例子和教程

    Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建Web应用程序的后端控制器。在本教程中,我们将深入探讨Spring MVC的基本概念、配置、以及如何创建一个简单的示例。 ...

Global site tag (gtag.js) - Google Analytics