目录
Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介
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新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——注解、脚本、任务、MVC等其他特性改进
源码下载
https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-resource
相关推荐
Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...
#### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented Programming,面向切面编程),这些功能大大...
Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...
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 拦截器...
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 拦截器...
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 拦截器...
4.1微信小程序开发流程 27 4.2项目开发方法及部署环境 29 4.3数据库设计 29 5.系统设计与实现 30 5.1 小程序——主页模块 30 5.2小程序——搜索模块 31 5.3小程序——购物车和订单模块 32 5.4小程序——个人中心模块...
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...
本项目——基于Spring Boot框架的信息化在线教学平台,旨在利用现代信息技术手段提升教学管理水平,实现教育资源共享,促进教学活动的高效开展。 #### 二、系统需求分析 - **目标用户**:主要面向学校管理者、教师...
- `src/main/resources`:存储配置文件、静态资源(如CSS、JS)、模板文件(如Thymeleaf或Freemarker)。 - `pom.xml`:Maven的项目配置文件,管理依赖。 - `.gitignore`:指定Git忽略的文件或目录。 - `README.md`...
第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开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用、Spring核心之IoC、...
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 ...
网上这本书的电子版不好这,这是用money换来的——和大家分享! 由于书太大,我把书分成两部分别上传。 内容简介 本书系统全面地介绍了Java中的各项主流技术,以及基于这些技术的商业化应用程序的开发技巧,在讲解...
此外,Oracle 11g还提供了一系列高级特性,如分区、数据压缩、实时应用集群等,这些特性极大地提高了数据处理效率和系统的可用性。 ##### 2.3 其他技术简介 除了JSP和Oracle 11g之外,开发过程中还可能使用了其他...
SQL Server 2000与以前版本相比较,又具有以下新特性 : 1.支持XML(Extensive Markup Language,扩展标记语言) 2.强大的基于Web的分析 3.支持OLE DB和多种查询 4.支持分布式的分区视图 安装、...
第一印象——两个简单的例子 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 ...