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文件會報錯,報找不到文件異常。