學習Tomcat動態載入JSP的Class類

2022-01-31 19:50:10 字數 2400 閱讀 1611

今天在修改專案乙個jsp檔案時,突然想到tomat是怎麼實現動態實時載入jsp編譯後的class類的?

具體原理我將單獨總結一下,這裡簡單實現了動態載入類

1.定義服務類

public

class

servlet

}

2.定義服務執行緒

public

class servicethread extends

thread

catch

(exception e)

}}

3.自定義classloader

public

class 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.實現檔案監聽類

public

class 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)

}

public

class

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...