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 相关文章推荐
一个js实现的所谓的滑动门
May 23 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
May 06 Javascript
关于JAVASCRIPT urldecode URL解码的问题
Jan 08 Javascript
浅谈jQuery中setInterval()方法
Jul 07 Javascript
JavaScript数组方法大全(推荐)
Jul 05 Javascript
Vue实现动态响应数据变化
Apr 28 Javascript
浅谈Webpack 是如何加载模块的
May 24 Javascript
jQuery实现基本动画效果的方法详解
Sep 06 jQuery
vue中的计算属性实例详解
Sep 19 Javascript
微信小程序代码上传、审核发布小程序
May 18 Javascript
js实现简单的日历显示效果函数示例
Nov 25 Javascript
jQuery实现鼠标拖动图片功能
Mar 04 jQuery
基于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求最大子序列和的算法实现
2011/06/24 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
浅析php单例模式
2014/11/25 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
Javascript发送AJAX请求实例代码
2016/08/21 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
Python编程实现使用线性回归预测数据
2017/12/07 Python
Selenium的使用详解
2018/10/19 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
品恩科技软件测试面试题
2014/10/26 面试题
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
毕业实习计划书
2015/01/16 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
大学班干部竞选稿
2015/11/20 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS