include指令和include動作的區別是什麼?

    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指令

jsp:include動作

語法格式

<%@ include file=”..”%>

<jsp:include page=”..”>

發生作用的時間

頁面轉換期間

請求期間

包含的內容

文件的實際內容

頁面的輸出

轉換成的Servlet

主頁面和包含頁面轉換爲一個Servlet

主頁面和包含頁面轉換爲獨立的Servlet

影響主頁面

可以

不可以

 

include指令

jsp:include動作

發生更改時是否需要顯式更改主頁面

需要

不需要

編譯時間

較慢-資源必須被解析

較快

執行時間

稍快

較慢-每次資源必須被解析

靈活性

較差-頁面名稱固定

更好-頁面可以動態指定


   瞭解到jsp:include動作和include指令各自的功能和區別,在使用時,就可以通過考慮各方面的因素,來決定使用哪一種方式。儘管各自都有一定的優缺點,在實際使用中,還是應優先考慮使用jsp:include動作,這是因爲它在代碼維護上的優勢遠勝過其在功能上的不足。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章