Spring总结之SpringMvc下

五、拦截器

    SpringMVC中的拦截器是通过HandlerInterceptor来实现的,定义一个Interceptor有两种方式

    1、实现HandlerInterceptor接口或者继承实现了HandlerInterceptor接口的类,例如抽象类HandlerInterceptorAdapter

HandlerInterceptor 接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。

public class SpringMVCInterceptor implements HandlerInterceptor{
 /**
  * preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在 
  * 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在Controller方法调用之前调用。
  * SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返 回值为false,
  * 当preHandle的返回值为false的时候整个请求就结束了。
  */
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
   throws Exception {
  return false;
 }
 /**
  * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。
  * postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之 后,也就是在Controller的方法调用之后执行,
  * 但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操 作。
  * 这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用.
  */
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
   ModelAndView modelAndView) throws Exception {  
 }
 /**
  * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。
  * 该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行, 
     * 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。 
  */
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, 
     Exception ex)
   throws Exception {
   
 }
}

2、实现WebRequestInterceptor接口或这继承实现了WebRequestInterceptor接口的类。

WebRequestInterceptor 中也定义了三个方法,我们也是通过这三个方法来实现拦截的。这三个方法都传递了同一个参数WebRequest ,WebRequest 是Spring 定义的一个接口,它里面的方法定义都基本跟HttpServletRequest 一样,在WebRequestInterceptor 中对WebRequest 进行的所有操作都将同步到HttpServletRequest 中,然后在当前请求中一直传递。

public class SpringMVCInterceptor2 implements WebRequestInterceptor{
 /**
  * preHandle(WebRequest request) 方法。该方法将在请求处理之前进行调用,也就是说会在Controller 方法调用之前被调用。
  * 这个方法跟HandlerInterceptor 中的preHandle 是不同的,主要区别在于该方法的返回值是void ,也就是没有返回值,
  * 所以我们一般主要用它来进行资源的准备工作,比如我们在使用Hibernate 的时候可以在这个方法中准备一个Hibernate 的Session 对象,
  * 然后利用WebRequest 的setAttribute(name, value, scope)把它放到WebRequest 的属性中。
  * 这里可以说说这个setAttribute 方法的第三个参数scope ,该参数是一个Integer类型的。在WebRequest 的父层接口RequestAttributes 中对它定义了三个常量:
  * SCOPE_REQUEST :它的值是0 ,代表只有在request 中可以访问。
  * SCOPE_SESSION :它的值是1 ,如果环境允许的话它代表的是一个局部的隔离的session,否则就代表普通的session,并且在该session范围内可以访问。
  * SCOPE_GLOBAL_SESSION :它的值是2 ,如果环境允许的话,它代表的是一个全局共享的session,否则就代表普通的session,并且在该session 范围内可以访问。
  * 
  */
 public void preHandle(WebRequest request) throws Exception {
        System.out.println("AllInterceptor...............................");  
        request.setAttribute("request", "request", WebRequest.SCOPE_REQUEST);
        request.setAttribute("session", "session", WebRequest.SCOPE_SESSION);
        request.setAttribute("globalSession", "globalSession", WebRequest.SCOPE_GLOBAL_SESSION);
 }
 /**
  * postHandle(WebRequest request, ModelMap model) 方法。该方法将在请求处理之后,也就是在Controller 方法调用之后被调用,
  * 但是会在视图返回被渲染之前被调用,所以可以在这个方法里面通过改变数据模型ModelMap 来改变数据的展示。
  * 该方法有两个参数,WebRequest 对象是用于传递整个请求数据的,比如在preHandle 中准备的数据都可以通过WebRequest 来传递和访问;
  * ModelMap 就是Controller 处理之后返回的Model 对象,我们可以通过改变它的属性来改变返回的Model 模型
  */
 public void postHandle(WebRequest request, ModelMap model) throws Exception {
 }
 /** 
     * 该方法将在整个请求完成之后,也就是说在视图渲染之后进行调用,主要用于进行一些资源的释放 
     */  
 public void afterCompletion(WebRequest request, Exception ex) throws Exception { 
 }
}
<mvc:interceptors>  
 
    <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->  
 
    <bean class="com.host.app.web.interceptor.AllInterceptor"/>  
 
    <mvc:interceptor>  
 
        <mvc:mapping path="/test/number.do"/>  
 
        <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->  
 
        <bean class="com.host.app.web.interceptor.LoginInterceptor"/>  
 
    </mvc:interceptor>  </mvc:interceptors>

六、乱码问题

<mvc:annotation-driven >  
    <mvc:message-converters register-defaults="true">  
    <!-- 解决@ResponseBody中文乱码 -->  
  <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
    <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />  
  </bean>  
 </mvc:message-converters>  
</mvc:annotation-driven>

猜你喜欢

转载自www.cnblogs.com/jnba/p/10832771.html
今日推荐