静态资源加载的思考

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangyaa729/article/details/89845826

静态资源的加载在web前端性能优化时有很重要的作用,因此本文尝试着分析常见的静态资源加载方式,部署容器采用tomcat:

在进行Spring MVC的配置时,通常我们会配置一个dispatcher servlet用于处理对应的URL。配置如下:

<servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>     

然后在spring-mvc.xml文件中配置静态资源文件的加载路径与映射方式:

<mvc:resources mapping="/resources/**/" location="/resources/"/>  

这是采用springMvc框架时标准的配置,但之前一直没有详细理解之中的含义,知道今天想起来做个尝试,发现了一些有趣的事。

以下是我采用的配置:

        <servlet>
            <servlet-name>SpringMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>SpringMVC</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>   

而在spring-mvc.xml中依旧采用上述的配置方式,当我访问http://localhost:8093/static/template/syncfusionicons.png静态资源时,发现能正常访问,那么问题来了,DispatcherServlet应该只匹配以.do结尾的请求,为什么这个请求仍能得到相应呢?
然后,为了验证我的猜想,我把spring-mvc.xm中静态资源配置给删除,再次访问,发现采用第一个配置的url-parttern无法访问,而采用第二个时仍能访问到,正如我猜想的一样;

为什么会出现这样的结果呢?

结论:在tomcat容器中,默认的web.xml配置文件包含一个DefaultServlet配置,其默认的url-parttern为"/",当客户端请求不能匹配其他所有的Servlet时,将交由该Servlet处理;而如果想覆盖DefaultServlet配置时,只需要将"/"添加到自定义的Servlet中即可。
因此第一个配置,我们覆盖的默认的配置,当我们把静态资源配置给删除了后,DispatcherServlet就无法为我们正确的处理静态资源了;而在第二个配置中,静态资源实际上是有DefaultServlet来处理的,除非静态资源也是以.do的格式存在,否则spring-mvc.xml中配置的静态资源路径和映射是没有任何作用的。

猜你喜欢

转载自blog.csdn.net/huangyaa729/article/details/89845826