1. 程式人生 > >Tomcat 中的 JSP: 自動編譯

Tomcat 中的 JSP: 自動編譯

最近遇到一個問題: 環境中的JSP頁面在被修改以後沒有在瀏覽器中表現出來, 呈現出的仍然是舊版的樣子。

這個事情比較奇怪,但凡有初級web 開發經驗的人都瞭解,在web容器是tomcat的開發環境中修改jsp頁面後無需重啟tomcat,僅僅重新整理就可以在瀏覽器中看到效果,這已經是一個人盡皆知的事情了,那這個么蛾子是怎麼飛出來的?

本著生活問度娘,技術求谷哥的精神,遂google之,原理還是挺有意思的:

1. JSP怎麼工作

這個不多說了,跟我們問題關鍵的一點就是JSP使用時會被容器編譯成java的編譯後文件:.class檔案,而後使用的都是這個.class檔案。這個檔案的路徑在tomcat中是:

%catalina_home%\work\Catalina\localhost\<context-name>\org... 

這裡就有一個問題了,既然JSP需要被編譯成.class檔案才能使用(區別於解釋性的指令碼語言),那麼要實現“僅僅重新整理就能生效”的目的必然要求有人去編譯它,這個忙人是誰呢:tomcat ?

2. Tomcat 對JSP的預編譯機制

確實是Tomcat, 它的基本預編譯規則是:當接到一個對某JSP 頁面的請求時,檢查該JSP頁面與之前由該JSP頁面編譯出的.class檔案的時間戳,如果JSP頁面較新,那麼重新編譯,並覆蓋老的.class檔案,否則仍使用之前的.class檔案,並不進行再次編譯。

事情說得這,遇到的問題已經找到原因了,是時間戳引發的問題。

本著除惡務盡的原則,繼續研究了下,發現:

a. “僅僅重新整理就能生效” 只有在tomcat 的development 模式下才能生效,在生產模式下是無法生效的。Tomcat預設使用development模式,可以再檔案:Tomcat\conf\web.xml中把developmen t的值改為false來切換到生產模式。

b. 生產模式不檢查JSP頁面的時間戳,來進行recompile,所以JSP檔案被修改後只有通過重啟tomcat才能生效。這樣做的原因是每次去check時間戳會耗費較多的效能,所以建議在產品出廠時都設定為product模式。

c. 在生產模式下可以通過配置一個引數:checkInterval 來驅使tomcat 沒過一段時間去check JSP頁面的時間戳進行recompile, 雖有一定的延遲性但是也能達到“僅僅重新整理就能生效”, 但如果這個interval比較小,那仍對效能有拖累。這種情形有個特點有別於之前: 這種recompile被稱之為:“background compile”, 意識是說並不阻塞請求,只是觸發recompile,在recompile完成之前仍然使用舊版本,在完成之後才使用新版本

d. Development 模式中,對JSP頁面的check頻率也可以通過一個引數進行調節:modificationTestInterval。 比如說modificationTestInterval = 10s, 即是說在對某個JSP頁面進行時間戳檢查後的10s內,即便再有對該JSP頁面的請求也不進行時間戳檢查,當然也不會觸發recompile。如果modificationTestInterval = 0,那麼每次都會檢查時間戳。這個引數的預設值是4s。

e.  還有一種情形無法recompile: 一個JSP頁面作為子頁面被另外一個JSP頁面include, 如果子頁面發生了改變但是父頁面沒有,不會recompile(已經在tomcat7 中修改)

最後還有一個問題,自動編譯完成以後,tomcat是如何自動載入這些.class呢,好在這是另外一個問題了。

相關推薦

Tomcat JSP: 自動編譯

最近遇到一個問題: 環境中的JSP頁面在被修改以後沒有在瀏覽器中表現出來, 呈現出的仍然是舊版的樣子。 這個事情比較奇怪,但凡有初級web 開發經驗的人都瞭解,在web容器是tomcat的開發環境中修改jsp頁面後無需重啟tomcat,僅僅重新整理就可以在瀏覽器中看到效果,

IDEA+Tomcat熱部署自動編譯

好的 image mage ima spa color bubuko tom 分享   之前太傻瓜了,一直以為用了IDEA改了類或者js的時候全都要手動構建發布,其實不用,IDEA這麽好的工具怎麽可能不會自動編譯啊,下面說一下實現IDEA自動編譯的方法 一.首先是Tomca

Tomcat jsp 中文亂碼顯示處理解決方案

JSP 中文亂碼處理解決方案初學JSP,尤其是Tomcat環境,經常會因為中文漢字字符集設定問題導致中文亂碼,本文就這一問題提出解決方案,解決中文亂碼問題,供各位參考,我採用的方案是統一字符集至UTF-

web專案ideajsp編譯後的class與java檔案放在哪裡

摘要:idea的web專案不是直接將webapp放在tomcat容器中。而是將生成的webapp與tomcat按照idea的“技術”形成連線,這樣減少了很大的配置tomcat的時間,一次配置,一勞永逸。當webapp放置在tomcat容器中的時候,jsp生成

如何使jsp頁面在EBS自動編譯

閱讀前提 假設你對Oracle EBS中的OA Framework有所瞭解假設你對jsp有所瞭解 問題描述 如果我們想要將我們自己的jsp檔案上傳到EBS中並在EBS的容器內執行,通常情況下你需要如下幾部操作: 將你的jsp檔案通過FTP上傳至$OA_HTML下,為這個

eclipsejava Dynamatic web的創建過程(或者eclipsejsp的創建或eclipse開發環境(jdk,eclipse,tomcat)的測試)

alt 進行 lan .cn ges log image oct ips 1.啟動eclipse程序。 2.File-New->Dynamatic web project,如圖 3.右擊項目名-->new-->New jsp file---> 點

Spring boot自動編譯配置

fig 配置 plugins ips pat dev 能夠 導致 enc MAVEN自動編譯配置 熱部署功能 <dependency> <groupId>org.springframework.boot</groupId

tomcat設定http自動跳轉https

相關文章: 在CentOS 1804 中的 Tomcat 9 設定 SSL( https ) 加密 (多域名加密,阿里雲 SSL+ 騰訊雲 SSL) 在CentOS 1804 中設定 Apache Tomcat 9.0.12 開機自啟   server.xml設定

編譯Spring專案併發布到Tomcat

場景 由於一直在做maven、gradle忘了怎麼通過jar打war包併發布到tomcat內,做一哈筆記吧。。。。 步驟 一、在工程目錄下執行命令 user$ jar -cvf project-name.war 我的工程打包的是WebRoot

maven+tomcat如何自動編譯部署到伺服器

首先,這個資源在網上有很多,講的也很全,今天寫這篇文章主要是記錄今天在部署時候遇到的細節問題,希望能對大家有幫助。 先說下自動編譯的好處,總不可能每次開發都手動打包到伺服器,再上傳吧,也是因為最近專案原因,今天才設定這個熱部署。 使用maven+tomcat是自動編譯部署的

VS2015設定D3D12根簽名HLSL檔案自動編譯屬性時的注意事項

在DirectX12中,一個重要的HLSL高階語法物件就是根簽名物件,當前有兩種主要的方式來得到根簽名:一種是編寫一個HLSL程式碼檔案,然後編譯得到;另一種方式是在C++程式碼中填充D3D12_ROOT_SIGNATURE_DESC結構體後建立得到。 後一種

在webstorm配置sass的自動編譯,並且可以指定編譯後的css的目錄

本位藉助UndefinedCheng大神,本人只是搬運工,為了方便以後快速檢視 本文前提是電腦裡已經順利安裝了ruby,sass等之後,再進行webstorm中配置sass的watcher,以及改變watcher中的預設選項;如果以上都還沒有做,可以自行百度解決,

使用maven建立web工程並自動部署到Tomcat

建立maven web專案 1 2. 勾選的目的是跳過選擇archetype3. 專案以war包的形式4.5. 6. 7. 8. 9. 接下來是最最最重要的pom.xml 檔案了。(匯出tomcat外掛)<project xmlns="http://maven.apache.org/POM/4.0.0"

Eclipse使用NDK自動編譯C++程式碼

以引擎自帶的HelloCpp為例配置C++的的自動編譯。 在eclipse中匯入hellocpp工程。操作路徑:eclipse--file--import 工程匯入後,右擊工程--properties 取消CDT builder。 然後點選New新建一個我們自己的builder,選擇program。指

Java配置maven+jenkins+git(svn)+tomcat自動編譯和部署(持續整合)

目的 在開發中,需要經常頻繁的對測試伺服器進行部署,而且在多人協同中開發經常遇到的問題就是別人更新了他的程式碼,而你去更新你的程式碼時並沒有更新到別人的程式碼,導致測試環境的程式碼不是最新,當然這個問題也好解決,那就是每次更新的時候先獲取版本控制器上面的程式碼,然後更新

web專案釋出到tomcat編譯後沒有classes檔案的原因

通常專案編譯釋出到tomcat中後會在WEB-INF下生成classes檔案,這裡麵包含的是編譯後的Java原始碼檔案!那麼在什麼情況下編譯後classes檔案沒有出現在WEB-INF下呢? 在工作空間中每個專案裡都有一個.settings檔案,這個檔案下包含的是專案釋出編

vs在專案去掉預編譯頭,去掉自動生成的stdafx.h等檔案

以VS2012為例。 專案建好後去掉預編譯頭: 新建專案時按預設方式已經選擇了預編譯,在後期要如何取消或關閉預編譯呢? 專案---->屬性---->配置屬性---->C/C++---->預編譯頭---->建立/使用預編譯頭 選擇不使用預編譯頭,

Eclipse jsp html檔案編碼自動格式化變醜的問題

格式化完畢有多醜我就不說了,根據我的辦法能改善大部分佈局問題,具體如下: 1、點選 eclipse選單欄的 window選項卡,找到下拉 perferences 選項 , 在裡面快捷 “搜尋” 框裡面輸入 html ,參考紅色標識 2、找到左側檢視 web 下 editor

tomcat使用apr及性能調優

error jdk1 rec less ken install earch als head tomcat8使用apr及性能調優本次安裝的軟件包括:jdk1.7.0_79apache-tomcat-8.0.0-RC1.tar.gzapr-1.5.2.tar.gzapr-ic

MyeclipseJSP應該註意的問題

proto hand pan request ima jar 多選框 連接 註銷 1.出現destroying protocolhandler ajp-bio-8009的問題   主要是端口被占用,tomcat在Myeclipse之外被開啟,需要關閉外部的tomcat或者重