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资料toString 方法
Mar 13 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
Jan 15 Javascript
jQuery 全选/反选以及单击行改变背景色实例
Jul 02 Javascript
jQuery选择器用法实例详解
Dec 17 Javascript
jquery插件Jplayer使用方法简析
Apr 22 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 Javascript
总结Javascript中数组各种去重的方法
Oct 04 Javascript
解决浏览器会自动填充密码的问题
Apr 28 Javascript
深入理解JavaScript继承的多种方式和优缺点
May 12 Javascript
关于vue项目中搜索节流的实现代码
Sep 17 Javascript
three.js利用卷积法如何实现物体描边效果
Nov 27 Javascript
Vue跨域请求问题解决方案过程解析
Aug 07 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 文件上传源码分析(RFC1867)
2009/10/30 PHP
php 静态变量与自定义常量的使用方法
2010/01/26 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
jQuery使用手册之三 CSS操作
2007/03/24 Javascript
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
一个获取第n个元素节点的js函数
2014/09/02 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
AngularJS入门教程之表单校验用法示例
2016/11/02 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
Python程序设计入门(4)模块和包
2014/06/16 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
python3多线程知识点总结
2019/09/26 Python
浅析python中while循环和for循环
2019/11/19 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
你应该知道的30个css选择器
2014/03/19 HTML / CSS
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
劳资员岗位职责
2013/11/11 职场文书