今天在修改專案乙個jsp檔案時,突然想到tomat是怎麼實現動態實時載入jsp編譯後的class類的?
具體原理我將單獨總結一下,這裡簡單實現了動態載入類
1.定義服務類
publicclass
servlet
}
2.定義服務執行緒
publicclass servicethread extends
thread
catch
(exception e)
}}
3.自定義classloader
publicclass myclassloader extends
classloader}}
catch
(exception e)
//必需的步驟2:如果上面沒有成功
//我們嘗試用預設的classloader裝入它
if (clasz == null
) clasz =findsystemclass(name);
//if (resolve && clasz != null
) resolveclass(clasz);
//把類返回給呼叫者
return
clasz;
} catch
(exception ie)
}}
4.實現檔案監聽類
publicclass ccfilelistener implements
filealterationlistener
@override
public
void
ondirectorycreate(file directory)
@override
public
void
ondirectorychange(file directory)
@override
public
void
ondirectorydelete(file directory)
@override
public
void
onfilecreate(file file)
@override
public
void
onfilechange(file file)
private
void
dyncloadclass(string classname)
}@override
public
void
onfiledelete(file file)
@override
public
void
onstop(filealterationobserver observer)
}
publicclass
ccfilemonitor
public
void
monitor(string path, filealterationlistener listener)
public
void stop() throws
exception
public
void start() throws
exception
public
static
void main(string args) throws
exception
t.setcontextclassloader(classloader);
t.start();}}
}
public static hashmapclamap = new hashmap();在監聽到檔案改變後,依據類名重new乙個類載入器,用於載入類。
classloader classloader = ccfilelistener.clamap.get("servlet.class");
if(classloader==null)
首先獲取類名對應的載入器,如果沒有使用預設的載入器
classloader classloader = this.getcontextclassloader();class clazz = classloader.loadclass("servlet");
method service = clazz.getmethod("service", null);
關於tomcat載入jsp的隨筆
交代一下背景 某天晚上部署公升級生產伺服器時,把所有頁面全替換了 html jsp 替換完重啟時,一切正常,開啟登入頁,一切正常,不正常的是在進入首頁時,突然出現了404問題,頁面報錯jsp路徑找不到,再次重新整理頁面時又可以正確請求到該頁面,很匪夷所思,當時的排查思路,可以訪問到登入頁,說明服務是...
tomcat解析jsp錯誤
1 tomcat簡介 tomcat是一款解析jsp動態網頁指令碼的應用容器。tomcat也可以作為web伺服器使用,但是其處理靜態網頁檔案支援性不好,不如apache和nginx要高效。所以一般apache tomcat apache處理靜態網頁伺服器,tomcat處理動態解析jsp nginx t...
tomcat啟動載入
listener的初始化最早,filter次之。他倆的初始化都是在容器啟動完成之前初始化的。servlet沒有初始化,原因是沒有匹配的請求進來。如果想要servlet自動初始化,需要在指定的servlet中配置引數,沒有此標籤,預設啟動時servlet不進行初始化。初始化的順序跟listener f...