天天看點

Spring和shiro都用到的Ant 比對原則!

Ant path 比對原則

在Spring MVC中經常要用到攔截器,在配置需要要攔截的路徑時經常用到<mvc:mapping/>子标簽,其有一個path屬性,它就是用來指定需要攔截的路徑的。例如: <mvc:interceptor>

<mvc:mapping path="example比對(Matches) /app/example, /app/foo/example, 和 /example /appdir/file.比對(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf, 和 /app/dir/file.java *.jsp比對(Matches)任何的.jsp 檔案 

 HandlerMapping

一 個WEB應用程式基本上都要依賴于URL與請求處理器之間的映射,Spring MVC也是一樣,但Spring MVC就像Spring所作的一切一樣(譯者:靈活,可以配置各種東西,但是也造成了很多複雜性),肯定不會隻有一種方法來映射URL和 Controller之間的關系,并且在實際上,允許你自己建立映射規則和實作,而不僅僅依賴URL映射。

Spring提供了URL的映射處理, 并且處理路徑模式的順序和方法并沒有限定到任何的接口上。Spring MVC的預設實作org.springframework.web.servlet.handler. AbstractUrlHandlerMapping, 會以最長符合路徑模式來比對一個路徑。

例如:給定一個請求是 /app/dir/file.jsp 并且現在存在兩個路徑比對模式*.jsp 和/app/dir*.jsp擁有更多的字元.注意的是,這個原則并沒有在任何進階别的接口中指定,但卻是一種實作細節。

!!下面看一下預設的兩個HandlerMapping

BeanNameUrlHandlerMapping

默 認的映射政策實作是org.springframework.web. servlet.handler.BeanNameUrlHandlerMapping類. 這個類要求任何有可能處理請求的Bean都要起一個以反斜杠(/)字元開頭的名稱或者别名,這個名稱或者别名可以是符合URL Path比對原則中的任何名字。

Listing A Controller Mapped by a Bean Name

xml 代碼
   
   
            
  1. <bean name="/home"  class="com.apress.expertspringmvc.flight.web.HomeController">  
  2. <property name="flightService" ref="flightService" /> 
  3. </bean> 

■注意:你不能使用id這個屬性來指定任何的URL路徑,因為在XML規格定中禁止(/)字元來指定XML的id,不過你可以在一個Bean定義中同時擁有id和name屬性 

BeanNameUrlHandlerMapping 的缺點

它 非常便于使用的同時,也擁有一些缺點。它不能影射一個Prototype的Bean.換句話說,當使用 BeanNameUrlHandlerMapping時, 所有的請求處理類隻能是單例的(singletons) . 一般來說,Controllers 都是按照單例建立的,是以這個并不是一個很嚴重的問題.還有,我會在後面的章節中介紹Controller,隻會有很少類型的Controller需要是 prototypes.

■注釋: Prototype bean 是一種非單例(non-singleton)的bean. 任何一次調用ApplicationContext的getBean()方法時都會傳回一個新的Bean執行個體.

BeanNameUrlHandlerMapping的另外一個問題存在于在你的應用程式中 應用攔截(interceptor). 因為請求的映射(handler mapping )和Bean(beans imapping)的映射給綁定在一起了,沒有分開,這樣就不可能在Controller和攔截之間建立複雜的關系。如果有複雜的請求映射需求,你可以用 SimpleUrlHandlerMapping 來代替BeanNameUrlHandlerMapping. SimpleUrlHandlerMapping作為BeanNameUrlHandlerMapping的另外一種選擇, SimpleUrlHandlerMapping直指BeanNameUrlHandlerMapping的兩大軟肋.它可以映射 prototype類型的請求處理器,并且它允許你為處理器(handlers)和攔截器(interceptors)之間建立複雜靈活的映射路徑的映射算法與BeanNameUrlHandlerMapping是 使用相同的基礎元件,是以這個模式依然是映射URL到請求處理器的(request handler) ,你簡單的在ApplicationContext中聲明一下,就可以使用SimpleUrlHandlerMapping了. DispatcherServlet會根據類型找到的,并且不會建立預設的映射器了(BeanNameUrlHandlerMapping).意思就是, 如果你想兩個都用,那麼就要全部聲明一下在ApplicationContext裡.

■提示 DispatcherServlet會鍊式處理請求的(譯者:依次處理請求,可以參照過濾器和GOF中的責任鍊模式),這樣允許按照你的要求處理映射,映射處理器(Handler mappings )實作了Orderedr接口.