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中字符串拼接需注意的问题
Jul 13 Javascript
基于jquery实现点击左右按钮图片横向滚动
Apr 11 Javascript
javascript 实现键盘上下左右功能的小例子
Sep 15 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
Mar 24 Javascript
JavaScript进阶练习及简单实例分析
Jun 03 Javascript
浅谈jQuery中ajaxPrefilter的应用
Aug 01 Javascript
基于jQuery实现咖啡订单管理简单应用
Feb 10 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
Jun 01 Javascript
JS遍历DOM文档树的方法实例详解
Apr 03 Javascript
通过JS深度判断两个对象字段相同
Jun 14 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
Oct 26 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 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中使用与Perl兼容的正则表达式
2006/11/26 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
2014/08/15 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
如何利用cmp命令比较文件
2013/09/23 面试题
行政人事专员岗位职责
2014/03/05 职场文书
会计系毕业生求职信
2014/05/28 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
服务承诺书
2015/01/19 职场文书
教师党员自我评价2015
2015/03/04 职场文书
高一军训感想
2015/08/07 职场文书
MySQL之DML语言
2021/04/05 MySQL
MySQL创建索引需要了解的
2021/04/08 MySQL
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python