1、include指令:
<%@include file="文件的絕對路徑或者相對路徑"%>
file屬性是必填的(絕對或相對路徑),但它不支持任何的表達式,也不允許通過掛參方式來傳遞參數。(即不能使用變量賦值,只能寫死)
2、include動作:
<jsp:include page="被包含文件的路徑" flush="true/false">
<jsp:param name="參數名稱" value="參數值"/>
</jsp:inclue>
page屬性是必填的(絕對或相對路徑),但它及支持表達式也可傳遞參數。flush屬性爲緩衝區滿時,清空緩衝區。
注:在兩種用法中,file和page屬性都被解釋爲一個相對的URI。如果它以斜槓開頭,那麼它就是一個環境相關的路徑。將根據賦給應用程序的URI的前綴進行解釋,如果它不是以斜槓開頭,那麼就是頁面相關的路徑,就根據引入這個文件的頁面所在的路徑進行解釋。
<%@ include file=”” %>
引入的頁面可以只包含靜態內容(例如HTML),也可以是一個普通的JSP頁面。主頁面和引入的頁面融和在一起(引入的頁面只是最爲普通的文本進行融合,並不對動態內容求值),融合後的完整頁面再被整體的轉換爲一個servlet,即是在翻譯階段執行(將JSP頁面轉換成servlet的階段)
<jsp:include page=”” />
這個指令是在請求處理階段而不是在翻譯階段執行的。該行爲並不是要引入指定頁面的實際內容,它將引入執行該引入頁面後所產生的應答,這意味着你可以指定任何能夠產生文本應答的web資源。JSP容器將通過一個內部的函數調用來調用指定的資源。因此,這些被引入的資源可以幫助處理原來的請求,所以這些資源可以訪問請求作用域內的所有對象,以及所有的請求參數。但是要注意,它不能訪問任何頁面作用域屬性,或是在主頁面中聲明的腳本變量。
<jsp:include>元素允許你包含動態文件和靜態,這兩種包含文件的結果是不同的。如果文件僅是靜態文件,那麼這種包含僅僅是把包含文件的內容加到jsp文件中去,而如果這個文件動態的,那麼這個被包含文件也會被JSP編譯器執行(這一切與asp相似)
你不能從文件名上判斷一個文件是動態的還是靜態的,比如aspcn.asp 就有可能只是包含一些信息而已,而不需要執行。<jsp:include>能夠同時處理這兩種文件,因此你就不需要包含時還要判斷此文件是動態的還是靜態的。
簡單的說法就是:
<%@ include file=””%>引入靜態頁面:直接把文件內容讀進來,不做任何處理。
<jsp:include page=””/>讀入一個jsp文件已經生成的內容,而不是jsp文件本身。
實例
【include1.jsp】
<%@ page language="java"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>靜態include範例</title>
</head>
<body>
<!--使用include編譯指定導入頁面-->
這是靜態include測試主頁面<br/>
<%@includefile="error.jsp"%>
</body>
</html>
【error.jsp】
<%@ page language="java"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>錯誤提示頁</title>
</head>
<body>
這是一個錯誤處理頁面<br/>
</body>
</html>
【結果】
windows下,找到tomcat安裝目錄下的work文件夾,進入Catalina文件夾下的localhost文件夾,找到當前項目所在的文件夾,找到org目錄,進入其下的apache目錄下的jsp文件夾,即可看到一個include1_jsp.java文件,這就是該include1.jsp對應生成的servlet類。(實在不好找就直接搜索嘛)
打開.java文件查看:
從方框中即可看出靜態導入是:包含頁面在編譯時將完全包含被包含頁面的代碼。需要指出的是,靜態導入還會將被包含頁面的編譯指令也包含進來,如果兩個頁面的編譯指令有衝突,那麼頁面就會出錯。也可以這麼理解:它是純粹的把部分代碼寫到了另一頁面(或者說是共享),而那另一頁面中不能有相同的變量名,但可以借用主頁面的內容。
【include1.jsp】
<%@ page language="java"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>動態include範例</title>
</head>
<body>
這是動態include測試主頁面<br/>
<jsp:includepage="error.jsp" />
</body>
</html>
【結果】
打開include1_jsp.java:
打開error_jsp.java:
由上圖可看出,動態導入只是使用了一個include方法來插入目標頁面的內容,而不是將目標頁面完全融入到本頁面中。
所以,我們在讀include1.jsp這個頁面的時候,讀到<%@ include file="error.jsp"%>的時候,是將error.jsp中內容複製到include1.jsp這個頁面成爲include1.jsp的一部分在執行;
而在讀到<jsp:includepage="error.jsp"/>的時候,則是轉到error.jsp去執行,error執行完後將結果返回,這個過程就好像是java中的方法調用。
總結
<%@includefile="/public/head.jsp" %>
這個是靜態包含。先合併,再翻譯爲servlet。一般用在開發一個頁面(jsp,html),頭部頁面爲公共頁面,其他頁面引入頭部頁面。
<jsp:includepage="/public/head.jsp>
這個是動態包含。先編譯,再合併。包含頁面與被包含頁面各自翻譯、編譯,再在運行時候合併在一起顯示。
- 靜態導入是將被導入頁面的代碼完全融入,兩個頁面融合成一個整體Servlet;而動態導入則在Servlet中使用include方法來引入被導入頁面的內容。
- 靜態導入時被導入頁面的編譯指令會起作用;而動態導入時被導入頁面的編譯指令則失去作用,只是插入被導入頁面的body內容。
- 動態導入還可以增加額外的參數。
部分參考:
http://blog.csdn.net/panyongcsd/article/details/38235713
http://www.cnblogs.com/sharpest/p/6117629.html
http://blog.csdn.net/xumingjie1658/article/details/8793591