基于4.1.7.RELEASE

该类继承了WebContentGenerator,WebContentGenerator可以对response进行设置header,设置缓存时间等操作,并且提供了对request的method的检查功能。

ResourceHttpRequestHandler 在xml文件中的配置方法

当spring检测到这样的配置,启动时会在SimpleUrlHandlerMapping中将mapping中的值与ResourceHttpRequestHandler映射起来,当有mapping对应的请求进来时,spring会将请求转给ResourceHttpRequestHandler处理

可以通过外界来设置其需要处理的locations和resourceResovlers,主要是通过下面这两个方法

public void setLocations(List locations) {

Assert.notNull(locations, "Locations list must not be null");

this.locations.clear();

this.locations.addAll(locations);

}

public void setResourceResolvers(List resourceResolvers) {

this.resourceResolvers.clear();

if (resourceResolvers != null) {

this.resourceResolvers.addAll(resourceResolvers);

}

}

从构造函数中可以看出

public ResourceHttpRequestHandler() {

super(METHOD_GET, METHOD_HEAD);

this.resourceResolvers.add(new PathResourceResolver());

}

在处理resourceResovlers时,默认会配置一个PathResourceResolver,如果是指定Resolvers列表,spring建议将PathResourceResolver放在列表中最后一个。那么PathResourceResolver是干什么的呢?来看看它的注释(已删除无关注释)

/**

* A simple {@code ResourceResolver} that tries to find a resource under the given

* locations matching to the request path.

*/

public class PathResourceResolver extends AbstractResourceResolver

注释里讲明了这个类会在request请求来时,根据request的path尝试在配置好的locations中寻找对应的资源。那么它是怎么判断是否是对应的资源呢?

后面ResourceResolver会讲到。

下面我们来看handlerRequest方法,这个方法会对response返回3种情况

404 : 检查请求的资源是否在配置列表中?如果请求的资源不在列表中则返回404。

304 : 请求的资源已存在配置列表中,但是请求header中的last-modified参数比资源的last-modified的时间戳新,则返回304。

返回数据 : 请求的header时间戳比资源时间戳旧,或者header中没有last-modified,那么返回正常数据并设置header缓存为1年。

@Override

public void handleRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

checkAndPrepare(request, response, true);

// 检查请求路径与资源文件对应关系

Resource resource = getResource(request);

if (resource == null) {

response.sendError(HttpServletResponse.SC_NOT_FOUND);

return;

}

// check the resource's media type

MediaType mediaType = getMediaType(resource);

//代码已简洁 作用为log日志mediaType是否存在

// 检查时间戳 会给response设置304

if (new ServletWebRequest(request, response).checkNotModified(resource.lastModified())) {

logger.trace("Resource not modified - returning 304");

return;

}

setHeaders(response, resource, mediaType);

// http method 方法

if (METHOD_HEAD.equals(request.getMethod())) {

logger.trace("HEAD request - skipping content");

return;

}

//将资源内容写入response的outPutStream

writeContent(response, resource);

}

java httprequesthandler_Spring-webmvc源码解析之ResourceHttpRequestHandler相关推荐

  1. Java集合---LinkedList源码解析

    一.源码解析 1. LinkedList类定义 2.LinkedList数据结构原理 3.私有属性 4.构造方法 5.元素添加add()及原理 6.删除数据remove() 7.数据获取get() 8 ...

  2. Java集合-ArrayList源码解析-JDK1.8

    ◆ ArrayList简介 ◆ ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAcc ...

  3. Java线程池源码解析及高质量代码案例

    引言 本文为Java高级编程中的一些知识总结,其中第一章对Jdk 1.7.0_25中的多线程架构中的线程池ThreadPoolExecutor源码进行架构原理介绍以及源码解析.第二章则分析了几个违反J ...

  4. java abstractlist_Java集合类源码解析:AbstractList

    今天学习Java集合类中的一个抽象类,AbstractList. 初识AbstractList AbstractList 是一个抽象类,实现了List接口,是隶属于Java集合框架中的 根接口 Col ...

  5. java集合-HashSet源码解析

    HashSet 无序集合类 实现了Set接口 内部通过HashMap实现 // HashSet public class HashSet<E>extends AbstractSet< ...

  6. Java集合框架源码解析之ArrayList

    ArrayList 可能是很多人使用得最为频繁的容器类了,ArrayList 实现了 List 接口,是一个有序容器,即存放元素的顺序与添加顺序相同,允许添加相同元素,包括 null ,底层通过数组来 ...

  7. java校验框架源码解析_Spring Boot原理剖析和源码分析

    Spring Boot原理剖析和源码分析 依赖管理 问题一:为什么导入dependency时不需要指定版本? spring-boot-starter-parent依赖 org.springframew ...

  8. 【java】spring-boot源码解析之应用启动

    spring boot 项目使用默认配置的思想,极大的简化了 spring 项目的开发.下面的代码就是一个最简单的 spring 项目: @SpringBootApplication public c ...

  9. Java之HashMap源码解析1

    讲解HashMap<K,V>时,我们先看看在API文档中是怎么介绍的: 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和null 键.(除了非同步 ...

  10. Java String类源码解析

    String直接继承Object 含有一个char[] value,还有一个int hash默认值为0 new String()的构造产生的是一个值为""的字符数组 String( ...

最新文章

  1. Ubuntu 14.04上使用CMake编译MXNet源码操作步骤(Python)
  2. Qt控制台输出QString
  3. [MFC] MFC 打开HTML资源(用ID版,也可加载到自己的web控件上)
  4. javaScript中常见的几种报错类型
  5. rhino4.0安装教程
  6. 【MySQL】 已经存在大量数据的表做分区
  7. duration java_Java Duration类| 带示例的get()方法
  8. maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目
  9. Linux学习总结(19)——Linux中文本编辑器vim特殊使用方法
  10. 去掉ul标签前的小圆点
  11. gridview分组android,安卓使用GridView实现网格视图
  12. 【定位问题】基于matlab三维chan算法求解室内定位问题【含Matlab源码 580期】
  13. Oracle 定时任务详解(dbms_scheduler)
  14. 图片编辑助手小程序_图片加文字_快速拼图_表情包制作
  15. DFS判断回路及回路个数
  16. 一致性哈希算法 mysql_一致性哈希算法 CARP 原理解析, 附 Golang 实现
  17. Linux m4a转mp3
  18. python远程聊天_python工具,微信聊天、自动回复、手机微信远程控制电脑
  19. 中央银行调节货币供应量的三个手段
  20. JDK源码下载:http://download.java.net/openjdk/jdk7

热门文章

  1. 不越狱换壁纸_9 款优质、免费越狱插件
  2. 波束管理 Beam Management
  3. 【Verilog】模16可逆流水灯
  4. MASH结构相噪分析的simulink仿真
  5. C++ 之常对象,常对象成员
  6. 10 在Spring Cloud中使用Hystrix
  7. 【总结整理】《人人都是产品经理》---读后感
  8. 【364天】跃迁之路——程序员高效学习方法论探索系列(实验阶段122-2018.02.04)...
  9. SQL的主键和外键约束
  10. newman的键盘不错