溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JSP預(yù)編譯如何加速應(yīng)用

發(fā)布時間:2022-01-04 15:41:18 來源:億速云 閱讀:137 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(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

JSP預(yù)編譯如何加速應(yīng)用

如果你已經(jīng)在閱讀了調(diào)試源碼,可以直接運(yùn)行該類的main方法即可。如果手邊沒有源代碼,可以通過腳本(bat/shell)的方式,java -cp xxx.jar把依賴的jar包含進(jìn)來,然后執(zhí)行上面的這個class,然后你會看到如下的幫助信息。

JSP預(yù)編譯如何加速應(yīng)用

可以編譯一個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)的朋友

JSP預(yù)編譯如何加速應(yīng)用

generated_web.xml就是生成的web.xml片段,拷貝到我們應(yīng)用內(nèi)即可。

對于使用Maven的朋友,可以在pom.xml里以插件的形式使用Jspc。

groupId和articatId類似這樣

JSP預(yù)編譯如何加速應(yīng)用

以上是基于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)致部署失敗。

JSP預(yù)編譯如何加速應(yīng)用

其實(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è)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(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)容。

jsp
AI