概述

我们知道在开发工程的时候jsp文件是即修改即生效的。Tomcat jsp热部署的实现原理是每个JSP页面从上次访问到下次访问总是有默认几秒的缓存时间的,也就说并不是严格的即修改即生效,tocmat7默认是有4秒的缓存延迟的。这个默认的缓存延迟是在类 EmbeddedServletOptions 的 private intmodificationTestInterval = 4; 这个属性定义的。如果过了4秒缓存时间即失效,这个时候tomcat就会读取jsp的modified时间戳和work目录下编译好的class文件的modified的时间戳作对比。如果相等则class文件没有过期,则不会重新编译jsp文件,如果过期了则重新将jsp编译成java,并进一步编译成class。同时创建一个新的JasperLoader来重新加载这个有jsp编译好的class文件。

热部署原理

一个class只能由classloader加载一次,如果再次加载将会导致类冲突。但是JVM表示一个类是否是同一个类有两个条件。
1. 看这个类的完整类名是否一样(包名和类名)
2. 加载这个类的ClassLoader是否是同一个,也就是说这个ClassLoader是否是同一个实例。

如果是同一个ClassLoader的不同的实例加载同一个类,那么就可以实现热更新部署了。


下面具体分析一下这个过程:
JSP文件请求时序图

JspServlet.serviceJspFile() 方法


1. 判断当前jsp页面的JspServletWrapper对象是否存在,如果不存在,则创建并存放到 jsps缓存中。

private Map<String, JspServletWrapper> jsps = new ConcurrentHashMap<String, JspServletWrapper>();

2.调用JspServletWrapper.service() 方法

JspServletWrapper.service() 方法


1. 判断该jsp是否删除
2. 判断该 jsp 是否可用
3. 判断当前项目是不是development模式运行,如果是则每次都执行JspCompilationContext.compile() 方法
4. 判断是否是首次请求,如果首次请求则也执行JspCompilationContext.compile() 方法。

development 模式配置


JspServlet 模式是development模式,可以通过web.xml中把development模式关闭 development=false

JspCompilationContext.compile() 方法


1. 根据class文件(或java文件,通过一个参数可以选择)的最后修改时间,判断文件是否更新过,如果更新过,
2. 删除之前编译过的文件信息
3. 把jspLoader置空,需要重新创建一个ClassLoader,来达到热加载的目的。
4. 调用Compiler.compile()重新把jsp转换成servlet,并编译servlet成class文件。
5. 把JspServletWrapper.reload 修改为true。后面getServlet() 根据这个参数判断是否重新加载该servlet。

Compiler.isOutDated()方法


判断上次请求的时候+4秒的时候,是否大于当前时间,也就是说,距离上次检查文件更新时间是否有4秒的时间,如果小于4秒则不进行检查文件是否更新,不重新加载编译jsp文件。

根据上次最后修改时间,和这次获得的文件最后修改时候做对比,来判断文件是否更新过。


ctxt.getOptions().getModificationTestInterval() 默认的时间为4秒

Compiler.compile() 方法


1. 把jsp文件转换成java(servlet)文件
2. 把java文件编译成class文件。

JspServletWrapper.getServlet() 方法


1. 通过reload判断是否需要重新加载Servlet
2. 如果需要重新加载,则先销毁之前的Servlet
3. ctx.getJspLoader() 当前这个ClassLoader在上面已经赋值为null,在这个方法里又重新创建了一个Classloader实例
4. 初始化新创建的Servlet
5. 把reload赋值为 false

getJspLoader() 方法

调用Servlet.service() 方法

在JspServlet.serviceJspFile() 方法 获取Jsp对应的Servlet实例后,然后调用Servlet的Service方法。

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

JSP 热部署 源码解析相关推荐

  1. tomcat热加载、热部署-源码解析

    上文:tomcat线程模型-源码解析 热加载和热部署是什么? 请查看原来的写过的文章:热部署和热加载有什么区别? tomcat热加载和执热部署都是通过后台进程检测项目中的.class和目录是否发生变化 ...

  2. Alibaba-AndFix Bug热修复框架原理及源码解析

    小憩之后,继续为你解读AndFix热修复框架,呵呵. 上一篇Alibaba-AndFix Bug热修复框架的使用已经介绍了AndFix的使用,这篇主要介绍AndFix原理以及源码解析. AndFix原 ...

  3. Tomcat7源码解析

    Tomcat7 源码阅读学习     背景     Tomcat源码目录结构     Tomcat体系结构     Tomcat源码解析           Tomcat的启动流程           ...

  4. Tomcat8源码解析

    Tomcat8源码解析 Tomcat总体架构 Connector:开启Socket并监听客户端请求,返回响应数据: Container:负责具体的请求处理: 一个Service负责维护多个Connec ...

  5. Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战

    Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台-  什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定 ...

  6. python flask源码解析_用尽洪荒之力学习Flask源码

    [TOC] 一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见.最近正好时间充裕,决定试试做一下,并记录一下学习心得. 首先说明一下,本文研究的Flask版本是0.12. 首先做个小示例,在p ...

  7. SpringMVC源码解析

     一:springmvc运行过程: 1. dispatcherServlet 通过 HandlerMapping 找到controller 2. controller经过后台逻辑处理得到结果集mode ...

  8. Spring Boot Profile使用详解及配置源码解析

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 二师兄 来源 | 程序新视界 在实践的过程中我 ...

  9. quartz源码解析--转

    quartz源码解析(一)  . http://ssuupv.blog.163.com/blog//146156722013829111028966/ 任何个人.任何企业.任何行业都会有作业调度的需求 ...

最新文章

  1. FLEX SharedObject介绍及应用
  2. 把 Redis 当作队列来用,真的合适吗?
  3. Python语言学习之lambda:lambda函数的简介、使用方法、案例大全之详细攻略
  4. linux下oracle数据库升级,Oracle数据库在LinuxAS4升级
  5. wordpress 文章页面 (single.php)
  6. aspectj 注解
  7. Python字典技巧一锅炖
  8. python3 提取url中域名部分_python 从网址(url)中提取域名和path
  9. Silverlight 结合WCF Duplex Service聊天程序出炉
  10. VS中添加新项 数据选项卡下没有ADO.NET实体数据模型解决方案
  11. 我的个人知识管理工具软件
  12. php7中require_once,php require_once的使用方法总结
  13. PS不会用?史上最全面的PS快捷键图文使用指南来了!
  14. SPSS Modeler 数据整理之变量设定 (指南 第三章)
  15. B+树数据库加锁历史
  16. java的class是什么意思_Java的class是什么意思?
  17. Kotlin object的三种用法
  18. MongoDB4.4.2安装记录及无法启动踩坑
  19. ceph-deploy离线部署ceph集群及报错解决FAQ
  20. webpack 配置文件

热门文章

  1. python的shell无法输入_python中shell如何逐行输入?
  2. 微信小程序登录-利用Oenid实现白名单和黑名单
  3. Prompt-based Language Models:模版增强语言模型小结
  4. 基于知识图谱的问答系统(以医疗行业为例)
  5. 今晚直播 | 强化学习在比赛和自动机器学习中的应用简析
  6. 直播预告 | 小米人工智能部崔世起:小爱同学全双工技术实践
  7. CVPR2017有哪些值得读的Image Caption论文?
  8. ACM公选课第四节高精度 2020.4.9课-2020.4.10补
  9. greaterT()和lessT()
  10. mybatis-plus逻辑删除数据后依然能够查出该数据