與<%@include file>

1、include指令:

<%@include file="文件的絕對路徑或者相對路徑"%>

file屬性是必填的(絕對或相對路徑),但它不支持任何的表達式,也不允許通過掛參方式來傳遞參數。(即不能使用變量賦值,只能寫死)

 

2、include動作

<jsp:include page="被包含文件的路徑" flush="true/false">

   <jsp:param name="參數名稱" value="參數值"/>

</jsp:inclue>

page屬性是必填的(絕對或相對路徑),但它及支持表達式也可傳遞參數。flush屬性爲緩衝區滿時,清空緩衝區。

 

注:在兩種用法中filepage屬性都被解釋爲一個相對的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

 

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