本文說明如何使用Apache Ant預先編譯jsp檔案。透過預先載入jsp的方式,可增加web應用的效能。
在說明預先編譯jsp以前,須要先了解tomcat如何對jsp進行編譯的。
如上圖所示,當使用者對jsp發出請求的時候,tomcat使用Jasper2 引擎將jsp轉換成java檔,然後再使用java compiler將java檔編譯成class檔。一但jsp被編譯成class檔以後,tomcat將不再使用jsp檔,而是直接使用class檔。
假設使用者在同一個請求中存取多個jsp,其編譯所花的時間,將非常可觀。
預先編譯的方法主要有三種:
-
Pre-compilation by Request 如同上一段所述,當使用者第一次請求某jsp時執行。這是最簡單且預設的方式。
-
Pre-compilation on start-up 另一種方式,是在tomcat server啟動時編譯jsp。因此,我們必須透過修改web.xml,告訴server在啟動時編譯jsp。 如下圖,在每個jsp頁面加上的tag即可。
-
Pre-compilation at build
這種方式是在專案build期間編譯jsp。build專案的工具有很多,例如ant, maven, gradle等,我們使用ant作為build專案的工具。
本文採用第三種方式,Pre-compilation at build。
-
下載ant進行安裝
使用ant之前需要寫一份xml,告訴ant該執行那些工作(target)。我們將xml命名為precompileJSP.xml。
參數設定,請依照電腦的設定更換。
透過JspC套件,將jsp轉換成JAVA檔。
在<taskdef>中,定義JspC,設定JspC會用到的jar和classpath,並取名為jasper2。
在<jasper2>中,轉換jsp至java。addwebxmlmappings="true"表示在轉換時會將generated_web.xml合併到web.xml中。轉換完成將JAVA檔存於jsp_java目錄下。若不想將generated_web.xml合併在原本的web.xml,可將addwebxmlmappings設為false,但必須自行在web.xml中引入generated_web.xml,可參考這篇文章的說明。
編譯java檔。
139-148行: 使用eclipse compiler編譯java。相較於java compiler,eclipse compiler允許java檔有錯誤的狀況下編譯class檔(雖然class是壞的)。若想使用java compiler,則可以刪除這幾行。
<javac>,將jsp_java目錄下的java檔,編譯成class檔,並將class檔放於tomcat中,該專案的WEB-INF/classes目錄下。
<delete>,將暫存的jsp_java目錄刪除。
依序執行target: jspc, compile_jsp。
-
web.xml
如下圖所示,左邊為原本的web.xml,右邊為執行後的web.xml,可看出web.xml多了編譯後的servlet設定。 -
jsp編譯後的class
左邊為原本的classses目錄,編譯後,如右邊,多出org目錄。
org目錄下放所有jsp編譯過後的class檔。
-
啟動tomcat後,觀察work目錄下將不再產生該專案jsp的java&class檔
原本tomcat會將編譯jsp後產生的java & class檔放在[tomcat目錄]/work/Catalina/[專案路徑]/[專案名稱]/org/apache/jsp目錄下。 如今我們透過ant幫tomcat預先編譯jsp後,tomcat會在classes目錄下找到這些jsp的class檔,因此將不再產生work目錄。