include指令
CreateTime--2017年8月10日08:40:25
Author:Marydon
1.為什么要使用?
使用include指令可以方便的把在多個頁面中要重復顯示的內容抽取出來,大大的減少代碼的重復量,方便我們對重復內容的維護
include指令分為:靜態include指令和動態include指令
2.使用靜態include指令引入頁面
說明:
在JSP中插入一個或多個包含文件或代碼的文件(jsp,html,inc,txt),把文件插入后與原來的JSP文件合並成一個新的JSP頁面
語法:
<%@ include file="從頁面文件地址" %>
解說:
該指令只有一個屬性:file,指定被包含的文件地址,一般使用相對路徑,並且不支持任何表達式(小腳本、EL表達式)
舉例:
<%@include file="../../common/patient_baseInfo.jsp"%>
注意:
1.1 當從頁面的內容發生變化時,主頁面和從頁面(所有頁面)都會被重新編譯,即他們是一個整體;
反之,主頁面內容發生更改(手動修改jsp頁面而不是通過js控制改變頁面內容)時,所有頁面也都會被重新編譯,即牽一發而動全身,
從這個角度而言,跟主頁面和從頁面的內容在同一頁面上沒有不同;
1.2 主頁面和從頁面上聲明的Java變量或方法必須具有唯一性;
jsp會被轉化成Java文件,使用靜態include指令,多個jsp(從頁面)會先合並到主jsp頁面上,然后再轉換成Java文件,
如果合並后的頁面上有2個及以上相同的變量名或完全一樣的方法,這種錯誤如果在編輯時沒有報錯,但在將jsp文件轉化成Java文件時,仍會報錯。
1.3 這種方式在引入從頁面時,不能夠傳參數給從頁面;
3.使用動態include指令引入頁面
說明:
在JSP中引用一個或多個包含文件或代碼的文件(jsp,html,inc,txt),從頁面內容和主頁面仍然具有很強的獨立性
語法:
a.不傳參數
<jsp:include page="<%=request.getParameter("path") %>|path|${param.path }" flush="true|false" />
b.傳遞參數
<jsp:include page="<%=request.getParameter("path") %>|path|${param.path }" flush="true|false">
<jsp:param value="參數內容" name="參數名稱"/>
...可以向包含頁面傳遞多個參數
</jsp:include>
解說:
a.page屬性的值可以是死值(具體頁面),也可以是小腳本、EL表達式(動態頁面);
b.flush屬性表示設置是否在緩沖區滿了就將內容輸出。可選值有true和false,默認值為true。
舉例:
<!-- 引入患者醫囑信息頁面並傳參 --> <jsp:include page="../../common/patient_yzInfo.jsp"> <jsp:param value="zhuYuan" name="treatmentType"/> </jsp:include>
注意:
2.1 當主頁面或從頁面內容發生變化時,其他頁面不需要重新編譯;
使用動態include指令,主頁面和被引入的從頁面都會被獨立編譯,編譯成Java文件后,當主頁所在的class文件被一行行執行遇到該標識時,
程序會將請求轉發到被包含的頁面,並將執行結果輸出到瀏覽器中,然后返回主頁面繼續執行后面的代碼,相當於東拼西湊而形成的頁面
2.2 主頁面和從頁面上聲明的Java變量或方法可以一樣;
由於每個文件是單獨編譯的,所以在被包含文件和包含文件中重名的變量和方法是不相沖突的。
2.3 這種方式在引入從頁面時,可以向從頁面傳遞一個或多個參數。
主頁向從其中一個頁面傳遞的參數,只有該從頁面能獲取到該參數,即:從頁面之間的參數不共享
4.圖例
4.1 主頁面里分別用了兩種不同的方式引入對應的頁面
使用動態include指令引入patient_baseInfo.jsp
使用靜態include指令引入patient_bcInfo.jsp
common目錄中包含這兩個文件
3.2 訪問主頁面時,產生的編譯文件
使用動態include指令,頁面編譯結果:
使用靜態include指令,頁面編譯結果:
5.其他注意事項
不管是一開始就合並成一個頁面的還是最后才拼裝成的頁面,就最終結果而言,它們都在同一個頁面上(即主頁面),所以:
5.1 頁面的id要保持唯一性,當主頁面與從頁面分離時,容易忽略這一點;
5.2 盡量不要在從頁面設置隱藏域,不便於發現,能提取到主頁面的就放到主頁面,便於維護;
5.3 由於一個頁面對應js只能使用一個window.onload=function(){}函數,所以強制要求,
主頁面的js文件使用window.onload=function(){}函數,其他從頁面的js文件使用$(function(){})
5.4 從頁面想要引用的js文件在哪個地方聲明引用合適?
推薦位置:從頁面想要引用的js文件,放到主頁面來引用,放到最后一個include下面
舉例:
如果從頁面間共用一個js文件,顯然,在每個從頁面上引用一次不是明智之舉,該js文件會被加在多次;
如果從頁面引用的js文件各不相同,從頁面上可以直接引用js文件;
如果從頁面想要在主頁面加載完畢后執行一些操作,要聲明引用的位置,必須是在主頁面的body閉合標簽上面;
。。。
6.常被抽出來的代碼
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <fmt:requestEncoding value="utf-8" /> <script type="text/javascript">var baseUrl="<%=request.getContextPath()%>"</script>
UpdateTime--2018年4月14日16:34:59
7.引用路徑問題
在eclipse開發工具下,如果引入的文件路徑"../"不小心多加了幾個,沒有問題,頁面不會報錯,
而且在Tomcat下發布可以正常訪問到該頁面,但是在webLogic下就可能會出現問題了:找不到該頁面
原因:
在Tomcat下,項目的根路徑名稱為twrs,即項目該項目外面沒有父文件夾,所以就算你多加幾個../,依然能夠找到該文件;
但是,在webLogic下發布程序時,twrs的上級目錄是data,所以這個時候就去data或data的上級目錄下去找這個文件,當然找不到;
所以,馬虎不得,該是幾個"../",就寫幾個。