maven+jetty/tomcat+spring mvc
1. 用web服务器的defaultServlet
- 在web配置中拦截url(写在DispatcherServlet前, 就不进入Spring了
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</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>
- 注意不同的服务器默认servlet名是不一样的,比如resin的默认服务器就是resin-file
2. spring mvc的mvc:resources
<mvc:resources mapping="/images/**" location="/images/" />
// url"/images /**"映射到 ResourceHttpRequestHandler 进行处理
// location指定静态资源的位置,默认根目录为src/main/webapp/
3. spring mvc中使用<mvc:default-servlet-handler/>
- <mvc:default-servlet-handler/>会把 "/**" url,注册到 SimpleUrlHandlerMapping 的 urlMap 中,把对静态资源的访问由 HandlerMapping 转到 org.springframework.web.servlet.resource
- DefaultServletHttpRequestHandler 处理并返回
(DefaultServletHttpRequestHandler 就是使用各个 Servlet 容器自己的默认 Servlet.
补充:多个HandlerMapping的执行顺序问题:
spring按属性值升序执行
- DefaultAnnotationHandlerMapping 的 order 属性值是:0
- <mvc:resources/ >自动注册的 SimpleUrlHandlerMapping:2147483646
- <mvc:default-servlet-handler/>自动注册的 SimpleUrlHandlerMapping :2147483647
- 当访问一个 a.jpg 图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,我们没有叫 a.jpg 的 Action。
- 再按 order 值升序继续找
- 最后一个 SimpleUrlHandlerMapping 是匹配 "/**" 的,所以一定会匹配上,再通过各个 Servlet 容器自己的默认 Servlet响应图片
卡bug:jetty图片一直显示失败
jetty加载静态文件一直500,搞半天换了个新版本好了……
知识点积累:
- 图片的加载都是静态资源的访问
- webAppSourceDirectory:静态资源位置,默认src/main/webapp,可以在spring中修改,(WEB-INF/statics
网友评论