手机版

jsp自动编译机制的详细介绍

时间:2021-09-11 来源:互联网 编辑:宝哥软件园 浏览:

jsp自动编译机制的详细介绍

一般来说Jasper自动检测的机制比较简单,依靠一个后台线程不断检测JSP文件和编译类文件的最后修改时间是否相同。如果相同,则认为没有变化,但如果不同,则需要重新编译。实际上,由于在Tomcat中部署的项目的JSP可能会引入其他页面或其他jar包,而这些资源可能是远程资源,实际处理起来会比较复杂,需要遍历来检测这些引入的不同资源是否被修改过。

上图是生动的示意图。我们知道Tomcat架构中有四个级别的容器,分别是Engine、Host、Context和wrapper,而jsp编译对应的是Wrapper级别,所以jasper不断被StandardWrapper调用,而jasper不断检查和验证各种本地和远程资源,一旦发现需要重新编译就重新编译。让我们看看如何实现它。

首先需要一个后台执行线程,Tomcat中有一个特殊的线程来处理不同容器的后台任务。如果你想在不同的容器中执行一些后台任务,你只需要重写backgroundProcess方法。因为JspServlet对应的是Wrapper级别,所以要在StandardWrapper中重写backgroundProcess,它会调用实现PeriodicEventListener接口的Servlet,其中JspServlet实现的是PeriodicEventListener接口,它只有一个periodicEvent方法,具体的检测逻辑可以在这个方法中实现。

其次,测试和判断重编译的依据是什么?重新编译就是把jsp变成Java然后再变成class,触发这个动作的条件是我们修改了某个jsp文件或者修改了某个jsp文件引入的资源之后,就会触发重新编译动作,所以最好的判断依据就是某个jsp或者资源最后修改时间的lastmodified属性,正常的顺序是jsp编译后生成一个class文件。将这个类文件的lastmodified属性设置为jsp文件的lastmodified属性。此时,两个文件的lastmodified属性是相同的。当我们更改jsp文件进行保存时,jsp的lastmodified属性被设置为当前时间。此时,是否重新编译是通过判断两个文件的lastmodified属性来决定的。重新编译后,jsp和类文件的lastmodified属性再次设置为相同。对于引入的资源,上次编译时引入资源的lastmodified属性保存在内存中,通过不断获取引入资源的lastmodified属性并与内存中对应的lastmodified属性进行比较,很容易判断是否需要重新编译。

最后,如何分别检测本地和远程资源?对于本地资源,使用java.io.File类可以轻松读取JSP文件或其他文件的lastmodified属性。对于远程资源,比如jar包,为了方便处理jar中包含的属性,java。 NET网址操作方便。它包含了很多协议,比如常用的jar、file、ftp等等,使用起来相当方便。

URL includeUrl=新的URL(' jar :http://hostname/third . jar!/');URLConnection iuc=include rol . OpenConnection();long includeLastModified=((JarURLConnection)iuc)。getJarEntry()。getTime();读取远程jar包和检索最后一次修改时间只需要三个步骤。当然,URL也支持本地文件资源的读取,所以是一个很好的读取资源的抽象对象。Tomcat中导入资源的管理使用URL作为操作对象。

这一部分讨论了Jasper自动检测机制的实现,给我们带来了很好的开发经验。我们不需要自己修改jsp和执行编译操作,但是tomcat通过jasper帮助我们定期检测编译操作。

感谢您的阅读,希望对大家有所帮助,感谢您对本网站的支持!

版权声明:jsp自动编译机制的详细介绍是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。