<mvc:annotation-driven/>
相當(dāng)于注冊(cè)了DefaultAnnotationHandlerMapping
和AnnotationMethodHandlerAdapter
兩個(gè)bean邓夕,配置一些message converter。即解決了@Controller
注解的使用前提配置峡迷。<context:annotation-config/>
是對(duì)包進(jìn)行掃描,實(shí)現(xiàn)注釋驅(qū)動(dòng)Bean定義方咆,同時(shí)將bean自動(dòng)注入容器中使用。即解決了@Controller
標(biāo)識(shí)的類的bean的注入和使用。在寫配置的時(shí)候祥绞,只寫了<context:component-scan/>
闺魏,并沒(méi)有使用<mvc:annotation-driven/>
未状,servlet攔截*.do
,.do
請(qǐng)求可以被正確捕捉和處理析桥。
<context:component-scan base-package="com"></context:component-scan>
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>
后來(lái)為了解決靜態(tài)資源訪問(wèn)的問(wèn)題司草,servlet改成了攔截所有請(qǐng)求,即/
泡仗,并添加了默認(rèn)的servlet埋虹,這時(shí)候*.do
請(qǐng)求不能被控制器捕捉了,頁(yè)面錯(cuò)誤為404沮焕。直到添加了<mvc:annotation-driven/>
之后吨岭,.do
請(qǐng)求才又能被正確捕捉和處理。
mvc-servlet.xml
<context:component-scan base-package="com"></context:component-scan>
<mvc:annotation-driven/>
<mvc:resources mapping="/styles/**" location="/WEB-INF/resource/styles/"/>
<mvc:default-servlet-handler/>
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>
為什么一開始沒(méi)用<mvc:annotation-driven/>
的時(shí)候可以峦树,添加了默認(rèn)servlet之后就不行了呢辣辫?
回答
最后的配置如果沒(méi)有<mvc:annotation-driven/>
旦事,那么所有的Controller可能就沒(méi)有解析,當(dāng)有請(qǐng)求時(shí)候都沒(méi)有匹配的處理請(qǐng)求類急灭,就都去<mvc:default-servlet-handler/>
即default servlet處理了姐浮。添加上<mvc:annotation-driven/>
后,相應(yīng)的do請(qǐng)求被Controller處理葬馋,而靜態(tài)資源因?yàn)闆](méi)有相應(yīng)的Controller就會(huì)被default servlet處理卖鲤。總之沒(méi)有相應(yīng)的Controller就會(huì)被default servlet處理就ok了畴嘶。