include指令用於在JSP頁面靜態的包含一個文件,該文件可以是JSP頁面、HTML頁面、文本文件或者一段java代碼。使用include指令的JSP頁面在轉換時,JSP容器會在其中插入所包含文件的文本或代碼。
include指令語法格式:
<%@ include file="relativeURL"%>
XML格式的include指令格式:
<jsp:directive.include file="relativeURL">
其中file屬性為相對於當前JSP文件的URL。
例:
welcome.jsp文件
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head><title>welcome</title></head>
<body>
the now time is:
<%@ include file="data.jsp"%>
</body>
</html>
data.jsp
<%
out.println(new java.util.Date().toLocaleString());
%>
注意:在被包含的文件中最好不要使用<html>/</html><body></body>等標簽,因為這會影響到原JSP文件中同樣的標簽,有時會導致錯誤。
另外,因為原文件和被包含文件可以互相訪問彼此定義的變量和方法,所以在包含文件時要格外小心,避免在被包含文件中定義同名的變量和方法,從而導致的轉換出錯。或者修改了另外文件中變量的值而導致的錯誤。
<jsp:include>動作標識
這個動作元素用於在當前頁面中包含靜態和動態的資源,一旦被包含的頁面執行完畢,請求處理將在調用頁面中繼續進行。被包含的頁面不能改變響應的狀態代碼或者設置報頭,這防止了對類似setCookie()這樣的方法的調用,任何對這些方法的調用都將被忽略。這個約束和在javax.servlet.Request.Dispatcher類的include()方法上所施加的約束是一樣的。
<jsp:include>動作的語法:
<jsp:include page="url" flush="true/false">
或者
<jsp:include page="url" flush="true/false">
{<jsp:param...../>}
</jsp:include>
<jsp:include>有兩個屬性:page和flush
page:指定被包含資源的相對路徑,該路徑是相對於當前JSP頁面的URL
flush:該屬性是可選的,如為true,則表示當頁面輸出使用了緩沖區,那么在進行包含工作之前,先刷新緩沖區。如設置為false,則不會刷新緩沖區。默認是false。
<jsp:include>動作元素可以在他的內容中包含一個或者多個<jsp:param>元素,為包含的頁面提供參數信息。被包含的頁面可以訪問request對象,該對象包含了原始的參數和使用<jsp:param>元素指定的新參數,如果參數的名稱相同,則原來的值不變,新的值其優先級比已經存在的值要高。
例如:請求對象中有一個參數為param=value1,然后在<jsp:param>元素指定了一個參數param=value2,在被包含的頁面中,接收到的參數為param=value2,value1,調用javax.servlet.ServletRequest接口中的getParameter()方法將返回value2,當然可以使用getParameterValues()返回指定參數的所有值。
| 語法 | 相對路徑 | 發生時間 | 包含對象 | 描述 |
| <%@ include file="url"%> | 相對於當前文件 | 轉換期間 | 靜態 | 包含的內容被JSP容器分析 |
| <jsp:include page="url"> | 相對於當前頁面 | 請求處理期間 | 靜態和動態 | 包含的內容不進行分析,但在相應的位置被包含 |
注意:表1-1中include指令包含的對象為靜態,並不是指include指令只能包含像HTML這樣的靜態頁面,include指令也可以包含JSP頁面。所謂靜態和動態指的是:include指令將JSP頁面作為靜態對象,將頁面的內容(文本或代碼)在include指令的位置處包含進來,這個過程發生在JSP頁面的轉換期間。而<jsp:include>動作吧包含的JSP頁面作為動態對象,在請求處理期間,發送請求給該對象,然后在當前頁面對請求的響應中包含該對象對請求處理的結果。這個過程發生在執行階段(即請求處理階段)。
當采用include指令包含資源時,相對路徑的解析在轉換期間發生(相對於當前文件的路徑來找到資源),資源的內容(文本或者代碼)在include指令的位置被包含進來,成為一個整體,被轉換為Servlet源文件。當采用<jsp:include >動作包含資源時,相對路徑的解析在請求處理階段,(相對於當前頁面來找到資源),當前頁面和被包含的資源是兩個獨立的個體,當前頁面將請求發送給被包含的資源,被包含的資源對請求處理的結果將作為當前頁面對請求響應的一部分發送給客戶端。
為了更好的理解include指令和<jsp:include>動作包含資源的相對路徑,弄清楚相對於當前文件和相對於當前頁面的區別,給出了表1-2,在這個例子中用到四個文件:
a.jsp c.jsp abc/b.jsp abc/c.jsp
| a.jsp | abc/b.jsp | 結果 |
| <%@ include file="abc/b.jsp"%> | <%@ include file="c.jsp"%> | abc/c.jsp |
| <jsp:include page="abc/b.jsp"> | <jsp:include page="c.jsp"> | abc/c.jsp |
| <jsp:include page="abc/b.jsp"> | <%@ include file="c.jsp"%> | abc/c.jsp |
| <%@ include file="abc/b.jsp"%> | <jsp:include page="c.jsp"> | c.jsp |
