国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

jsp 自動(dòng)編譯機(jī)制詳細(xì)介紹

2019-11-19 18:44:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

 jsp 自動(dòng)編譯機(jī)制詳細(xì)介紹

總的來(lái)說(shuō),Jasper的自動(dòng)檢測(cè)實(shí)現(xiàn)的機(jī)制比較簡(jiǎn)單,依靠某后臺(tái)線程不斷檢測(cè)JSP文件與編譯后的class文件的最后修改時(shí)間是否相同,若相同則認(rèn)為沒有改動(dòng),但倘若不同則需要重新編譯。實(shí)際上由于在Tomcat部署的項(xiàng)目的JSP可能引入了其他頁(yè)面,或者引入了其他jar包,而且這些資源都可能是遠(yuǎn)程的資源,所以實(shí)際處理會(huì)比較復(fù)雜,同樣要遍歷檢測(cè)這些引入的不同資源是否做了修改。

 

上圖是一個(gè)形象的示意圖,我們知道Tomcat架構(gòu)中有四個(gè)級(jí)別的容器,Engine、Host、Context和Wrapper,而jsp編譯對(duì)應(yīng)在wrapper級(jí)別,所以通過(guò)StandardWrapper不斷執(zhí)行任務(wù)去調(diào)用jasper,而jasper則不斷檢測(cè)校驗(yàn)本地和遠(yuǎn)程的各種資源,一旦發(fā)現(xiàn)需要重新編譯則進(jìn)行重編譯。往下看看具體如何實(shí)現(xiàn)。

首先,需要一個(gè)后臺(tái)執(zhí)行線程,Tomcat中有專門的一條線程處理不同容器的background任務(wù),想在不同的容器中執(zhí)行某些后臺(tái)任務(wù)只需重寫backgroundProcess方法即可實(shí)現(xiàn),由于JspServlet對(duì)應(yīng)于Wrapper級(jí)別,所以要在StandardWrapper中重寫backgroundProcess,它會(huì)調(diào)用實(shí)現(xiàn)了PeriodicEventListener接口的Servlet,其中JspServlet就實(shí)現(xiàn)了PeriodicEventListener接口,此接口只有一個(gè)periodicEvent方法,具體的檢測(cè)邏輯在此方法中實(shí)現(xiàn)即可。

其次,檢測(cè)判斷重新編譯的根據(jù)是什么?重新編譯就是再次把jsp變成Java再變成class,而觸發(fā)這個(gè)動(dòng)作的條件就是當(dāng)我們修改了某個(gè)jsp文件后,或者某jsp文件引入的資源被修改后,都將觸發(fā)重新編譯動(dòng)作,所以最好的判斷依據(jù)就是某jsp或資源的最后修改時(shí)間lastmodified屬性,正常順序是jsp經(jīng)過(guò)編譯后生成class文件,把此class文件的lastmodified屬性設(shè)置成jsp文件的lastmodified,此時(shí)兩個(gè)文件的lastmodified屬性是相同的,當(dāng)我們改了jsp文件保存后,jsp的lastmodified屬性就被置為當(dāng)前時(shí)間,此時(shí)通過(guò)判斷兩個(gè)文件的lastmodified屬性決定是否重新編譯。重新編譯后jsp與class文件的lastmodified屬性再次被置為相同。對(duì)于引入的資源,內(nèi)存中維護(hù)了上次編譯時(shí)引入資源的lastmodified屬性,不斷獲取引入資源的lastmodified屬性并與內(nèi)存中對(duì)應(yīng)的lastmodified屬性進(jìn)行比較,同樣可以很容易判斷是否需要重新編譯。

最后,對(duì)于本地和遠(yuǎn)程資源分別如何檢測(cè)?對(duì)于本地資源來(lái)說(shuō),使用java.io.File類可以很方便的實(shí)現(xiàn)對(duì)某JSP文件或其他文件的lastmodified屬性讀取。對(duì)于遠(yuǎn)程資源,比如jar包,為了方便處理jar包含的屬性,使用java.NET.URL可以很方便操作,它包含了很多協(xié)議,例如常見的jar、file、ftp等協(xié)議,使用相當(dāng)方便,

URL includeUrl = new URL("jar:http://hostname/third.jar!/");URLConnection iuc = includeUrl.openConnection();long includeLastModified = ((JarURLConnection) iuc).getJarEntry().getTime();

只需三步即完成對(duì)遠(yuǎn)程jar包的讀取且取出最后修改時(shí)間。當(dāng)然URL還支持本地文件資源的讀取,所以它是很好的資源讀取抽象對(duì)象,Tomcat中對(duì)引入資源的管理都是使用URL作為操作對(duì)象。

本小節(jié)探討了Jasper自動(dòng)檢測(cè)機(jī)制的實(shí)現(xiàn),自動(dòng)檢測(cè)機(jī)制給我們的開發(fā)帶來(lái)了很好的體驗(yàn),我們不必自己修改了jsp后自己去執(zhí)行編譯操作,而是tomcat通過(guò)jasper幫我們定時(shí)檢測(cè)編譯操作。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 衢州市| 林州市| 巴楚县| 化州市| 顺平县| 汤阴县| 凌云县| 札达县| 阿拉善右旗| 拉萨市| 平凉市| 桦南县| 南通市| 晋江市| 江都市| 辽源市| 都江堰市| 庆云县| 揭西县| 西贡区| 鸡泽县| 合作市| 突泉县| 敖汉旗| 沂源县| 革吉县| 富阳市| 扎鲁特旗| 天镇县| 广水市| 九江市| 县级市| 武定县| 南安市| 疏勒县| 吴旗县| 福贡县| 峨边| 贵港市| 海伦市| 汶上县|