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繼續處理。
以下來詳細講解:
- 當不需要對靜態資源實現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處理。