SpringMVC:静态资源访问
SpringMVC 中设置访问静态资源有两种思路:
- 类似普通的 Java Web 项目的『分工』:JSP 请求由 JspServlet 处理,Servlet 请求由 DispacherServlet 处理,对静态资源的请求交由 DefaultServlet 。
- 将 Servlet 请求和静态资源请求 都交给 DispacherServlet,然后告诉它其中 哪种/哪部分 请求是静态资源请求,让它对其特殊处理。
1. 思路一的相关配置:
将 DispatchServlet 的 url-pattern 配置为 *.do
(或其他类似情况),以此作为 Servlet 请求的标志,将所有的 Servlet 请求都交给 DispatcherServlet 。
1.1. web.xml
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
...
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
那么除了 Servlet 请求、JSP 请求之外的请求,都会被当作是静态资源请求,由 Tomcat 的 DefaultServlet 处理。
通过 spring-web.xml 中添加 mvc:default-servlet-handler
元素表示使用容器默认的 DefaultServlet 进行处理静态资源:
1.2. spring-web.xml:
<mvc:default-servlet-handler default-servlet-name=“所使用的Web服务器默认使用的Servlet名称” />
并非所有的容器的默认的 DefaultSevlet 的 name 并非是 default,所以在非 Tomcat 容器中,需要手动指定其 name 。
- Tomcat, Jetty, JBoss, and GlassFish:"default"
- Google App Engine:"_ah_default"
- WebLogic:"FileServlet"
- WebSphere:"SimpleFileServlet"
2. 思路二的相关配置:
将 DispatchServlet 的 url-pattern
配置为 /
,此时,DispatcherServlet 它会处理除了 JSP 请求之外的所有请求( Servlet 请求和静态资源请求)。
web.xml
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
...
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
然后,再通过 mvc:resources '告诉' DispatcherServlet,哪些请求是静态资源请求(而不是 Servlet 请求):
spring-web.xml
<mvc:resources location="/xxx/" mapping="/xxx/**" />
例如:
<mvc:resources location="/img/" mapping="/img/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/css/" mapping="/css/**" />
location
元素表示 webapp
目录下的 xxx 目录;mapping 元素表示以 /xxx
开头的所有请求路径。
两个属性共同表明了:但凡以 /xxx
开始的请求,都是针对 /xxx/
目录下的静态资源的访问。