国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

5、處理方法映射(Handler Mapping)

vibiu / 585人閱讀

摘要:下面的例子展示了怎樣配置一個攔截器使用攔截請求的處理方法映射機制包括處理方法攔截器,這在你需要為指定請求應用特定功能時很有用,比如什么意思位于處理方法映射中的攔截器必須實現包中的接口。

??這一部分的例子見這個項目的 mvc 分支下的 TimeBasedAccessInterceptor.java

??Spring 在之前的版本中,用戶要在 Web 應用程序上下文中定義一個或多個 HandlerMapping Bean 用于把進來的 Web 請求映射到合適的處理方法。在引進注解控制器之后,你通常不需要這么做,因為 RequestMappingHandlerMapping 自動在所有控制器中尋找 @RequestMapping 注解。但是要記住,所有繼承自 AbstractHandlerMapping 的 HandlerMapping 類有下面的屬性,你可以用它們來自定義行為:

interceptors——攔截器使用的列表。有關 HandlerInterceptors 的討論在“使用 HandlerInterceptor 攔截請求”

defaultHandler——在處理方法映射沒有找到匹配時使用的缺省處理方法

order——基于 order 屬性值(見接口 org.springframework.core.Ordered ),Spring 對上下文中可用的處理方法映射進行排序,并應用第一個匹配。

alwaysUseFullPath——如果是 true,在當前 Servlet 上下文中 Spring 使用全路徑來尋找合適的處理方法。如果是 false(缺省值),就使用當前 Servlet 映射中的路徑。例如,如果一個 Servlet 映射使用“/testing/*”同時 alwaysUseFullPath 屬性為 true,那么就使用“/testing/viewPage.html”;如果是 false,就使用“/viewPage.html

urlDecode——從 Spring 2.5 開始,缺省值為 true。如果你喜歡比較被編碼的路徑,就把這個標記設置為 false 吧。然而,HttpServletRequest 一直都是用編碼后的形式來暴露 Servlet 路徑。注意,在比較被編碼的路徑時,Servlet 路徑不會匹配。

??下面的例子展示了怎樣配置一個攔截器:


    
        
            
        
    

使用 HandlerInterceptor 攔截請求

??Spring 的處理方法映射機制包括處理方法攔截器,這在你需要為指定請求應用特定功能時很有用,比如 checking for a principal(什么意思?)

??位于處理方法映射中的攔截器必須實現 org.springframework.web.servlet 包中的
HandlerInterceptor 接口。這個接口定義了三個方法:

preHandle(..) ????在處理方法執行前調用;

postHandle(..)????在處理方法執行后調用;

afterCompletion(..)??在完成請求結束后調用。

這三個方法為預處理和后處理提供了足夠的靈活性。

??方法 preHandle(..) 返回一個布爾值。你可以使用這個方法來中斷或者繼續執行鏈的處理。這個方法返回 true 時,處理方法的執行鏈會繼續;返回 false 時,DispatcherServlet 就嘉定攔截器自己已經處理好了請求(比如渲染一個適當的視圖),并不再繼續執行其他攔截器和實際存在于執行鏈的中的處理方法。

??攔截器可以使用 interceptors 屬性來配置,這適用于所有繼承自 AbstractHandlerMapping 的 HandlerMapping 類。下面是一個例子:


    
        
            
                
            
        
    

    
        
        
    

package samples;

public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter 
{
    private int openingTime;
    private int closingTime;

    public void setOpeningTime(int openingTime) { this.openingTime = openingTime; }

    public void setClosingTime(int closingTime) { this.closingTime = closingTime; }

    public boolean preHandle(
            HttpServletRequest request, 
            HttpServletResponse response, 
            Object handler)  throws Exception 
    {
        Calendar cal = Calendar.getInstance();
        int hour = cal.get(HOUR_OF_DAY);
        if (openingTime <= hour && hour < closingTime) return true;
        response.sendRedirect("http://host.com/outsideOfficeHours.html");
        return false;
    }
}

??任何被這個映射處理的請求都會被 TimeBasedAccessInterceptor 攔截。如果當前時間不是上班時間,用戶就被重定向到一個靜態 HTML 頁面中去,這個頁面告訴用戶,比如,你只能在上班時間訪問網站。

??在使用 RequestMappingHandlerMapping 的時候,實際的處理方法是一個 HandlerMethod 實例,它識別要被調用的指定的控制器方法。

??就像你看到的那樣,Spring 的適配器類 HandlerInterceptorAdapter 使擴展接口 HandlerInterceptor 變得更加容易。

??在上面的例子中,配置的攔截器會應用于所有被注解的控制器方法處理的請求。你想窄化攔截器攔截的 URL 路徑,你可以使用 MVC 命名空間或者 MVC Java 配置,或者聲明一個 MappedInterceptor 類型的 Bean 實例來這么做。詳見“啟用 MVC Java 配置或者 MVC XML 命名空間配置”

??注意,接口 HandlerInterceptor 的 postHandle 方法并不總是完美的適用于使用 @ResponseBody 和 ResponseEntity 的方法。在這種情況下,在 postHandle 方法調用之前,HttpMessageConverter 已經寫并且提交了響應,這樣就不再能夠改變響應了,比如添加響應頭。替代方案是,應用程序可以實現 ResponseBodyAdvice 接口,同時要么聲明它為一個 @ControllerAdvice Bean,要么直接把它配置在 RequestMappingHandlerAdapter上。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66079.html

相關文章

  • SpringMVC之源碼分析--HandlerMapping(四)

    摘要:默認支持該策略。以上是對的宏觀分析,下面我們進行內部細節分析。整體流程一通過實現接口,完成攔截器相關組件的初始化調用類的方法??偨Y本文主要分析了的初始化過程,希望對大家有幫助。隨著學習的深入,后面有時間在分析下期中涉及的關鍵,比如等等。 概述 本節我們繼續分析HandlerMapping另一個實現類ReqeustMappingHandlerMapping,該類是我們日常開發中使用最多的...

    imccl 評論0 收藏0
  • SpringMVC之源碼分析--HandlerMapping(二)

    摘要:由于抽象類重寫了父類的方法,所以此時會調用的方法,在該方法中通過調用父類的方法,該方法通過模板方法模式最終調到類的方法。分析該類間接實現了接口,直接實現該接口的是抽象類,映射與請求。 概述 在前一章https://segmentfault.com/a/1190000014901736的基礎上繼續分析,主要完成SimpleUrlHandlerMapping類的原理。 本系列文章是基于Sp...

    Imfan 評論0 收藏0
  • web.py源碼分析: application(1)

    摘要:本文主要分析的是庫的這個模塊中的代碼。將結果轉換成一個迭代器。函數函數的定義如下位置位置位置該函數的參數中就是,是路由映射表則是,是本次請求路徑。位置,如果是其他情況,比如直接指定一個類對象作為處理對象。 本文主要分析的是web.py庫的application.py這個模塊中的代碼。總的來說,這個模塊主要實現了WSGI兼容的接口,以便應用程序能夠被WSGI應用服務器調用。WSGI是We...

    edgardeng 評論0 收藏0
  • SpringMVC之源碼分析--HandlerMapping(一)

    摘要:接口接口作用是將請求映射到處理程序,以及預處理和處理后的攔截器列表,映射是基于一些標準的,其中的細節因不同的實現而不相同。該參數是類型,作用是檢查所有的映射解析器或使用或為的,默認為,即從上下文中檢查所有的。 概述 在Spring MVC啟動章節https://segmentfault.com/a/1190000014674239,介紹到了DispatcherServlet的onRef...

    ralap 評論0 收藏0
  • Spring Boot - 靜態資源處理、啟動加載、日志處理

    摘要:靜態資源處理啟動加載日志處理回顧初識過濾器監聽器攔截器我們通過啟動日志,可以發現,默認提供了靜態資源處理。 Spring Boot - 靜態資源處理、啟動加載、日志處理 回顧 Spring Boot-初識 Hello World Spring Boot - Servlet、過濾器、監聽器、攔截器 我們通過啟動日志,可以發現,spring boot 默認提供了靜態資源處理。接下來,我...

    or0fun 評論0 收藏0

發表評論

0條評論

vibiu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<