jsp中的include有兩種形式,分別是:
<%@ include file=""%>
<jsp:include page="" flush="true" />
前者是指令元素,后者是行為元素.
<%@ include file=""%>,jsp的include指令元素讀入指定頁面的內容,並把這些內容融合到一起(這個過程在翻譯階段:也就是jsp被轉化成servlet的階段進行的),也就是說,jsp頁面不能原封不動地被傳送給瀏覽器,所有的jsp元素都必須首先由服務器進行處理.這是通過將jsp頁面轉達化成servlet,然后執行這個servlet來完成的.服務器需要一個jsp容器來處理jsp頁面.jsp容器通常以servlet的形式來實現,這個servlet經過配置,可以處理對jsp頁面的所有請求.
Jsp容器負責將jsp頁面轉化成servlet,並編譯這個servlet.這兩步就構成了翻譯階段.
由此我們就會知道:jsp頁面是把include指令元素所指定的頁面的實際內容(也就是代碼段)加入到引入它的jsp頁面中,合成一個文件后被jsp容器將它轉化成servlet.可以看到這時會產生一個臨時class文件和一個java文件.
<jsp:include page="" flush="true" />,是在jsp頁面運行時才處理文件,被處理的文件在邏輯和語法上獨立於當前JSP頁面.會編譯成不同的java文件
下面用代碼測試動、靜態include的區別:
_01_include_01.jsp
<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8"> <title>jsp:include</title> </head> <body bgcolor="white"> <font> <%@ include file="_02_date.jsp"%> <%= request + "--1--" + "<br>"%> </font> </body> </html>
_01_include_02.jsp
<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8"> <title>jsp:include</title> </head> <body bgcolor="white"> <font> <%/* * 注意:jsp標簽需要自己關閉,不要忘了關閉的橫線 * jsp:include 是動態加載,在jsp編譯的時候,加載頁面和被加載頁面會被解析兩個java,Servlet文件 * javac編譯器會編譯兩次,生成兩個class文件 * 然后再jvm運行的過程中,這個時候包含文件才去調用被包含的class文件 * 這就是動態包含 * */%> <jsp:include page="_02_date.jsp" flush="true" /> <%/* * 上面例子可以看出,因為生成是兩個不同的Servlet文件-->不同的class-->所以每個Servlet都有自己的request對象,不是同一個.但是第一個是生成一個Servlet所以是同一個 */%> <%/* * 不同的頁面,不同的request之間可以傳值 * 傳值別忘了寫flush,這里傳值也是IO流,需要flush * 然后把值傳遞到第二個頁面輸出 */%> <jsp:include page="_02_date.jsp?username='123'" flush="true" /> </font> </body> </html>
_02_date.jsp
<%@ page import="java.util.*"%> <%= (new Date()).toLocaleString() + "<br />"%> <%= request + "--2--" + "<br />"%> <%= request.getParameter("username") + "<br />"%>
運行"_01_include_01"的結果:
從結果可以看出兩個request對象是同一個,同一個對象之間是不能夠傳參的,再看看編譯的java、class文件
可以看到這里只有一個java和一個class文件.
再運行"_01_include_02",
從結果可也看出兩個request對象顯然不是同一個,既然不是同一個,那肯定可以傳參了,再看看編譯的java、class文件
可以看到有兩個java文件和對應的class文件.
為什么呢?
因為靜態include的結果是把其他jsp引入當前jsp,兩者合為一體
動態include的結構是兩者獨立,直到輸出時才合並( 看看jsp生成的java文件就可以知道了)
下面兩幅圖,是動態和靜態include的區別的圖解
靜態include圖解:
動態include圖解: