jsp 自动编译机制详细介绍


Posted in Javascript onDecember 01, 2016

 jsp 自动编译机制详细介绍

总的来说,Jasper的自动检测实现的机制比较简单,依靠某后台线程不断检测JSP文件与编译后的class文件的最后修改时间是否相同,若相同则认为没有改动,但倘若不同则需要重新编译。实际上由于在Tomcat部署的项目的JSP可能引入了其他页面,或者引入了其他jar包,而且这些资源都可能是远程的资源,所以实际处理会比较复杂,同样要遍历检测这些引入的不同资源是否做了修改。

 jsp 自动编译机制详细介绍

上图是一个形象的示意图,我们知道Tomcat架构中有四个级别的容器,Engine、Host、Context和Wrapper,而jsp编译对应在wrapper级别,所以通过StandardWrapper不断执行任务去调用jasper,而jasper则不断检测校验本地和远程的各种资源,一旦发现需要重新编译则进行重编译。往下看看具体如何实现。

首先,需要一个后台执行线程,Tomcat中有专门的一条线程处理不同容器的background任务,想在不同的容器中执行某些后台任务只需重写backgroundProcess方法即可实现,由于JspServlet对应于Wrapper级别,所以要在StandardWrapper中重写backgroundProcess,它会调用实现了PeriodicEventListener接口的Servlet,其中JspServlet就实现了PeriodicEventListener接口,此接口只有一个periodicEvent方法,具体的检测逻辑在此方法中实现即可。

其次,检测判断重新编译的根据是什么?重新编译就是再次把jsp变成Java再变成class,而触发这个动作的条件就是当我们修改了某个jsp文件后,或者某jsp文件引入的资源被修改后,都将触发重新编译动作,所以最好的判断依据就是某jsp或资源的最后修改时间lastmodified属性,正常顺序是jsp经过编译后生成class文件,把此class文件的lastmodified属性设置成jsp文件的lastmodified,此时两个文件的lastmodified属性是相同的,当我们改了jsp文件保存后,jsp的lastmodified属性就被置为当前时间,此时通过判断两个文件的lastmodified属性决定是否重新编译。重新编译后jsp与class文件的lastmodified属性再次被置为相同。对于引入的资源,内存中维护了上次编译时引入资源的lastmodified属性,不断获取引入资源的lastmodified属性并与内存中对应的lastmodified属性进行比较,同样可以很容易判断是否需要重新编译。

最后,对于本地和远程资源分别如何检测?对于本地资源来说,使用java.io.File类可以很方便的实现对某JSP文件或其他文件的lastmodified属性读取。对于远程资源,比如jar包,为了方便处理jar包含的属性,使用java.NET.URL可以很方便操作,它包含了很多协议,例如常见的jar、file、ftp等协议,使用相当方便,

URL includeUrl = new URL("jar:http://hostname/third.jar!/");
URLConnection iuc = includeUrl.openConnection();
long includeLastModified = ((JarURLConnection) iuc).getJarEntry().getTime();

只需三步即完成对远程jar包的读取且取出最后修改时间。当然URL还支持本地文件资源的读取,所以它是很好的资源读取抽象对象,Tomcat中对引入资源的管理都是使用URL作为操作对象。

本小节探讨了Jasper自动检测机制的实现,自动检测机制给我们的开发带来了很好的体验,我们不必自己修改了jsp后自己去执行编译操作,而是tomcat通过jasper帮我们定时检测编译操作。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
JQuery 自定义CircleAnimation,Animate方法学习笔记
Jul 10 Javascript
window.navigate 与 window.location.href 的使用区别介绍
Sep 21 Javascript
jquery实现table鼠标经过变色代码
Sep 25 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
Dec 23 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
Mar 13 Javascript
Vue 仿QQ左滑删除组件功能
Mar 12 Javascript
vue 的keep-alive缓存功能的实现
Mar 22 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
Mar 15 Javascript
详解element-ui中表单验证的三种方式
Sep 18 Javascript
JavaScript相等运算符的九条规则示例详解
Oct 20 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
Mar 10 Javascript
JavaScript 几种循环方式以及模块化的总结
Sep 03 Javascript
基于vue.js实现图片轮播效果
Dec 01 #Javascript
JQuery学习总结【一】
Dec 01 #Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 #Javascript
jQuery 如何实现一个滑动按钮开关
Dec 01 #Javascript
有趣的bootstrap走动进度条
Dec 01 #Javascript
微信小程序进行微信支付的步骤昂述
Dec 01 #Javascript
第一次接触神奇的前端框架vue.js
Dec 01 #Javascript
You might like
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
php利用事务处理转账问题
2015/04/22 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
2012年开发人员的16款新鲜的jquery插件体验分享
2012/12/28 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
解决vue项目router切换太慢问题
2020/07/19 Javascript
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python二叉树的实现实例
2013/11/21 Python
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
深入理解python函数递归和生成器
2016/06/06 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
python按照多个条件排序的方法
2019/02/08 Python
Python中字符串List按照长度排序
2019/07/01 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
函授本科毕业生自我鉴定
2013/10/16 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
创先争优公开承诺书
2014/08/30 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
迎国庆主题班会
2015/08/17 职场文书