咱們知道在開發工程的時候jsp文件是即修改即生效的,因爲比較好奇就研究了一下tomcat對於jsp熱部署的實現原理,總結沉澱一下吧。java
Tomcat jsp熱部署的實現原理大致是這樣的,每一個JSP頁面從上次訪問到下次訪問老是有默認幾秒的緩存時間的,也就說並非嚴格的即修改即生效,tocmat7默認是有4秒的緩存延遲的。緩存
這個默認的緩存延遲是在類EmbeddedServletOptions的private intmodificationTestInterval = 4;這個屬性定義的。tomcat
若是過了4秒緩存時間即失效,這個時候tomcat就會讀取jsp的modified時間戳和work目錄下編譯好的class文件的modified的時間戳做對比。jsp
若是相等則class文件沒有過時,則不會從新編譯jsp文件,若是過時了則從新將jsp編譯成java,並進一步編譯成class。同時調用JasperLoader來從新加載這個有jsp編譯好的class文件。下面具體分析一下這個過程:spa
大致的類通訊時序圖是這樣的:對象
其中上文說的時間戳的校驗邏輯主要封裝在JDTCompiler的isOutDated方法裏面,這個方法的主要源代碼以下:開發
其中第一個紅框就是涉及到的N秒緩存邏輯,若是緩存沒有失效,則不會從新加載,這個ctxt.getOptions()獲取到的實際上是EmbeddedServletOptions類,這個類默認定義的時間間隔是:部署
在實驗的時候我比較好奇就收到把這個值改成了40,果真jsp並無及時生效,而是過了40秒以後才生效。get
第二個紅框檢測的是獲取work目錄下的class文件的對象。io
第三個紅框就是比較class文件的時間戳和JSP文件的時間戳,若是不相等則從新編譯加載(上面時序圖的流程)。這個就是jsp的熱部署流程!