事出做項目時一個jsp頁面修改后一直沒有讀出來,后來仔細研究了下tomcat才發現
當請求jsp頁面時,Tomcat會分派給JspServlet來處理,在jspServlet的方法 service()中有一句
boolean precompile = preCompile(request);
它會判斷你請求jsp頁面時有沒有帶?jsp_precompile查詢字符串,如果帶了就會重新編譯
然后再由
serviceJspFile(request, response, jspUri, null, precompile)進一步判斷是否要進行編譯jsp文件,下面是JspServletWraper service方法
1 if (options.getDevelopment() || firstTime ) {
2 synchronized (this) {
3 if (firstTime) {
4 firstTime = false;
5 }
6 // The following sets reload to true, if necessary
7 ctxt.compile();
8 }
9 }
10
關鍵就在Compiler的isOutDated(boolean checkClass) 的判斷上 。
判斷標準是,如果 jsp最后修改時間大于目標文件的最后修改時間要重新編譯。還有一種情況就是即使jsp的最后修改時間晚于目標文件的最后修改時間,但只要jsp中用了
include指令包含的某個文件的最后修改時間早于對應目標文件的修改時間的話,也是需要重新編譯主jsp文件的