JSP 热部署 源码解析
来源:互联网 发布:拜占庭算法 编辑:程序博客网 时间:2024/06/08 08:39
概述
我们知道在开发工程的时候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的不同的实例加载同一个类,那么就可以实现热更新部署了。
下面具体分析一下这个过程:
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 热部署 源码解析
- jboss7 jsp热部署
- 热部署原理解析
- Jboss实现jsp热部署
- tocmat中jsp热部署实现原理
- jboss as7.1 (jsp热部署)
- intellij idea tomcat jsp 热部署
- intellij idea tomcat jsp 热部署
- intellij idea tomcat jsp 热部署
- intellij idea tomcat jsp 热部署
- intellij idea tomcat jsp 热部署
- JSP热部署的实现原理
- Tomcat中jsp热部署实现原理
- jboss 7.1.1 Final 的jsp热部署解决方案
- spingboot热部署,实现jsp页面时时刷新
- idea热部署(更新jsp代码不用重启tomcat)
- 热部署
- 热部署
- bootstrap-datetimepicker时间控件
- STM32学习笔记:外部中断的使用
- Incoherent dictionary learning for sparse representation based image denoising(一)
- Java设计模式--中介者模式【Mediator Pattern】
- mysql中条件限制语句(一)
- JSP 热部署 源码解析
- 洞藏酒,心如兰酒!素心如兰,酒如琼露
- myeclipse运行时:Exception in thread "http-apr-8080-exec-2"
- mysql master slave 配置
- 回调函数和钩子函数
- [My SQL] 使用视图
- VC判断一个UNICODE字符串中字母、数字、汉字、其他字符的个数
- 有几个PAT(PAT-1040)
- if __name__ == '__main__': 原理