mvc:default-servlet-handler和mvc:annotation-driven成对出现的原因

<!-- 
    配置defaultServletHandler的作用:
    若RequestMapping()找不到URL对应的映射,则默认的servlet(不是dispatcherServlet)会去找目标资源 
-->

<mvc:default-servlet-handler/>


<!-- 如果不加<mvc:annotation-driven />,那RequestMapping()就失效了 -->

<mvc:annotation-driven></mvc:annotation-driven>

SringMVC中web.xml的dispatcherServlet的<url-pattern>:

<servlet-mapping>
    <servlet-name>test-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

出现的问题:

    " / "  将会替换掉容器的 default servlet , spring 将会拦截所有的访问请求.

    把所有的请求都交由DispatcherServlet处理.将不会再访问容器中原始默认的servlet

    但你对静态资源的访问就是通过容器的默认servlet处理的!故而静态资源将不可访问!

解决的办法:

    在这种情况下,如果想要访问静态资源,通常会使用默认handler:

<mvc:default-servlet-handler/>

    配置的这个handler通过转发所有请求到servlet容器的默认servlet来处理静态资源

    若所使用的WEB服务器默认的Servlet名称不是default,则需要通过default-servlet-name 属性指定

但是,使用上述配置,你会发现正常的Controller跳转失效了

    所以,使用标签:

<mvc:annotation-driven/>

    确保框架中处理请求映射的bean的order值小于 DefaultServletHttpRequestHandler 的order属性值:

如果我们在web.xml中设置了多个servlet的时候,可以使用<load-on-startup>来指定servlet的加载顺序,正数的值越小,启动该servlet的优先级越高。配置这个参数,有两个好处:

        1、如果初始化过程失败,则容器会提示启动失败,此时我们能够提前知道相关错误;

        2、配置该参数相当于将初始化servlet的工作转移到容器启动过程,使得容器只要启动成功后,就可立即响应web请求

 

 

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务