今天就跟大家聊聊有關(guān)JSP預(yù)編譯如何加速應(yīng)用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、金川網(wǎng)站維護(hù)、網(wǎng)站推廣。
在Java Web應(yīng)用中,由于JSP的修改實(shí)時(shí)生效等一系列特點(diǎn),許多時(shí)候我們會(huì)使用JSP來做為頁面來顯示工具。
而本質(zhì)上JSP只是一種特殊的Java文件,會(huì)在運(yùn)行時(shí)生成java文件,再編譯出class文件執(zhí)行。
對(duì)于一個(gè)小型應(yīng)用來說,可能JSP的展示時(shí)間要求不會(huì)特別高,而對(duì)于中大型的項(xiàng)目,涉及到大量的JSP頁面時(shí),就會(huì)在初次請(qǐng)求時(shí)有不少的時(shí)間消耗在生成java文件和編譯class上。
所以,對(duì)于考慮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í)請(qǐng)求到來的時(shí)候,就不需要再等待這一過程。
Tomcat提供的這一功能,是一個(gè)在jasper.jar 文件中的class:
org.apache.jasper.JspC
如果你已經(jīng)在閱讀了調(diào)試源碼,可以直接運(yùn)行該類的main方法即可。如果手邊沒有源代碼,可以通過腳本(bat/shell)的方式,java -cp xxx.jar把依賴的jar包含進(jìn)來,然后執(zhí)行上面的這個(gè)class,然后你會(huì)看到如下的幫助信息。
可以編譯一個(gè)JSP文件,也可以指定應(yīng)用項(xiàng)目路徑,編譯一個(gè)應(yīng)用下的全部JSP。
在執(zhí)行Jspc的時(shí)候,也可以指定class文件輸出路徑。
對(duì)于生成的內(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í)行時(shí)就不需要再重新生成了。
關(guān)于JSP的執(zhí)行,可以參考兩篇舊文:
你了解Tomcat是怎樣處理Jsp文件的嗎?
修改JSP文件實(shí)時(shí)生效的秘密
除了源碼執(zhí)行和腳本的方式外,也可以通過Ant任務(wù)來進(jìn)行JSP的預(yù)編譯。
具體可以參考官方文檔提供的樣例:http://tomcat.apache.org/tomcat-8.5-doc/jasper-howto.html#Web_Application_Compilation
主要是編譯一個(gè)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)即可。
對(duì)于使用Maven的朋友,可以在pom.xml里以插件的形式使用Jspc。
groupId和articatId類似這樣
以上是基于codehus-mojo插件的實(shí)現(xiàn),原來的實(shí)現(xiàn)不再更新了。還有幾個(gè)插件的實(shí)現(xiàn),例如apache-sling??梢詤⒖歼@個(gè):
https://sling.apache.org/documentation/development/jspc.html
基本配置形式如下:
org.codehaus.mojo
jspc-maven-plugin
jspc
compile
然后像Ant的執(zhí)行一樣,指定一個(gè)執(zhí)行目標(biāo)。也可以額外指定一些執(zhí)行參數(shù),例如文件生成路徑等。
當(dāng)然,如果以上這些方式都不想使用,也可以采用純手工的方式,在部署之后,把可能的頁面都請(qǐng)求一次。 &_&
而對(duì)于一些Full Profile的應(yīng)用服務(wù)器,比如GlassFish,在應(yīng)用部署的時(shí)候,就會(huì)包含是否進(jìn)行JSP預(yù)編譯的選項(xiàng),如果選中則會(huì)在部署的時(shí)候進(jìn)行JSP預(yù)編譯,此時(shí)如果編譯有問題就會(huì)導(dǎo)致部署失敗。
其實(shí),其背后是將JSP編譯生成的java和class文件置于其工作目錄,例如GlassFish的domain_name/generated/jsp目錄下,從而在初次請(qǐng)求前生成,減小應(yīng)用訪問的等待時(shí)間。
看完上述內(nèi)容,你們對(duì)JSP預(yù)編譯如何加速應(yīng)用有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。