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 相关文章推荐
javascript中动态加载js文件多种解决办法总结
Nov 15 Javascript
Javascript 遍历页面text控件详解
Jan 06 Javascript
javascript读取Xml文件做一个二级联动菜单示例
Mar 17 Javascript
jQuery实现简单下拉导航效果
Sep 07 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
May 28 Javascript
BootstrapValidator不触发校验的实现代码
Sep 28 Javascript
快速解决js中window.location.href不工作的问题
Nov 02 Javascript
详解A标签中href=""的几种用法
Aug 20 Javascript
React如何实现浏览器打印部分内容详析
May 19 Javascript
VUE前后端学习tab写法实例
Aug 06 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
Aug 29 Javascript
微信小程序HTTP接口请求封装代码实例
Sep 05 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
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python实现超简单端口转发的方法
2015/03/13 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
会计专业个人求职信范文
2014/01/08 职场文书
同事吵架检讨书
2014/02/05 职场文书
付款委托书范本
2014/10/05 职场文书
毕业生评语大全
2015/01/04 职场文书
青岛导游词
2015/02/12 职场文书
毕业设计致谢语
2015/05/14 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书