[J2EE]Spring MVC中访问静态资源[转]

1 文献来源

2 前言

2.1 访问不到静态资源起因

如果web.xml:DispatcherServlet配置".do"这样的URL拦截器,就不存在访问不到静态资源的问题。
如果web.xml:DispatcherServlet配置"/"拦截了所有的请求,同时对
.js,*.jpg的访问自然也就被拦截了。

    <!-- 前端控制器/中央控制器 -->
    <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:springmvc-servlet.xml</param-value>
            <!--<param-value>classpath:applicationContext.xml,classpath:spring-security.xml</param-value>-->
        </init-param>
        <!-- ↓加载 /WEB-INF/[servlet-name]-servlet.xml -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- 所有匹配'/'的请求都进入SpringMVC -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

2.2 讨论范围

本文仅讨论第二种情况下,当Spring MVC 的拦截路径配置为'/'(拦截所有请求)时,访问静态资源的解决方案。

3 解决方案

3.1 方案1:[web.xml]激活Tomcat的defaultServlet来处理静态文件

建议:可写在DispatcherServlet的前面, 让defaultServlet先拦截

  • Tomcat, Jetty, JBoss, and GlassFish 默认 Servlet的名字 — "default"
  • Google App Engine 默认 Servlet的名字 — "_ah_default"
  • Resin 默认 Servlet的名字 — "resin-file"
  • WebLogic 默认 Servlet的名字 — "FileServlet"
  • WebSphere 默认 Servlet的名字 — "SimpleFileServlet"
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

3.2 方案2:[springmvc-servlet.xml]激活defaultServlet - <mvc:default-servlet-handler />

defaultServlet配置:
(1)加入对静态资源的处理:js,gif,png.docx等
(2)允许使用"/"做整体映射

<!-- 会把 "/**" url,注册到 SimpleUrlHandlerMapping 的 urlMap 中,
     把对静态资源的访问由 HandlerMapping 转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.
     DefaultServletHttpRequestHandler 使用就是各个 Servlet 容器自己的默认 Servlet. -->
<mvc:default-servlet-handler />

3.3 方案3:[springmvc-servlet.xml]Spring 3.0.4以后支持<mvc:resources location mapping />

  • location元素: webapp目录下的 static 包下的所有文件/目录不被拦截
  • mapping元素: 以/static 开头的所有请求路径,如/static/a 或者/static/a/b
  • 使用 < mvc:resources / > 元素,把 mapping 的 URI 注册到 SimpleUrlHandlerMapping的urlMap 中
  • DispatcherServlet不会拦截以/static开头的所有请求路径,并当作静态资源交由Servlet处理
<!-- ↓如此就不必另外添加一个mvc来处理静态资源,而mvc知道静态资源所处的位置为resources文件夹↓ -->
<mvc:resources location="/resources/" mapping="/resources/**"/>
<!-- ↓在SpringMVC3.0之后推荐使用↓ -->
<!-- 将 /img/** 映射到 ResourceHttpRequestHandler 进行处理,location指定静态资源的存储位置  -->
<!-- 作用: DispatcherServlet不会拦截以/static开头的所有请求路径,并当作静态资源交由Servlet处理 -->
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
  • /webapp/WEB-INF目录:

WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。当然,你非要放在WEB-INF中,则必须修改resources映射,如:
<mvc:resources location="/WEB-INF/js/" mapping="/js/**" />

原文地址:https://www.cnblogs.com/johnnyzen/p/13055101.html