`
jinnianshilongnian
  • 浏览: 21424394 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2403176
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2996176
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5630413
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257187
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1592662
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248795
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5845661
Group-logo
跟我学Nginx+Lua开...
浏览量:697478
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:779851
社区版块
存档分类
最新评论

Spring4.1新特性——静态资源处理增强

阅读更多

目录

Spring4.1新特性——综述

Spring4.1新特性——Spring核心部分及其他

Spring4.1新特性——Spring缓存框架增强

Spring4.1新特性——异步调用和事件机制的异常处理

Spring4.1新特性——数据库集成测试脚本初始化

Spring4.1新特性——Spring MVC增强

Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介

Spring4.1新特性——静态资源处理增强

 

Spring 4.1对静态资源处理进行了细化,ResourceHttpRequestHandler细分为两大部分:ResourceResolver和ResourceTransformer。

public interface ResourceResolver {
  Resource resolveResource(HttpServletRequest request, String requestPath, List<? extends Resource> locations,
			ResourceResolverChain chain);
  String resolveUrlPath(String resourcePath, List<? extends Resource> locations, ResourceResolverChain chain);
}  

 

resolveResource用于把当前请求路径解析到一个在locations中存在的Resource,即相对于locations目录,这个要看实际实现,比如PathResourceResolver就是相对目录;

resolveUrlPath用于把资源路径解析为向外暴露的URL路径形式,比如VersionResourceResolver实现就是在资源路径上加上版本号。 

public interface ResourceTransformer {
	Resource transform(HttpServletRequest request, Resource resource, ResourceTransformerChain transformerChain)
			throws IOException;
}

用于把资源从一种形式转换为另一种形式,比如对css文件中的url进行过滤并修改。 

 

ResourceResolver和ResourceTransformer实现和Filter机制类似,就不多阐述了。

 

ResourceHttpRequestHandler核心实现:

	protected Resource getResource(HttpServletRequest request) throws IOException{
		String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
		if (path == null) {
			throw new IllegalStateException("Required request attribute '" +
					HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE + "' is not set");
		}
		if (!StringUtils.hasText(path) || isInvalidPath(path)) {
			if (logger.isTraceEnabled()) {
				logger.trace("Ignoring invalid resource path [" + path + "]");
			}
			return null;
		}
		ResourceResolverChain resolveChain = new DefaultResourceResolverChain(getResourceResolvers());
		Resource resource = resolveChain.resolveResource(request, path, getLocations()); //先进行ResourceResolver
		if (resource == null || getResourceTransformers().isEmpty()) {
			return resource;
		}
		ResourceTransformerChain transformChain = new DefaultResourceTransformerChain(resolveChain, getResourceTransformers());//然后进行ResourceTransformer
		resource = transformChain.transform(request, resource);
		return resource;
	}

 

交互流程是:

request(/static/js/jquery-版本.js)

        |

       V 

GzipResourceResolver(如果需要Gzip压缩,进行Gzip压缩)

        |

       V 

CacheResolver(缓存中如果找到了,直接返回)

        |

       V 

VersionResourceResolver(去掉版本号,然后查找资源)

        |

       V 

PathResourceResolver(如直接到底层文件系统找)

        |

       V

CachingResourceTransformer(判断是否有已经转换好的缓存)

        |

       V

CssLinkResourceTransformer(CSS链接替换,如加版本号,其会调用ResourceResolver的resolveUrlPath得到新的UrlPath)

        |

       V

response

 

对应的Spring配置文件

    <mvc:resources mapping="/static/**" location="/WEB-INF/static/">
        <mvc:resolvers>
            <bean class="org.springframework.web.servlet.resource.GzipResourceResolver"/>
            <bean class="org.springframework.web.servlet.resource.CachingResourceResolver">
                <constructor-arg ref="cache"/>
            </bean>
            <bean class="org.springframework.web.servlet.resource.VersionResourceResolver">
                <property name="strategyMap">
                    <map>
                        <entry key="/**">
                            <bean class="org.springframework.web.servlet.resource.ContentVersionStrategy"/>
                        </entry>
                    </map>
                </property>
            </bean>
            <bean class="org.springframework.web.servlet.resource.PathResourceResolver"/>
        </mvc:resolvers>
        <mvc:transformers>
            <bean class="org.springframework.web.servlet.resource.CachingResourceTransformer">
                <constructor-arg ref="cache"/>
            </bean>
            <bean class="org.springframework.web.servlet.resource.CssLinkResourceTransformer"/>
        </mvc:transformers>
    </mvc:resources>

其中版本机制是使用ContentBasedVersionStrategy,其通过MD5内容生成版本。

 

如果配置文件是如下形式,其默认会自动注册一个PathResourceResolver。

 <mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>

 

如果想在页面中也完成同样的事情,可以首先注册一个拦截器:

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="org.springframework.web.servlet.resource.ResourceUrlProviderExposingInterceptor">
                <constructor-arg>
                        <bean class="org.springframework.web.servlet.resource.ResourceUrlProvider"/>
                </constructor-arg>
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>

然后在页面中使用如下代码完成相应的功能:

<%=((ResourceUrlProvider)request.getAttribute("org.springframework.web.servlet.resource.ResourceUrlProvider"))
        .getForLookupPath("/static/css/style.css")%>

 

另外ResourceUrlProvider目前实现是有问题的,没有考虑使用mvc:resources标签注册ResourceHttpRequestHandler的情况;我们需要修改下其源码:

                Object handler = hm.getUrlMap().get(pattern);
                if(handler instanceof String) {//如果是字符串,那么接着去获取Bean才对
                    handler = hm.getApplicationContext().getBean((String)handler);
                }
                if (handler instanceof ResourceHttpRequestHandler) {

 

上边的使用还是很麻烦,大家可以自己实现一个jstl function来简化使用。

 

也可以使用ResourceUrlEncodingFilter过滤器,其会对Response进行包装,当调用encodeURL时会对url进行resolver。 

 

 

当我们访问localhost:8080/test时会看到响应内容带着版本号:hello /static/css/style-23f8024fc04a067828dded9083ceab4f.css,而style.css中会变成:

@import url('other-a18c41dc0df32e9856c5c08914284553.css');

 

@import url('../css2/css2-ad02c833411bcdc09669b1464001c5e4.css');

 

当other-a18c41dc0df32e9856c5c08914284553.css请求到服务端后,会使用VersionStrategy去提取版本并进行版本的匹配,如果版本变了,而客户端没有感知到,那么将报404,这个是无法忍受的,即版本化不是持久化的。

 

 

 Spring4新特性

Spring4新特性——泛型限定式依赖注入

Spring4新特性——核心容器的其他改进

Spring4新特性——Web开发的增强

Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 

Spring4新特性——Groovy Bean定义DSL

Spring4新特性——更好的Java泛型操作API 

Spring4新特性——JSR310日期API的支持

Spring4新特性——注解、脚本、任务、MVC等其他特性改进 

 

源码下载

https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-resource

 

3
0
分享到:
评论
7 楼 java-lxm 2016-09-18  
zqk254154218 写道
请教一下:我在spring里配置了<mvc:default-servlet-handler/>,可还是找不到静态资源文件,然后我又使用了
<mvc:resources location="/static/js/" mapping="/static/js/**"/>
<mvc:resources location="/static/images/" mapping="/static/css/**"/>
<mvc:resources location="/static/css/" mapping="/static/images/**"/>
<mvc:resources location="/static/plugins/" mapping="/static/plugins/**"/>
这种方式来进行静态资源访问,依然访问不到静态资源,求大神解答一下







我也遇到了
6 楼 腾讯rep 2015-04-24  
违法违规sad该放手
5 楼 zqk254154218 2015-01-26  
请教一下:我在spring里配置了<mvc:default-servlet-handler/>,可还是找不到静态资源文件,然后我又使用了
<mvc:resources location="/static/js/" mapping="/static/js/**"/>
<mvc:resources location="/static/images/" mapping="/static/css/**"/>
<mvc:resources location="/static/css/" mapping="/static/images/**"/>
<mvc:resources location="/static/plugins/" mapping="/static/plugins/**"/>
这种方式来进行静态资源访问,依然访问不到静态资源,求大神解答一下






4 楼 15000346240 2015-01-08  
我现在为二类websocket用了spring 4.1,原先的mvc:resouces不生效了,静态资源不被过滤了,是什么情况,我需要把某些jar换成3.+的么?
我记成hibernate的时候就把orm.jar从4.1换成3.5了,4.1的时候会报一些错,关于注解之类的。
3 楼 7先生 2014-10-13  
你好,请问如何选择spring3还是spring4?
2 楼 jinnianshilongnian 2014-08-26  
西门吹牛 写道
加个版本号有啥用?想不明白

其实这个如果能实现加版本号后自动持久化的功能就完善了。
1 楼 西门吹牛 2014-08-26  
加个版本号有啥用?想不明白

相关推荐

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 静态资源映射 88 4.4.2 拦截器...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 静态资源映射 88 4.4.2 拦截器...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 静态资源映射 88 4.4.2 拦截器...

    基于微信平台的基于springboot闲置书本交易小程序的研制 (源码 + 说明文档 + 演示视频)

    4.1微信小程序开发流程 27 4.2项目开发方法及部署环境 29 4.3数据库设计 29 5.系统设计与实现 30 5.1 小程序——主页模块 30 5.2小程序——搜索模块 31 5.3小程序——购物车和订单模块 32 5.4小程序——个人中心模块...

    Java Web程序设计教程

    11.6项目实战——spring问候程序 239 本章小结 241 课后练习 241 第12章springaop 242 12.1aop基础 242 12.1.1aop与oop的比较 242 12.1.2aop的核心概念 243 12.1.3java动态代理与aop 244 12.1.4springaop...

    低清版 大型门户网站是这样炼成的.pdf

    6.1.3 spring 2.5拿手戏——控制反转与依赖注入 353 6.1.4 何为“面向切面编程aop” 356 6.1.5 spring 2.5圣经——面向接口编程 358 6.1.6 开始spring 2.5旅程—hello world 359 6.2 spring 2.5核心技术 364 ...

    javaSE代码实例

    第11章 异常处理——Java世界的医生 195 11.1 异常处理的基本知识 195 11.1.1 try和catch捕获异常 195 11.1.2 异常的传播过程 198 11.1.3 finally语句块的使用 199 11.1.4 try、catch及finally语句块之间...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用、Spring核心之IoC、...

    Grails权威指南

     4.1 简化的orm和grails对象关系映射(gorm)  4.2 gorm基础  4.3 设置属性可选  4.4 gorm中的关系  4.5 执行crud操作  4.5.1 创建书签  4.5.2 读取书签  4.5.3 更新书签  4.5.4 ...

    JAVA程序开发大全---上半部分

    网上这本书的电子版不好这,这是用money换来的——和大家分享! 由于书太大,我把书分成两部分别上传。 内容简介 本书系统全面地介绍了Java中的各项主流技术,以及基于这些技术的商业化应用程序的开发技巧,在讲解...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

     SQL Server 2000与以前版本相比较,又具有以下新特性 :  1.支持XML(Extensive Markup Language,扩展标记语言)  2.强大的基于Web的分析  3.支持OLE DB和多种查询  4.支持分布式的分区视图  安装、...

    基于J2EE框架的个人博客系统项目毕业设计论...

     SQL Server 2000与以前版本相比较,又具有以下新特性 :  1.支持XML(Extensive Markup Language,扩展标记语言)  2.强大的基于Web的分析  3.支持OLE DB和多种查询  4.支持分布式的分区视图  安装、...

    nosql 入门教程

    第一印象——两个简单的例子 17 2.1.1 简单的位置偏好数据集 17 2.1.2 存储汽车品牌和型号数据 22 2.2 使用多种语言 30 2.2.1 MongoDB驱动 30 2.2.2 初识Thrift 33 2.3 小结 34 第3章 NoSQL接口与交互 36 ...

Global site tag (gtag.js) - Google Analytics