在使用SpringMVC时,在web.xml文件中,我们经常会这样配置DispatcherServlet:
<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:config/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
注意:
<url-pattern>/</url-pattern>,这里配置的是“/”,因此该servlet会匹配诸如/images/login.jpg, /css/login.css,/css/login.js 等这些静态资源,
甚至包括 /jsp/index.jsp 这些 jsp 也会匹配。但是并没有定义相应的 Controller 来处理这些资源,因此这些请求通常是无法完成的。
第一种方式:
如果改为*.do或者*.action等,这样就类似于Struts的filter 的 url-pattern 是 *.action一样,这样就不会影响操作静态资源文件了。
<url-pattern>*.do</url-pattern>
第二种方式:
在DispatcherServlet的前面启用defaultServlet,让 defaultServlet先拦截请求,这样请求就不会进入Spring了,性能应该也是最好的吧。
在web.xml中添加:
<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>*.gif</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>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.jpeg</url-pattern>
<url-pattern>*.png</url-pattern>
<url-pattern>*.gif</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
注:Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字 -- "default"
Google App Engine 自带的 默认Servlet的名字 -- "_ah_default"
Resin 自带的 默认Servlet的名字 -- "resin-file"
WebLogic 自带的 默认Servlet的名字 -- "FileServlet"
WebSphere 自带的 默认Servlet的名字 -- "SimpleFileServlet"
第三种方式:
在spring3.0.4以后版本提供了mvc:resources ,使用方法:
<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>
<mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/>
<mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>
或者
<mvc:resources mapping="/js/*.js" location="/js/" />
/images/** 映射到 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。
其中处理静态资源的类是org.springframework.web.servlet.resource.ResourceHttpRequestHandler,而且在location的描述中说明Each location must point to a valid directory. 即每个location都必须指向一个有效的目录。
参考:
http://www.cnblogs.com/weidiao/p/5517645.html
分享到:
相关推荐
JSP+servlet+javabean学习 里面有PDF文件对该章节的详细讲解,培训老师才讲的到的,非常详细......资源内容如下: JavaWeb02-request与response.rar ...JavaWeb12-文件上传.rar JavaWeb13-过滤器与监听器.rar
JSP+servlet+javabean学习 里面有PDF文件对该章节的详细讲解,培训老师才讲的到的,非常详细......资源内容如下: JavaWeb02-request与response.rar ...JavaWeb12-文件上传.rar JavaWeb13-过滤器与监听器.rar
JSP+servlet+javabean学习 里面有PDF文件对该章节的详细讲解,培训老师才讲的到的,非常详细......资源内容如下: JavaWeb02-request与response.rar ...JavaWeb12-文件上传.rar JavaWeb13-过滤器与监听器.rar
JSP+servlet+javabean学习 里面有PDF文件对该章节的详细讲解,培训老师才讲的到的,非常详细......资源内容如下: JavaWeb02-request与response.rar ...JavaWeb12-文件上传.rar JavaWeb13-过滤器与监听器.rar
知道的应该都学到p28了
java源码 仿360buy京东商城源码 京东JavaWeb项目源代码.zipjava源码 仿360buy京东商城源码 京东JavaWeb项目源代码.zipjava源码 仿360buy京东商城源码 京东JavaWeb项目源代码.zipjava源码 仿360buy京东商城源码 京东...
(JavaWeb基于SSM框架的毕业设计)仿360buy京东商城源码 京东JavaWeb项目源代码.zip(JavaWeb基于SSM框架的毕业设计)仿360buy京东商城源码 京东JavaWeb项目源代码.zip(JavaWeb基于SSM框架的毕业设计)仿360buy京东商城...
该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,...
javaweb网上书店系统源码+数据库javaweb网上书城系统.zip 代码完整下载可用,已获导师指导并通过的97分高分课程大作业项目。 javaweb网上书店系统源码+数据库javaweb网上书城系统.zip 代码完整下载可用,已获导师...
基于javaweb的点餐系统源码+数据库(javaweb毕业设计).zip 获得导师指导并通过的高分项目,下载即用无需修改,代码完整确保项目可以运行。 基于javaweb的点餐系统源码+数据库(javaweb毕业设计).zip 获得导师指导...
基于JavaWeb的火车订票系统源码+数据库(javaweb毕业设计).zip 已获导师指导并高分毕业项目,代码完整确保可以运行,下载即用无需修改。 基于JavaWeb的火车订票系统源码+数据库(javaweb毕业设计).zip 已获导师...
JSP+servlet+javabean学习 里面有PDF文件对该章节的详细讲解,培训老师才讲的到的,非常详细......资源内容如下: JavaWeb02-request与response.rar ...JavaWeb12-文件上传.rar JavaWeb13-过滤器与监听器.rar
基于JavaWeb的点餐系统.zip
JSP+servlet+javabean学习 里面有PDF文件对该章节的详细讲解,培训老师才讲的到的,非常详细......资源内容如下: JavaWeb02-request与response.rar ...JavaWeb12-文件上传.rar JavaWeb13-过滤器与监听器.rar
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现...
Javaweb JavaScript EChart echarts.min.js 图表插件EChart 图表制作插件Javaweb前端PC端移动端使用的图表插件echarts.min.js压缩文件v5.0
基于jsp+servlet的宿舍管理系统源码+数据库+设计说明书(javaweb高分课设).zip基于jsp+servlet的宿舍管理系统源码+数据库+设计说明书(javaweb高分课设).zip基于jsp+servlet的宿舍管理系统源码+数据库+设计说明书...
基于Java+servlet的网上图书商城源码+sql数据库(javaweb课程作业).zip基于Java+servlet的网上图书商城源码+sql数据库(javaweb课程作业).zip基于Java+servlet的网上图书商城源码+sql数据库(javaweb课程作业).zip基于...