jsp自动编译机制

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

上图是一个形象的示意图,我们知道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帮我们定时检测编译操作。

时间: 2024-08-04 08:22:24

jsp自动编译机制的相关文章

resin网站根目录采用自动挂载后JSP自动编译报错

环境: 有一台旧的resin server,是正常运行的,现在新增三台resin server,配置文件resin.xml从旧的resin server上面得来,为了方便版本上线,采用 mount 的方式把旧的resin server上面的网站根目录挂载到新的三台server 在三台新server上面执行以下 mount 192.168.xxx.xxx:/webroot  /webroot 问题: 搭建好resin之后在打包访问的时候报错如下: /webroot/WEB-INF/work/_js

<关于JSP技术>运行机制及语法概述(附对本次同济校内ACM选拔赛决赛的吐槽)

(一)JSP运行的机制 JSP是一种建立在Servlet规范功能之上的动态网页技术,它们都是在通常的网页文件中嵌入脚本代码,用于产生动态内容,不过和ASP不同的是JSP文件中嵌入的是Java代码和JSP标记.其实JSP文件在用户第一次请求的时候会被编译成Servlet,然后再由这个Servlet处理用户的请求,所以JSP也可以看成是运行时的Servlet,模糊地将JSP和Servlet是同一个东西.但是他们之间的区别又有哪些呢? 1.Servlet是Java对于CGI的回应(Common Gat

JSP的编译指令

JSP有3个编译指令,是通知JSP引擎的消息,它不直接生成输出.编译指令都有默认值,无须为每个指令设置值. 常见的编译指令有如下三个: page:针对当前页面的指令. include:指定包含另一个页面. taglib:定义和访问自定义标签. 使用编译指令的语法格式如下: <%@ 编译指令名 属性="属性值" ...%> page指令 page指令通常位于JSP页面的顶端,一个JSP页面可以使用多条page指令,语法格式如下: <%@page [language=&q

weblogic对JSP预编译、weblogic读取JSP编译后的class文件、ant中jspc预编译JSP

我们都知道在weblogic中JSP是每次第一次访问的时候才会编译,这就造成第一次访问某个JSP的时候性能下降,有时候我们也希望JSP被编译成class然后打包在jar中实现隐藏JSP的功能,下面介绍自己几天来的研究成果.在这里weblogic采用的是weblogic12c. 前提知道JSP编译之后存放的位置在:%base%\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user\Struts\km2umq\jsp_s

Tomcat:自动部署、自动重加载、自动编译

麻雀虽小,五脏俱全,Tomcat 提供的自动部署.自动重加载.自动编译功能,可谓是让人又爱又恨.接下来就对这三者做一个介绍,文章中会Copy一些官方文档中的说法. If you are using the standard Host implementation, the following actions take place automatically when Catalina is first started, if the deployOnStartup property is set

JSP和JSP的运行机制

一.JSP是什么: JSP:Java Server Page 二.JSP的用途: 用于开发动态web应用.通过在HTML编写的静态页面中添加专用标签.脚本程序,从而实现网页中动态内容的显示. 三.JSP的主要特点: 实现程序逻辑与页面相分离:HTML设计界面,JSP标签和脚本生成页面的动态内容.在服务器端JSP引擎解释JSP标签和脚本,生成所请求的内容,并将结果以HTML页面的形式返回到浏览器.修改页面不会影响程序逻辑,修改程序逻辑,不会影响页面. 四.JSP的运行机制: 执行过程: JSP容器

Web自动化框架之五一套完整demo的点点滴滴(excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试报告+对接缺陷管理系统+自动编译部署环境+自动验证false、error案例)

标题很大,想说的很多,不知道从那开始~~直接步入正题吧 个人也是由于公司的人员的现状和项目的特殊情况,今年年中后开始折腾web自动化这块:整这个原因很简单,就是想能让自己偷点懒.也让减轻一点同事的苦力活:对于自动化测试与人工测试优缺势的问题,这里不想深入讨论,开一个博客收集一些观点然后开个讨论组讨论效果可能会更好. 标题上列的,是自己对web自动化这块统一的一个想象或是一套完整的自动化应所包含的的部分,目前完成了excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试

webstorm下的sass自动编译和移动端自适应实践

http://www.fawwheel.com/shahramLu/p/6477731.html webstorm下的sass自动编译和移动端自适应实践 1.安装Ruby 2.安装sass 3.webstorm配置file watcher 4.移动端自适应 1.安装Ruby 安装Ruby,有多种方式,打开官网下载 因为,使用的是window选择RubyInstall,下载地址 RubyInstall下载地址 选择对应系统的版本,下载完成,安装 添加到path,建议勾上,安装完成后,打开开始面板,

Eclipse不能自动编译 java文件的解决方案

前段时间出现了eclipse 不自动编译java文件的问题,在网上找了好长时间,总算把问题解决了,现在把这个问题的解决方法总结一下. 1,看看project -- Build Automatically有没有勾上?如果没有,勾上以后,clean一下,重启eclipse 2,看看你的lib里面有没有不用的jar包,看你的.classpath文件中有没有错误的路径. 3,这是最重要的一点,有problems视图中查看有没有关于本项目的错误信息,一般都会有这样的话: The project canno