<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处理。