1. 程式人生 > >include指令和include動作的區別

include指令和include動作的區別

響應 而且 https 屬性方法 clu 目錄 轉換 jce 指向

include指令和include動作都能實現將外部文檔包含到JSP文檔中的功能,名稱也很相似,非常容易混淆。include指令和include動作到底有什麽分別,哪一種方式會更好呢?
1.include指令
include可以在JSP頁面轉換成Servlet之前,將JSP代碼插入其中。它的主要優點是功能強大,所包含的代碼可以含有總體上影響主頁面的JSP構造,比如屬性、方法的定義和文檔類型的設定。它的缺點是難於維護只要被包含的頁面發生更改,就得更改主頁面,這是因為主頁面不會自動地查看被包含的頁面是否發生更改。
include指令的語法格式如下
<%@ include file="Relative Url"%>

2.include動作
jsp:include動作是在主頁面被請求時,將次級頁面的輸出包含進來。盡管被包含的頁面的輸出中不能含有JSP,但這些頁面可以是其他資源所產生的結果。服務器按照正常的方式對指向被包含資源的URL進行解釋,因而這個URL可以是Servlet或JSP頁面。服務器以通常的方式運行被包含的頁面,將產生的輸出放到主頁面中,這種方式與RequestDispatcher類的include方法一致。它的優點是在被包含的頁面發生更改時,無須對主頁面做出修改。它的缺點是所包含的是次級頁面的輸出,而非次級頁面的實際代碼,所以在被包含的頁面中不能使用任何有可能在整體上影響主頁面的JSP構造。
jsp:include動作的完整語法如下
<jsp:include page="Relative path to resource" flush="true">
其中jsp:include之間不能有空格,page屬性指定被包含的頁面,這個屬性是必需的,是指向某種資源的相對URL。如果這個相對URL不是以/開頭,則將其解釋為相對於主頁面的路徑;如果是以/開頭,是這個URL被解釋為相對於當前WEB應用的根目錄,而不是服務器的根目錄,這是因為該URL是由服務器來解釋的,不是由用戶的瀏覽器來解釋的。像下面這行代碼,是由用戶的瀏覽器進行解釋的,因此會按照相對於服務器的根目錄進行解釋。
flush屬性是一個可選的次級屬性,默認值為false,它指定在將頁面包含進來之前是否應該清空主頁面的輸出流。
註意:在JSP1.1中,flush是必需的屬性,而且聚會只能是true。
3.兩者的區別和比較
jsp:include動作和include指令之間的根本性的不同在於它們被調用的時間。jsp:include動作在請求期間被激活,而include指令在頁面轉換期間被激活。
兩者之間的差異決定著它們在使用上的區別。使用include指令的頁面要比使用jsp:include動作的頁面難於維護。前面已經說過,使用JSP指令,如果包含的JSP頁面發生變化,那麽用到這個頁面的所有頁面都需要手動更新。在JSP服務器的相關規範中並沒要求能夠檢測出包含的文件什麽時候發生改變,實際上大多數服務器頁都有去實現這種機制。這樣就會導致十分嚴重的維護問題,需要記住所有包含某一個頁面的其他頁面,或者重新編譯所有的頁面,以使更改能夠生效。在這點上,jsp:include就體現出了十分巨大的優勢,它在每次請求時重新把資源包含進來。在實現文件包含上,應該盡可能地使用jsp:include動作。
jsp:include動作直比於include指令在維護上有著明顯優勢,而include指令仍然能夠得以存在,自然在其他方面有特殊的優勢。這個優勢就是include指令的功能更強大,執行速度也稍快。include指令允許所包含的文件中含有影響主頁面的JSP代碼,比如響應報送的設置和屬性方法的定義

include指令和include動作的區別