SpringMVC前端控制器映射路径问题笔记

前端控制器url-pattern的问题
    设置为/:导致静态资源访问失败都是404,动态代理可以访问
    第一种解决静态资源访问的方案,在springmvc的配置文件中:
        1)开启注解驱动
            <mvc:annotation-driven>
        2)开启默认servlet处理器
            <mvc:default-servlet-handler>
        原理是:给springmvc容器中注册一个组件,DefaultServletHttpRequestHandler
            让这个对象去处理静态资源的访问,在对象内部估计是转交给Tomcat的defaultServlet处理,
            
    第二种方式:
        spring定义了专门处理静态资源访问请求的处理器,ResourceHttpRequestHandler
        通过在springmvc配置文件中使用<mvc:resources/>标签
        例如<mvc:resources location:"静态资源存放的位置" mapping="匹配访问静态请求的url"/>
            <mvc:resources location:"/static/" mapping="/static/**"/>
        上面例子中,mapping表示静态资源请求访问带有/static及其子目录的所有url,
        location表示静态资源位于根目录下的static文件夹,注意这个文件夹不能放到WEB-INF下
        (网上说可以放任何位置)
        和第一种情况一样,<mvc:resources/>和@requestMapping有冲突,
        需要添加<mvc:annotation-driven>到springmvc容器中
前端控制器的映射问题,/和/*
    之前的笔记中有,但感觉不够完整,现在再回顾一下
    映射路径写/,表示匹配静态资源请求和动态资源请求,它重写了Tomcat的web.xml中的defaultServlet的路径
        defaultServlet是处理静态资源的servlet,所以静态资源请求交给前端控制器,springmvc没法处理,
        *.html,*.css,*.js等等,springmvc都处理不了,但*.jsp能够正常访问,是因为tomcat的web.xml中
        还有一个jspServlet,专门用来处理*.jsp页面的,所以前端控制器的映射路径写/,
        相当于静态动态资源请求全部交给前端控制器,而*.jsp则交给Tomcat去处理
    
    映射路径写/*,与/相同的是,/*也能匹配静态资源请求和动态资源请求,不同的是/*还能匹配*.jsp页面,
        也就是说/*重写,tomcat的web.xml的jspServlet的工作,所有请求包括*.jsp都交给了前端控制器,
        前端控制器只能处理静态请求,所以连访问*.jsp页面都直接404,而/则将*.jsp的请求交给Tomcat完成,
        所以可以访问*.jsp页面。

如果前端控制器映射配置为/时,表示前端控制器继承Tomcat的defaultServlet的映射路径

所以,如果你tomcat的defaultServlet的映射路径配置成下面这样:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.html</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

即使SpringMVC配置文件中不配置任何处理器,
SpringMVC也能处理静态资源请求,因为继承了tomcat的默认处理器

如果你的tomcat的defaultServlet映射路径仅仅是如下:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

则SpringMVC因为继承原因,需要在SpringMVC的配置文件中配置默认处理器来处理静态资源请求,
即笔记中的配置。