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

猜你喜欢

转载自blog.csdn.net/lkpklpk/article/details/82821888