include指令和include動作都能實現將外部文件包含到JSP文件中的功能,名稱也很相似,非常容易混淆。include指令和include動作到底有什麼分別,哪一種方式會更好呢?
1.include指令
include可以在JSP頁面轉換成Servlet之前,將JSP程式碼插入其中。它的主要優點是功能強大,所包含的程式碼可以含有總體上影響主頁面的JSP構造,比如屬性、方法的定義和文件型別的設定。它的缺點是難於維護只要被包含的頁面發生更改,就得更改主頁面,這是因為主頁面不會自動地檢視被包含的頁面是否發生更改。
include指令的語法格式如下
2.include動作
jsp:include動作是在主頁面被請求時,將次級頁面的輸出包含進來。儘管被包含的頁面的輸出中不能含有JSP,但這些頁面可以是其他資源所產生的結果。伺服器按照正常的方式對指向被包含資源的URL進行解釋,因而這個URL可以是Servlet或JSP頁面。伺服器以通常的方式執行被包含的頁面,將產生的輸出放到主頁面中,這種方式與RequestDispatcher類的include方法一致。它的優點是在被包含的頁面發生更改時,無須對主頁面做出修改。它的缺點是所包含的是次級頁面的輸出,而非次級頁面的實際程式碼,所以在被包含的頁面中不能使用任何有可能在整體上影響主頁面的JSP構造。
jsp:include動作的完整語法如下
其中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動作都能實現將外部文件包含到JSP文件中的功能,名稱也很相似,非常容易混淆。include指令和include動作到底有什麼分別,哪一種方式會更好呢?
1.include指令
include可以在JSP頁面轉換成Servlet之前,將JSP程式碼插入其中。它的主要優點是功能強大,所包含的程式碼可以含有總體上影響主頁面的JSP構造,比如屬性、方法的定義和文件型別的設定。它的缺點是難於維護只要被包含的頁面發生更改,就得更改主頁面,這是因為主頁面不會自動地檢視被包含的頁面是否發生更改。
include指令的語法格式如下
2.include動作
jsp:include動作是在主頁面被請求時,將次級頁面的輸出包含進來。儘管被包含的頁面的輸出中不能含有JSP,但這些頁面可以是其他資源所產生的結果。伺服器按照正常的方式對指向被包含資源的URL進行解釋,因而這個URL可以是Servlet或JSP頁面。伺服器以通常的方式執行被包含的頁面,將產生的輸出放到主頁面中,這種方式與RequestDispatcher類的include方法一致。它的優點是在被包含的頁面發生更改時,無須對主頁面做出修改。它的缺點是所包含的是次級頁面的輸出,而非次級頁面的實際程式碼,所以在被包含的頁面中不能使用任何有可能在整體上影響主頁面的JSP構造。
jsp:include動作的完整語法如下
其中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程式碼,比如響應報送的設定和屬性方法的定義