<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/>
,并沒有使用<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>
后來為了解決靜態(tài)資源訪問的問題,servlet改成了攔截所有請(qǐng)求,即/
,并添加了默認(rèn)的servlet,這時(shí)候*.do
請(qǐng)求不能被控制器捕捉了,頁面錯(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>
為什么一開始沒用<mvc:annotation-driven/>
的時(shí)候可以,添加了默認(rèn)servlet之后就不行了呢?
回答
最后的配置如果沒有<mvc:annotation-driven/>
,那么所有的Controller可能就沒有解析,當(dāng)有請(qǐng)求時(shí)候都沒有匹配的處理請(qǐng)求類,就都去<mvc:default-servlet-handler/>
即default servlet處理了。添加上<mvc:annotation-driven/>
后,相應(yīng)的do請(qǐng)求被Controller處理,而靜態(tài)資源因?yàn)闆]有相應(yīng)的Controller就會(huì)被default servlet處理。總之沒有相應(yīng)的Controller就會(huì)被default servlet處理就ok了。