今天就跟大家聊聊有关JSP预编译如何加速应用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
在Java Web应用中,由于JSP的修改实时生效等一系列特点,许多时候我们会使用JSP来做为页面来显示工具。
而本质上JSP只是一种特殊的Java文件,会在运行时生成java文件,再编译出class文件执行。
对于一个小型应用来说,可能JSP的展示时间要求不会特别高,而对于中大型的项目,涉及到大量的JSP页面时,就会在初次请求时有不少的时间消耗在生成java文件和编译class上。
所以,对于考虑Tomcat性能优化的朋友,在已经进行过JVM调优,线程池的设置、负载均衡等方式之后,可以考虑本文提到的这一项。
为了加速应用的执行,Tomcat内部提供了一项功能
JSP预编译
所谓预编译,就是在正式使用之前,已经把JSP文件经过编译过程,生成Java(Servlet)文件,再编译成class。这样后续的真实请求到来的时候,就不需要再等待这一过程。
Tomcat提供的这一功能,是一个在jasper.jar 文件中的class:
org.apache.jasper.JspC
如果你已经在阅读了调试源码,可以直接运行该类的main方法即可。如果手边没有源代码,可以通过脚本(bat/shell)的方式,java -cp xxx.jar把依赖的jar包含进来,然后执行上面的这个class,然后你会看到如下的帮助信息。
可以编译一个JSP文件,也可以指定应用项目路径,编译一个应用下的全部JSP。
在执行Jspc的时候,也可以指定class文件输出路径。
对于生成的内容使用方式,我们可以通过指定其生成web.xml内配置的方式,将预编译生成的class文件以servlet的方式在web.xml里声明,然后把生成的web.xml版段拷贝到应用的web.xml里,生成的class拷贝到应用的classes目录即可。
当然,也可以将生成的class拷贝到Tomcat的jsp文件生成目录(work)内,后面执行时就不需要再重新生成了。
关于JSP的执行,可以参考两篇旧文:
你了解Tomcat是怎样处理Jsp文件的吗?
修改JSP文件实时生效的秘密
除了源码执行和脚本的方式外,也可以通过Ant任务来进行JSP的预编译。
具体可以参考官方文档提供的样例:http://tomcat.apache.org/tomcat-8.5-doc/jasper-howto.html#Web_Application_Compilation
主要是编译一个Ant 的build.xml,然后在命令行里执行指定的任务。而在build.xml里声明的内容,和我们上面的内容类似,都是声明一些class路径依赖,要编译的jsp的路径,生成class的路径等。
放张图给不想跳转的朋友
generated_web.xml就是生成的web.xml片段,拷贝到我们应用内即可。
对于使用Maven的朋友,可以在pom.xml里以插件的形式使用Jspc。
groupId和articatId类似这样
以上是基于codehus-mojo插件的实现,原来的实现不再更新了。还有几个插件的实现,例如apache-sling。可以参考这个:
https://sling.apache.org/documentation/development/jspc.html
基本配置形式如下:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jspc-maven-plugin</artifactId>
<executions>
<execution>
<id>jspc</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
然后像Ant的执行一样,指定一个执行目标。也可以额外指定一些执行参数,例如文件生成路径等。
当然,如果以上这些方式都不想使用,也可以采用纯手工的方式,在部署之后,把可能的页面都请求一次。 &_&
而对于一些Full Profile的应用服务器,比如GlassFish,在应用部署的时候,就会包含是否进行JSP预编译的选项,如果选中则会在部署的时候进行JSP预编译,此时如果编译有问题就会导致部署失败。
其实,其背后是将JSP编译生成的java和class文件置于其工作目录,例如GlassFish的domain_name/generated/jsp目录下,从而在初次请求前生成,减小应用访问的等待时间。
看完上述内容,你们对JSP预编译如何加速应用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。