`

javaweb静态资源文件(.jpg;,css;.js等)处理

阅读更多
在使用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
分享到:
评论

相关推荐

    springMVC3学习(四)--访问静态文件如js,jpg,css(源码)

    springMVC3学习(四)--访问静态文件如js,jpg,css(源码) 文章地址:http://blog.csdn.net/itmyhome1990/article/details/25987411

    smbms静态资源(超市管理系统)

    在IT行业中,静态资源通常包括HTML、CSS、JavaScript、图片和其他不涉及服务器端动态处理的文件,它们是用户浏览器直接下载并呈现的部分。 【描述】中的反复提及"超市管理系统静态资源,smbms静态资源"表明这个系统...

    静态原型,一些静态资源

    在IT行业中,静态资源是指那些不涉及服务器端动态处理的文件,它们通常包括HTML、CSS、JavaScript、图片、字体文件等。这些文件是网站或应用程序的基础组成部分,为用户提供界面展示和交互功能。在这个名为"静态原型...

    JAVA项目:javaWeb聊天室.rar

    5. **图片和其他静态资源**:项目可能包含`.png`、`.jpg`等图像文件,以及其他所需的静态资源。 6. **构建脚本**:如`build.xml`(Ant)或`pom.xml`(Maven),用于自动化构建过程。 7. **文档**:可能包含README...

    javaweb中静态文件的常用处理方法汇总

    在Java Web开发中,处理静态文件(如图片、JavaScript、CSS等)是非常常见的任务,因为它们构成了用户界面的基础。以下是一些在Java Web应用程序中处理静态文件的常用方法: 1. **激活Tomcat的defaultServlet处理...

    JavaWeb学生信息管理系统源码.zip

    images和code目录可能分别存储了项目的静态资源和额外的代码文件。 8. **文档编写**: java课程设计.docx可能是关于项目的设计文档,详细解释了项目的目标、功能需求、系统架构和技术实现。 9. **前端技术**: 项目...

    CMS后台管理系统网站模板690

    7. **JavaScript文件(dataTables.bootstrap.js、dataTables.bootstrap.css等)**:`assets/js/dataTables`目录下的文件与数据表格插件有关,例如`dataTables.bootstrap.js`和`dataTables.bootstrap.css`,它们提供...

    众筹网站源码

    2. 静态资源:如CSS样式表(.css)、JavaScript脚本(.js)、图片文件(.jpg, .png)等,用于页面美化和交互功能。 3. 数据库脚本:可能包含SQL文件,用于创建和初始化数据库,存储用户信息、项目数据等。 4. README...

    我的JavaWeb笔记整理

    静态资源包括html、css、js、txt、mp4、jpg等文件,而动态资源主要指的是那些需要通过服务器端程序处理才能生成的资源,比如JSP页面和Servlet程序。Tomcat的启动通常通过运行`catalina run`命令,而停止可以通过关闭...

    24小时客户支持网站前端模板b5c.zip

    5. `更多javaweb免费资料以及相关视频下载学习.html.url`:这是一个链接文件,可能指向与JavaWeb相关的免费学习资源。 这个模板适用于希望快速搭建一个专业且具有24小时客户支持功能的网站的企业或个人。通过这个...

    基于SSM框架的酒店管理系统源码实现

    项目概述:基于SSM...技术栈详情:开发语言以Java为主,前端交互采用JavaScript,页面布局与样式设计依赖于CSS,视图层使用JSP,配置文件以XML格式进行管理,同时包含了必要的静态资源如图片(PNG、JPG、GIF)等。

    HTML学习文档.docx

    - **增强交互性**:虽然主要功能在于静态内容展示,但结合CSS和JavaScript可以实现更丰富的交互效果。 ##### 1.4 HTML书写规范 - **标签**:HTML文档由多个标签组成,每个标签都有特定的功能。 - **标签格式**: -...

Global site tag (gtag.js) - Google Analytics