Atea - Hero's Grave

          面向?qū)ο螅_源,框架,敏捷,云計(jì)算,NoSQL,商業(yè)智能,編程思想。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            40 隨筆 :: 0 文章 :: 28 評(píng)論 :: 0 Trackbacks
          Spring-MVC如何使用攔截器,官方文檔只給出了非注解風(fēng)格的例子。那么基于注解風(fēng)格如何使用攔截器呢?

          基于注解基本上有2個(gè)可使用的定義類,分別是DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter:
          <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
          <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

          1、DefaultAnnotationHandlerMapping
          DefaultAnnotationHandlerMapping本身支持自定義攔截器,只需按如下進(jìn)行配置:
          1 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
          2     <property name="interceptors">
          3         <list>
          4                <bean class="packageName.XXXInterceptor" />
          5         </list>
          6     </property>
          7 </bean>

          Interceptor的定義為:
           1 public class XXXInterceptor extends HandlerInterceptorAdapter {
           2     @Override
           3     public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) {
           4  
           5         String className = handler.getClass().getName();// packageName.ClassName
           6         if (Error) {
           7             return false;
           8         }
           9         return true;
          10     }
          11 }

          2、AnnotationMethodHandlerAdapter
          目前,筆者沒找到如何給AnnotationMethodHandlerAdapter配置自定義Interceptor的方法,但是有個(gè)customArgumentResolver可以利用一下,來(lái)充當(dāng)Interceptor。
          1 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
          2     <property name="customArgumentResolver">
          3         <bean class="packageName.XXXResolver"/>
          4     </property>
          5 </bean>

          Resolver的定義為:
           1 public class XXXResolver implements WebArgumentResolver {
           2  
           3     @Override
           4     public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
           5  
           6         String className = methodParameter.getMethod().getDeclaringClass().getName();// packageName.ClassName
           7 
           8         // 如何取得Response和Request
           9         HttpServletResponse resp = (HttpServletResponse) webRequest.getNativeResponse();
          10        HttpServletRequest req = (HttpServletRequest) webRequest.getNativeRequest();
          11  
          12        if (Error) {
          13            if (!resp.isCommitted()) resp.sendError(ERROR_STATUS);
          14        }
          15        return UNRESOLVED;    
          16     }
          17 }
          18 

          仔細(xì)的人會(huì)看出,第二種方法其實(shí)根本不是攔截。其實(shí)第二種只是在映射Controller,調(diào)用方法的時(shí)候,給每一個(gè)方法的參數(shù)增加了一個(gè)切點(diǎn)。
          上例在出錯(cuò)的時(shí)候往HttpServletResponse寫錯(cuò)誤狀態(tài),來(lái)通知web容器進(jìn)行錯(cuò)誤重定向,達(dá)到了攔截器的作用。
          這么做有一個(gè)缺點(diǎn),就是每個(gè)參數(shù)都有自己的切點(diǎn),比如方法有3個(gè)參數(shù)就會(huì)調(diào)3次resolveArgument。為了避免出錯(cuò),需要判斷一下resp.isCommitted

          customArgumentResolver的初衷不是用來(lái)做Interceptor的,但有些環(huán)境卻不得不使用它,比如部署在GAE上。
          GAE是不支持DefaultAnnotationHandlerMapping的,因?yàn)榇祟愑玫搅薿rg.springframework.beans.BeanUtils.findEditorByConvention,這個(gè)方法會(huì)調(diào)用java.lang.ClassLoader.getSystemClassLoader,而這正是GAE所不允許的。

          PS:
          文中提到軟件的版本:
          spring - 2.5.X
          google app engine - 1.2.5

          參考資料
          http://www.scottmurphy.info/spring_framework_annotation_based_controller_interceptors
          http://groups.google.com/group/google-appengine-java/browse_thread/thread/54aadf8164be7bf0
          posted on 2009-09-20 20:23 Atea 閱讀(7272) 評(píng)論(0)  編輯  收藏 所屬分類: SpringGAE
          主站蜘蛛池模板: 易门县| 拉萨市| 偃师市| 兴和县| 阿拉尔市| 泾川县| 崇明县| 天台县| 通许县| 成武县| 长顺县| 彭山县| 济南市| 海伦市| 南投县| 全州县| 仪征市| 多伦县| 湖南省| 梨树县| 临泽县| 玉山县| 米易县| 科技| 岳西县| 临颍县| 得荣县| 同仁县| 临西县| 富阳市| 岳西县| 安徽省| 咸丰县| 新蔡县| 寿宁县| 岳阳县| 鹿邑县| 灌南县| 乌拉特中旗| 饶平县| 武宁县|