Spring MVC静态资源处理问题
2017-02-28 12:22
330 查看
由于在web.xml中配置Spring MVC的servlet 对应的 url-pattern 定义成 /,因此该 servlet 会匹配如 /images/a.jpg, /css/b.css 等这些静态资源,甚至包括 /jsp/index.jsp 这些 jsp 也会匹配。但是并没有定义相应的 Controller 来处理这些资源,因此这些请求通常是无法完成的。因此需要对这些资源做一些处理。
方法一:激活 Tomcat 的 defaultServlet 来处理静态资源
每种类型的静态资源需要分别配置一个 servlet-mapping,同时,要写在 DispatcherServlet 的前面, 让 defaultServlet 先拦截。
但是这样还会有个问题,就是无法访问到classpath下的资源文件,看了tomcat的DefaultServlet的配置项,似乎也没有可以指定目录的地方。
方法二:Spring 3.0.4 以后版本提供了 <mvc:resources />
使用 <mvc:resources /> 元素,会把 mapping 的 URI 注册到 SimpleUrlHandlerMapping 的 urlMap 中,key 为 mapping 的 URI pattern 值,而 value 为 ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由 HandlerMapping 转到 ResourceHttpRequestHandler 处理并返回,所以就支持 classpath 目录, jar 包内静态资源的访问。
方法三:使用 <mvc:default-servlet-handler />
<mvc:default-servlet-handler /> 会把 "/**" url 注册到 SimpleUrlHandlerMapping 的 urlMap 中,把对静态资源的访问由 HandlerMapping 转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回。DefaultServletHttpRequestHandler 使用就是各个 Servlet 容器自己的默认 Servlet。
总结:
性能最好的是直接利用容器的DefaultServlet,让它最先拦截静态资源请求,这样就避免了后续的转发等操作,提高了性能,但是无法访问classpath下的资源文件。而通过mvc:resources标签可以简单配置匹配规则和资源文件路径,是最简单快捷的一种方式
ps:方法二和方法三用到的xml声明
方法一:激活 Tomcat 的 defaultServlet 来处理静态资源
<servlet-mapping> <servlet-name>static</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>static</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>static</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping>
每种类型的静态资源需要分别配置一个 servlet-mapping,同时,要写在 DispatcherServlet 的前面, 让 defaultServlet 先拦截。
但是这样还会有个问题,就是无法访问到classpath下的资源文件,看了tomcat的DefaultServlet的配置项,似乎也没有可以指定目录的地方。
方法二:Spring 3.0.4 以后版本提供了 <mvc:resources />
<!-- 处理静态资源 --> <!-- 上传的图片缓存1个月,其他js,css,img资源缓存一年 --> <mvc:resources mapping="/res/**" location="/res/" cache-period="2592000"/> <mvc:resources mapping="/resources/**" location="/resources/" cache-period="31536000"/> <mvc:resources mapping="/css/**" location="/css/" cache-period="31536000"/> <mvc:resources mapping="/js/**" location="/js/" cache-period="31536000"/> <mvc:resources mapping="/img/**" location="/img/" cache-period="31536000"/> <mvc:resources mapping="/images/**" location="/images/" cache-period="31536000"/>
使用 <mvc:resources /> 元素,会把 mapping 的 URI 注册到 SimpleUrlHandlerMapping 的 urlMap 中,key 为 mapping 的 URI pattern 值,而 value 为 ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由 HandlerMapping 转到 ResourceHttpRequestHandler 处理并返回,所以就支持 classpath 目录, jar 包内静态资源的访问。
方法三:使用 <mvc:default-servlet-handler />
<mvc:default-servlet-handler /> 会把 "/**" url 注册到 SimpleUrlHandlerMapping 的 urlMap 中,把对静态资源的访问由 HandlerMapping 转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回。DefaultServletHttpRequestHandler 使用就是各个 Servlet 容器自己的默认 Servlet。
总结:
性能最好的是直接利用容器的DefaultServlet,让它最先拦截静态资源请求,这样就避免了后续的转发等操作,提高了性能,但是无法访问classpath下的资源文件。而通过mvc:resources标签可以简单配置匹配规则和资源文件路径,是最简单快捷的一种方式
ps:方法二和方法三用到的xml声明
xmlns:mvc=http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
相关文章推荐
- spring mvc 静态资源处理遇到的问题
- Spring MVC程序中得到静态资源文件css,js,图片文件的路径问题总结
- struts2.1.8 StrutsPrepareAndExecuteFilter 关于静态资源处理问题。访问classPath下静态资源
- spring MVC js css图片等静态资源无法加载问题
- Spring MVC 静态资源处理
- Spring MVC 处理静态资源文件
- spring mvc 自定义处理静态资源
- spring mvc - 对静态资源的处理
- Spring MVC 获取静态资源处理方案学习总结
- spring mvc与html中处理引用js等静态文件的问题
- spring mvc 静态资源 404问题
- struts2.1.8 StrutsPrepareAndExecuteFilter 关于静态资源处理问题
- spring mvc静态资源处理
- Spring MVC 表单标签 & 处理静态资源
- Spring MVC静态资源处理
- spring mvc - 对静态资源的处理
- Spring MVC 解决静态资源的问题
- Spring MVC静态资源处理
- Spring MVC Restful构建中静态资源访问问题
- spring mvc 静态资源 404问题