<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Atea - Hero's Grave

    面向對象,開源,框架,敏捷,云計算,NoSQL,商業智能,編程思想。

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

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

    1、DefaultAnnotationHandlerMapping
    DefaultAnnotationHandlerMapping本身支持自定義攔截器,只需按如下進行配置:
    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的方法,但是有個customArgumentResolver可以利用一下,來充當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 

    仔細的人會看出,第二種方法其實根本不是攔截。其實第二種只是在映射Controller,調用方法的時候,給每一個方法的參數增加了一個切點。
    上例在出錯的時候往HttpServletResponse寫錯誤狀態,來通知web容器進行錯誤重定向,達到了攔截器的作用。
    這么做有一個缺點,就是每個參數都有自己的切點,比如方法有3個參數就會調3次resolveArgument。為了避免出錯,需要判斷一下resp.isCommitted

    customArgumentResolver的初衷不是用來做Interceptor的,但有些環境卻不得不使用它,比如部署在GAE上。
    GAE是不支持DefaultAnnotationHandlerMapping的,因為此類用到了org.springframework.beans.BeanUtils.findEditorByConvention,這個方法會調用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 閱讀(7268) 評論(0)  編輯  收藏 所屬分類: SpringGAE
    主站蜘蛛池模板: 午夜dj免费在线观看| 日韩精品无码区免费专区 | 亚洲中文字幕AV每天更新| 99久热只有精品视频免费看| 亚洲国产日韩一区高清在线| 97在线视频免费公开观看| 亚洲一二成人精品区| 8x8x华人永久免费视频| 91亚洲一区二区在线观看不卡| 最近免费中文字幕高清大全 | 亚洲第一页在线观看| 中国人xxxxx69免费视频| 亚洲视频免费在线看| 国产高清不卡免费在线| 亚洲欧美第一成人网站7777 | 永久黄网站色视频免费| 国产亚洲欧美日韩亚洲中文色| 免费观看午夜在线欧差毛片 | a拍拍男女免费看全片| 国产精品高清视亚洲精品| 日韩一品在线播放视频一品免费| 国产精品无码亚洲一区二区三区| 亚洲国产精品综合久久网络| 国产精品玖玖美女张开腿让男人桶爽免费看 | 日本免费A级毛一片| 亚洲色图综合网站| 超pen个人视频国产免费观看| 特级毛片全部免费播放a一级| 亚洲无人区午夜福利码高清完整版| 91精品成人免费国产| 亚洲国产精品午夜电影| 国产又大又黑又粗免费视频| eeuss影院免费92242部| 亚洲色av性色在线观无码| 在线日韩av永久免费观看| 两个人看的www免费视频中文| 亚洲国产精品成人综合久久久 | 国产男女猛烈无遮挡免费网站| 一级毛片**免费看试看20分钟| 亚洲天天在线日亚洲洲精| 大香人蕉免费视频75|