您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)JSP預(yù)編譯如何加速應(yīng)用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
在Java Web應(yīng)用中,由于JSP的修改實(shí)時生效等一系列特點(diǎn),許多時候我們會使用JSP來做為頁面來顯示工具。
而本質(zhì)上JSP只是一種特殊的Java文件,會在運(yùn)行時生成java文件,再編譯出class文件執(zhí)行。
對于一個小型應(yīng)用來說,可能JSP的展示時間要求不會特別高,而對于中大型的項(xiàng)目,涉及到大量的JSP頁面時,就會在初次請求時有不少的時間消耗在生成java文件和編譯class上。
所以,對于考慮Tomcat性能優(yōu)化的朋友,在已經(jīng)進(jìn)行過JVM調(diào)優(yōu),線程池的設(shè)置、負(fù)載均衡等方式之后,可以考慮本文提到的這一項(xiàng)。
為了加速應(yīng)用的執(zhí)行,Tomcat內(nèi)部提供了一項(xiàng)功能
JSP預(yù)編譯
所謂預(yù)編譯,就是在正式使用之前,已經(jīng)把JSP文件經(jīng)過編譯過程,生成Java(Servlet)文件,再編譯成class。這樣后續(xù)的真實(shí)請求到來的時候,就不需要再等待這一過程。
Tomcat提供的這一功能,是一個在jasper.jar 文件中的class:
org.apache.jasper.JspC
如果你已經(jīng)在閱讀了調(diào)試源碼,可以直接運(yùn)行該類的main方法即可。如果手邊沒有源代碼,可以通過腳本(bat/shell)的方式,java -cp xxx.jar把依賴的jar包含進(jìn)來,然后執(zhí)行上面的這個class,然后你會看到如下的幫助信息。
可以編譯一個JSP文件,也可以指定應(yīng)用項(xiàng)目路徑,編譯一個應(yīng)用下的全部JSP。
在執(zhí)行Jspc的時候,也可以指定class文件輸出路徑。
對于生成的內(nèi)容使用方式,我們可以通過指定其生成web.xml內(nèi)配置的方式,將預(yù)編譯生成的class文件以servlet的方式在web.xml里聲明,然后把生成的web.xml版段拷貝到應(yīng)用的web.xml里,生成的class拷貝到應(yīng)用的classes目錄即可。
當(dāng)然,也可以將生成的class拷貝到Tomcat的jsp文件生成目錄(work)內(nèi),后面執(zhí)行時就不需要再重新生成了。
關(guān)于JSP的執(zhí)行,可以參考兩篇舊文:
你了解Tomcat是怎樣處理Jsp文件的嗎?
修改JSP文件實(shí)時生效的秘密
除了源碼執(zhí)行和腳本的方式外,也可以通過Ant任務(wù)來進(jìn)行JSP的預(yù)編譯。
具體可以參考官方文檔提供的樣例:http://tomcat.apache.org/tomcat-8.5-doc/jasper-howto.html#Web_Application_Compilation
主要是編譯一個Ant 的build.xml,然后在命令行里執(zhí)行指定的任務(wù)。而在build.xml里聲明的內(nèi)容,和我們上面的內(nèi)容類似,都是聲明一些class路徑依賴,要編譯的jsp的路徑,生成class的路徑等。
放張圖給不想跳轉(zhuǎn)的朋友
generated_web.xml就是生成的web.xml片段,拷貝到我們應(yīng)用內(nèi)即可。
對于使用Maven的朋友,可以在pom.xml里以插件的形式使用Jspc。
groupId和articatId類似這樣
以上是基于codehus-mojo插件的實(shí)現(xiàn),原來的實(shí)現(xiàn)不再更新了。還有幾個插件的實(shí)現(xiàn),例如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的執(zhí)行一樣,指定一個執(zhí)行目標(biāo)。也可以額外指定一些執(zhí)行參數(shù),例如文件生成路徑等。
當(dāng)然,如果以上這些方式都不想使用,也可以采用純手工的方式,在部署之后,把可能的頁面都請求一次。 &_&
而對于一些Full Profile的應(yīng)用服務(wù)器,比如GlassFish,在應(yīng)用部署的時候,就會包含是否進(jìn)行JSP預(yù)編譯的選項(xiàng),如果選中則會在部署的時候進(jìn)行JSP預(yù)編譯,此時如果編譯有問題就會導(dǎo)致部署失敗。
其實(shí),其背后是將JSP編譯生成的java和class文件置于其工作目錄,例如GlassFish的domain_name/generated/jsp目錄下,從而在初次請求前生成,減小應(yīng)用訪問的等待時間。
看完上述內(nèi)容,你們對JSP預(yù)編譯如何加速應(yīng)用有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。