《Java Web编程从入门到实践(15小时高清晰、交互式视频教学)》第23章SSpring的Web架构,本章结合实例讲解了Spring MVC框架的各个组件的使用方法、Spring拦截器和数据验证的使用方法,以及Spring和Struts 2集成的实现方法。本节为大家介绍使用拦截器。
package org.springframework.web.servlet;
import Javax.servlet.http.HttpServletRequest;
import Javax.servlet.http.HttpServletResponse;
public interface HandlerInterceptor {
// preHandle()方法在业务处理器处理请求之前被调用
boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)
throws Exception;
// postHandle()方法在业务处理器处理请求之后被调用
void postHandle(
HttpServletRequest request, HttpServletResponse
response, Object
handler, ModelAndView modelAndView)
throws Exception;
// afterCompletion()方法在DispatcherServlet完全处理完请求后被调用
void afterCompletion(
HttpServletRequest request, HttpServletResponse
response, Object
handler, Exception ex)
throws Exception;
}
package com.examp.ch23;
import Java.util.Calendar;
import Javax.servlet.http.HttpServletRequest;
import Javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class TimeInterceptor extends HandlerInterceptorAdapter {
//继承HandlerInterceptorAdapter类
private int openingTime; //openingTime 属性指定上班时间
private int closingTime; //closingTime属性指定下班时间
private String outsideOfficeHoursPage;
//outsideOfficeHoursPage属性指定错误
提示页面的URL
public void setOpeningTime(int openingTime) {
this.openingTime = openingTime;
}
public void setClosingTime(int closingTime) {
this.closingTime = closingTime;
}
public void setOutsideOfficeHoursPage(String outsideOfficeHoursPage) {
this.outsideOfficeHoursPage = outsideOfficeHoursPage;
}
//重写 preHandle()方法,在业务处理器处理请求之前对该请求进行拦截处理
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler)
throws Exception {
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY); //获取当前时间
if (openingTime<=hour && hour<closingTime) { //判断当前是否处于工作
时间段内
return true;
} else {
response.sendRedirect(outsideOfficeHoursPage); //返回提示页面
return false;
}
}
}
<bean id="urlMapping" class="org.springframework.web.servlet.handler.Simple-
UrlHandlerMapping">
<property name="mappings">
<props>
<prop key="helloWorld.do">helloWorldAction</prop>
<prop key="login.do">loginController</prop>
</props>
</property>
<property name="interceptors">
<!--在interceptors 属性中定义所有的拦截器-->
<list>
<ref bean="officeHoursInterceptor"/>
<!--引用officeHoursInterceptor 拦截器-->
</list>
</property>
</bean>
<!--定义TimeInterceptor拦截器,id为officeHoursInterceptor -->
<bean id="officeHoursInterceptor"
class="com.examp.ch23.TimeInterceptor">
<!--openingTime 属性指定上班时间-->
<property name="openingTime"><value>9</value></property>
<!--closingTime属性指定下班时间-->
<property name="closingTime"><value>18</value></property>
<!--outsideOfficeHoursPage属性指定提示页面的URL-->
<property name="outsideOfficeHoursPage"><value>http://localhost:8080/
ch23/outsideOfficeHours.html</value></property>
</bean>
说 明:在第22章中介绍过控制反转是Spring框架的核心思想,即用一个接口去定义一些操作,在接口的实现类中去重写这些操作,然后在Spring的配置 文件中去把该接口的实现类注入到应有框架中,这样就可以通过调用接口去调用接口的实现类。本节讲的拦截器就体现了这种思想,即实现 HandlerInterceptorAdapter接口,重写preHandle()方法并在配置文件中实现TimeInterceptor的注入。这 样当框架调用HandlerInterceptorAdapter时,就可以调用到TimeInterceptor类的preHandle()方法。