jsp頁面的動態include與靜態include原理

jsp包含寫法有兩種,一種靜態包含(include指令),一種動態包含(include標籤)

下面來說說這兩者的區別:

靜態包含:

寫法:<%@ include file="..."%>

靜態包含不能傳遞參數

動態包含:

寫法:<jsp:include page="..." />

或者:<jsp:include page="..."> </jsp:include>

動態包含可以傳遞參數

寫法:

<jsp:include page="...">
       <jsp:param value="1" name="type"/>
</jsp:include>

 

接下來是重點,分析他們的底層原理

靜態包含的本質:它的本質是文件的導入(不會對導入的文件進行編譯),它不管是什麼文件,.jsp,.txt,.json,.html,還是各種各樣的文件後綴都行。只要是文本文件就行,因爲它的本質是文件的導入。

查看tomcat 中jsp用了靜態包含的jsp servlet,jsp最終都會被編譯成servlet class文件。反編譯查看,被包含的界面原封不動的導入到被包含的jsp中。所以靜態包含就是普通的文件導入。

動態包含的本質:它的本質是先編譯包含的文件,然後再進行導入,而且文件只能是.jsp後綴,因爲是jsp標籤的動態包含,tomcat只識別jsp後綴的文件,其實再往底層分析,一個jsp就是一個servlet,動態包含,其實包含的是一個servlet,而可以傳參是,傳參給包含的servlet,所以動態包含相當於http請求調用了一次servlet,而這個包含的servlet就會接受參數,並且解析自己的頁面數據,最後response.write發送回被包含的jsp裏面,jsp會整合包含的servlet發送回的數據,然後再統一返回給前端。

思路擴展:所以,我們用動態包含的時候,不僅僅只能用.jsp文件,還可以用servlet接口,@Controller也可以(@Controller也是一個servlet接口),只要記得返回一個視圖對象給被包含的jsp頁面就可以了。

示例:

<jsp:include page="/foreground/content/list.do">
       <jsp:param value="1" name="type"/>
</jsp:include>

寫一個 Controller,RequestMapping("/foreground/content/list.do"),然後記得再方法裏返回一個視圖對象,有很多種寫法,示例一種,

ModelAndView a = new ModelAndView();

a.serViewName("/foreground/content/list.jsp");

這樣就實現了Controller代理 jsp界面,可以在jsp裏動態顯示數據。

 

總結:動態include可以包含.jsp(本質是servlet),servlet,繼承servlet的子類。靜態include可以包含無論什麼後綴都行,只要是文本文件就可以,而且靜態包含不能傳參數,包含的文件不進行編譯。

 

如果jsp文件靜態包含,去包含servlet的話,首先,jsp文件會去文件路徑找這個文件,因爲是一個接口,壓根就沒有這個文件,所以jsp文件會報錯,報找不到文件異常。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章