`
zachary.guo
  • 浏览: 482805 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring MVC 中处理静态资源

阅读更多
        Spring MVC 中的核心 servlet - DispatcherServlet,我们在 web.xml 文件中通常这样定义:
<servlet>
  <servlet-name>mvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/conf/spring/mvc-*.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>mvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

        很明显,该 servlet 对应的 url-pattern 定义成 /,因此该 servlet 会匹配上诸如 /images/a.jpg, /css/hello.css 等这些静态资源,甚至包括 /jsp/stock/index.jsp 这些 jsp 也会匹配。但是并没有定义相应的 Controller 来处理这些资源,因此这些请求通常是无法完成的。

        很麻烦?没有 Struts 方便?此言差矣,因此你在 Struts 定义其核心 filter 的 url-pattern 是 *.action,当然不会对处理 jsp 和静态资源操作影响了。Spring MVC 若也定义类似的 url-pattern,同样不存在问题。

        说到这里,我们应该想一个问题。Tomcat 中,只有 servlet 能够处理请求,即使是 jsp,也会被编译成 servlet。我们即便使用 Struts,定义 *.action 的url-pattern,那 .css, *.gfi 等这些静态资源到底是谁来处理了???你可不要想当然的认为我不是输入了图片的路径了吗?如,/images/a/b/c.gif。请注意,servlet 容器中,只有 servlet 采用处理资源!

        由 servlet 处理这些资源那是一定了。不过,不同的 servlet 容器/应用服务器,处理这些静态资源的 servlet 的名字不大一样:
  • Tomcat, Jetty, JBoss, and GlassFish:默认 Servlet 名字为 "default"
  • Google App Engine:默认 Servlet 名字为 "_ah_default"
  • Resin:默认 Servlet 名字为 "resin-file"
  • WebLogic:默认 Servlet 名字为 "FileServlet"
  • WebSphere:默认 Servlet 名字为 "SimpleFileServlet"

    ◇ 方案一:激活 Tomcat 的 defaultServlet 来处理静态资源
<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-mapping,同时,要写在 DispatcherServlet 的前面, 让 defaultServlet 先拦截。

    ◇ 方案二:Spring 3.0.4 以后版本提供了 <mvc:resources />
<mvc:resources location="/resources/" mapping="/resources/**"/>

        /resources/** 映射到 ResourceHttpRequestHandler 进行处理,location 指定静态资源的位置,可以是 web application 根目录下、jar 包里面,这样可以把静态资源压缩到 jar 包中。cache-period 可以使得静态资源进行 web cache。

        使用 <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。

        补充说明下以上提到的 HandlerMapping 的 order 的默认值:
  • DefaultAnnotationHandlerMapping:0
  • <mvc:resources /> 自动注册的 SimpleUrlHandlerMapping:2147483646
  • <mvc:default-servlet-handler/> 自动注册的 SimpleUrlHandlerMapping:2147483647
        Spring 会先执行 order 值比较小的。当访问一个 a.jpg 图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,我们没有叫 a.jpg 的 Controller。再按 order 值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**" 的,所以一定会匹配上,再响应图片。

        Spring MVC 中,访问一个图片,还要走层层匹配。性能肯定好不到哪里去。不仅仅是 Spring MVC,即便 Struts,它们毕竟存活于 servlet 容器,只要由 servlet 容器处理这些静态资源,必然要将这些资源读入 JVM 的内存区中。所以,处理静态资源,我们通常会在前端加 apache 或 nginx。
分享到:
评论
2 楼 chenzh1314 2014-12-16  
强! 
1 楼 ping2010 2014-02-12  

相关推荐

    Spring MVC和springboot静态资源处理.rar

    Spring MVC和springboot静态资源处理.rar

    Spring MVC入门教程

    七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...

    Spring MVC 教程 快速入门 深入分析

    七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...

    SpringMVC框架架构介绍

    七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...

    Spring MVC 3.0实战指南.ppt

    《Spring MVC 3.0实战指南》...静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理静态资源路径映射逻辑资源路径 允许利用浏览器的缓存且不当心不同步 AQ?

    spring mvc整合thymeleaf示例

    thymeleaf,我个人认为是个比较好的模板,性能也比一般的,比如freemaker的要高,而且把将美工和程序员能够结合起来,美工能够在浏览器中查看静态效果,程序员可以在应用服务器查看带数据的效果。 thymeleaf是一个...

    Spring3MVC注解教程.ppt

    《Spring MVC 3.0实战指南...静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理静态资源路径映射逻辑资源路径 允许利用浏览器的缓存且不当心不同步

    spring mvc+spring+mybatis架构实例

    spring mvc+spring+Mybatis架构 Mybatis分页功能 伪静态配置 spring mvc访问静态资源

    springmvc静态资源增强处理

    Spring Framework 4.1 mvc添加了静态资源增强处理功能.本源码仅是一个简单使用例子.详细参考;http://blog.csdn.net/xiejx618/article/details/40478275

    Spring MVC 3.0实战指南

    支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器...和数据转换、格式化、验证框架无缝集成 对静态资源处理提供特殊支持 更加灵活的控制器方法签名,可完全独立于Servlet API

    ssm(spring+spring mvc+mybatis+maven)高仿bilibili视频网站项目实例

    ssm(spring+spring mvc+mybatis+maven)高仿bilibili视频网站项目实例 里面包含论坛, 购物商城 网页 后台管理的java项目集成 演示地址: http://106.75.216.49/bilibili/ (服务器不太稳定,可以尝试刷新,感谢...

    sprjson,spring mvc的json和xml视图,dwr及静态资源等不同种类url整合

    spring mvc的json和xml视图,dwr及静态资源等不同种类url整合,对应博客教程地址: http://blog.csdn.net/qgmzzn1/article/details/8465969

    第四章 Spring MVC Rest风格的url、静态资源标签

    NULL 博文链接:https://1151461406.iteye.com/blog/2390768

    Spring MVC 3.0实战指南--陈雄华

    Spring MVC 3.0新特性: 1.支持REST风格的URL ...4.对静态资源处理提供特殊支持 5.更加灵活的控制器方法签名,可完全独立于Servlet API 参考《Spring 3.x企业应用开发实战》的第15章撰写的培训材料

    防止SpringMVC拦截器拦截js等静态资源文件的解决方法

    本篇文章主要介绍了防止SpringMVC拦截器拦截js等静态资源文件的解决方法,具有一定的参考价值,有兴趣的同学可以了解一下

    SpringMVC入门教程

    七、spring mvc 如何访问到静态的文件,如jpg,js,css 八、spring mvc 请求如何映射到具体的Action中的方法 九、 spring mvc 中的拦截器: 十、 spring mvc 如何使用拦截器 十一、 spring mvc 如何实现全局的异常处理...

    Spring_MVC_教程_快速入门_深入分析

    spring mvc 核心类与接口 spring mvc 核心流程图 ...spring mvc 如何访问到静态的文件,如jpg,js,css? spring mvc 处理ajax请求 spring mvc 转发与重定向 如何给spring3 MVC中的Action做JUnit单元测试?

Global site tag (gtag.js) - Google Analytics