include指令和include動(dòng)作都能實(shí)現(xiàn)將外部文檔包含到JSP文檔中的功能,名稱也很相似,非常容易混淆。include指令和include動(dòng)作到底有什么分別,哪一種方式會(huì)更好呢?
1.include指令
    include可以在JSP頁面轉(zhuǎn)換成Servlet之前,將JSP代碼插入其中。它的主要優(yōu)點(diǎn)是功能強(qiáng)大,所包含的代碼可以含有總體上影響主頁面的JSP構(gòu)造,比如屬性、方法的定義和文檔類型的設(shè)定。它的缺點(diǎn)是難于維護(hù)只要被包含的頁面發(fā)生更改,就得更改主頁面,這是因?yàn)橹黜撁娌粫?huì)自動(dòng)地查看被包含的頁面是否發(fā)生更改。
include指令的語法格式如下
    <%@ include file="Relative Url"%>

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

 

include指令

jsp:include動(dòng)作

語法格式

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

<jsp:include page=”..”>

發(fā)生作用的時(shí)間

頁面轉(zhuǎn)換期間

請求期間

包含的內(nèi)容

文件的實(shí)際內(nèi)容

頁面的輸出

轉(zhuǎn)換成的Servlet

主頁面和包含頁面轉(zhuǎn)換為一個(gè)Servlet

主頁面和包含頁面轉(zhuǎn)換為獨(dú)立的Servlet

影響主頁面

可以

不可以

 

include指令

jsp:include動(dòng)作

發(fā)生更改時(shí)是否需要顯式更改主頁面

需要

不需要

編譯時(shí)間

較慢-資源必須被解析

較快

執(zhí)行時(shí)間

稍快

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

靈活性

較差-頁面名稱固定

更好-頁面可以動(dòng)態(tài)指定


   了解到j(luò)sp:include動(dòng)作和include指令各自的功能和區(qū)別,在使用時(shí),就可以通過考慮各方面的因素,來決定使用哪一種方式。盡管各自都有一定的優(yōu)缺點(diǎn),在實(shí)際使用中,還是應(yīng)優(yōu)先考慮使用jsp:include動(dòng)作,這是因?yàn)樗诖a維護(hù)上的優(yōu)勢遠(yuǎn)勝過其在功能上的不足。