1. 程式人生 > >mvc:annotation-driven mvc:default-servlet-handler和 ontext:component-scan base-package三者的關係

mvc:annotation-driven mvc:default-servlet-handler和 ontext:component-scan base-package三者的關係

<mvc:annotation-driven />mvc:default-servlet-handler/和 <context:component-scan base-package=“com”></context:component-scan>三者之間的關係 1.<context:component-scan base-package=“com” /> 用來對包進行掃描,解決了@Controller標識的類的bean的注入和使用。

2 <mvc:annotation-driven /> 添加註解驅動,使註解標註的類生效。用來匹配請求的Controller

3.<mvc:default-servlet-handler/> 設定能訪問的靜態資源 ,會在Spring MVC上下文中定義一個org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它會像一個檢查員,進入DispatcherServlet(web.xml的轉發器)的URL進行篩查,如果發現是靜態資源的請求,就將該請求轉由Web應用伺服器預設的Servlet處理,如果不是靜態資源的請求,才由DispatcherServlet繼續處理。 以下來詳細講解:

  1. 當不需要對靜態資源實現restful風格訪問時,web.xml配置為
 <servlet>  
    <servlet-name>mvc</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <load-on-startup>1</load-on-startup>  
</servlet>  
<servlet-mapping>  
    <servlet-name>mvc</servlet-name>  
    <url-pattern>*.do</url-pattern>  
</servlet-mapping>  

springmvc.xml配置為1<context:component-scan base-package=“com” /> 的時候,就可以處理來自.do的url請求。 2. 當需要對靜態資源實現restful風格訪問時,(2.1)那麼web.xml就要解析所有的請求,而不是之前1那樣只對.do解析.就需要把web.xml改為

  <servlet>  
        <servlet-name>mvc</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>mvc</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  

( 2.2)並且因為要對靜態資源訪問,所以需要配置3<mvc:default-servlet-handler/> ,主要現在配置了1和3,就獨缺了2,那麼接下來,就傳送了這樣的事,所有的請求.do或者靜態資源的請求等等,都會被 3.<mvc:default-servlet-handler/> 的預設default servlet解析,此時,靜態資源沒有問題,但.do沒辦法轉發到1的那麼註解掃描得到controller上,當然就報錯404了。當再加上 2 <mvc:annotation-driven />.的時候,此時的解析流程會這樣,所有請求經 2 <mvc:annotation-driven />處理一遍,相應的do請求被Controller處理,而靜態資源因為沒有相應的Controller就會被default servlet處理。