jsp中兩種include的區別【轉】

引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/css

              http://www.cnblogs.com/lazycoding/archive/2011/04/04/two_include.htmlhtml

JSP中兩種include的區別

 

首先說明這兩種都是什麼:java

<%@ include file=」relativeURI」%> 能夠叫做靜態include(靜態包含),是jsp指令中的一種,(JSP指令控制JSP編譯器如何去生成servlet(servlet是用Java編寫的服務器端程序。其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類別,通常狀況下,人們將Servlet理解爲後者。-維基百科)數據庫

<jsp:include page=」relativeURI」 flush=」true」 />叫做動態include(動態包含),是jsp動做的一種,(JSP動做是一系列能夠調用內建於網絡服務器中的功能的XML標籤)瀏覽器

區別:緩存

執行時間上:服務器

   <%@ include file=」relativeURI」%> 是在翻譯階段執行網絡

   <jsp:include page=」relativeURI」 flush=」true」 /> 在請求處理階段執行.jsp

引入內容的不一樣:編輯器

  <%@ include file=」relativeURI」%>引入靜態文本,在JSP頁面被轉化成servlet以前和它融和到一 起,.先包含,後編譯,不會檢查所含文件的變化,適用於包含靜態頁面,能夠理解爲純粹是把代碼寫在外面的一種共享方法,全部的變量都是能夠和include它的主文件

共享, 二者高度緊密結合,不能有變量同名的衝突.而頁面設置也能夠借用主文件的. 

 <jsp:include page=」relativeURI」 flush=」true」 />引入執行頁面或servlet所生成的應答文本. 被包含的文件先編譯,後包含進來,而後顯示

 


注意:

<%@ include file=""%>指令在編寫代碼的時候通常放在最頂部,主要附加的是被重用的代碼,這裏所說的附加是指把源代碼原封不動的附加過來,例如在jsp程序中使用這個指令的時候file裏面的值(即要導入的文件)不能帶多餘的標籤或是與當前jsp文件重複的東西。例如裏面不要包含<html><body>這樣的標籤,由於是把源代碼原封不動的附加過來,因此會與當前的jsp中的這樣的標籤重複致使出錯。  
  而應用<jsp:include page="" flush="" />標籤導入一個重用文件的時候,這個文件是通過編譯的,通俗點說就是附加這個要導入文件通過編譯後的效果,因此能夠含有與當前jsp程序中重複的內容,由於在附加過來以前就會被解析掉。

  另外在兩種用法中file和page屬性都被解釋爲一個相對的URI.若是它以斜槓開頭,那麼它就是一個環境相關的路徑.將根據賦給應用程序的URI的前綴進行解釋,若是它不是以斜槓開頭,那麼就是頁面相關的路徑,就根據引入這個文件的頁面所在的路徑進行解釋。檢查所含文件中的變化,適合用於包含動態頁面,而且能夠帶參數。它老是會檢查所含文件中的變化,適合用於包含動態頁面,而且能夠帶參數。

 

 

JSP 最佳實踐: 用 jsp:include 控制動態內容

用於構建動態網站的簡單 JSP 標記

本文是 Java Brett McLaughlin 繼第一篇 JSP 最佳實踐文章後的後續文章,在文中,做者向您演示瞭如何擴展 JSP 技術中用於動態內容的包含功能。瞭解靜態 include 僞指令和動態 jsp:include 元素之間的差別,搞清楚如何混合搭配這兩者以獲取最優性能。

Brett McLaughlin (brett@oreilly.com), 做家, O'Reilly and Associates

2003 年 7 月 06 日

  • +內容

在新的 JSP 最佳實踐系列的前一篇文章中,您瞭解瞭如何使用 JSP include 僞指令將諸如頁眉、頁腳和導航組件之類的靜態內容包含到 Web 頁面中。和服務器端包含同樣,JSP include 僞指令容許某個頁面從另外一個頁面提取內容或數據。清單 1 重溫了 include 僞指令。

清單 1. JSP include 僞指令
<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
      <title>newInstance.com</title>
      <meta http-equiv="Content-Type" 
        content="text/html; charset=iso-8859-1" />
      <link href="/styles/default.css" 
        rel="stylesheet" type="text/css" />
</head>
<body>
<%@ include file="header.jsp" %>
<%@ include file="navigation.jsp" %>
<%@ include file="bookshelf.jsp" %>
<%@ include file="/mt-blogs/index.jsp" %>
<%@ include file="footer.jsp" %>
</body>
</html>
]]>

您須要什麼

本系列中的全部最佳實踐都基於 JavaServer Pages 技術。要運行其中的任何最佳實踐,都須要在您的本地機器或測試服務器上安裝符合 JSP 技術的 Web 容器。您還須要使用文本編輯器或 IDE 來對 JSP 頁面編碼。

雖然 include 很是適於將靜態內容併入 Web 頁面,但對於動態內容卻不盡如人意。咱們在前一篇文章中在試圖從新裝入高速緩存文件時發現了這一問題。與大多數頁眉文件及頁腳文件不一樣,動態內容變化頻繁,必須時刻更新。咱們將首先扼要地重述一下 include 僞指令的侷限性,而後我將向您演示如何用 jsp:include 標記來擴展 JSP 的包含能力。

高速緩存問題

JSP include 僞指令的不足之處有一個是:它會致使 Web 瀏覽器高速緩存全部頁面。在處理諸如頁腳、版權聲明或一組靜態連接之類的靜態組件時,這是有意義的。這些文件不會改變,所以沒有理由讓 JSP 解釋器不斷地從新輪詢其中的數據。凡是可能的地方,都應該實現高速緩存,由於它改善了應用程序的性能。

JSP 測試和開發

在構建 Web 應用程序或網站時,可能須要大量更新頁眉、頁腳和導航連接。僅僅爲了看到對所包含文件所作的更改,而被迫不斷地關閉瀏覽器或清除其高速緩存,這多是件痛苦的事情。另外一方面,爲告終束開發週期,而不得不完全檢查一遍並修改數百個使用了 include 僞指令的頁面,這也是一件痛苦的事情。個人建議是,在測試期間禁用瀏覽器高速緩存。在大多數情形下,這樣作可以完全解決問題。也有極少數情形,這樣作並不奏效,這時能夠在瀏覽器或服務器上不斷地從新啓動 Web 容器來確保不進行高速緩存。

可是,有時侯,進行高速緩存會得不償失。若是提入的內容來自使用動態數據(如 Weblog 或數據庫驅動的 JSP 文件)的程序,甚至若是所包含的內容是常常變化的 HTML(如時間戳記),那麼每當裝入 Web 頁面時,都須要顯示這些文件或程序的最新版本。遺憾的是,JSPinclude 僞指令並不具有這一功能。在測試和開發週期(請參閱側欄「 JSP 測試和開發」)中,在瀏覽器中禁用高速緩存一般可以解決這一問題。可是,對於實際使用的應用程序而言,性能是任何設計決策過程當中的一項重要因素,禁用高速緩存並非一種可行的長遠之計。更好的解決方案是使用 jsp:include 標記。

 

jsp:include 標記

jsp:include 只不過是一個不一樣於 include 的僞指令而已。 jsp:include 的優勢在於:它 老是會檢查所含文件中的變化。過一下子咱們將研究這一新標記的工做方式。但首先看一下兩種 include 各自的代碼,以便可以看到兩者之間的異同。

清單 2 顯示了一個簡單頁面,它使用了原始的 JSP include 僞指令。

清單 2. JSP include 僞指令
<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
     <head>
      <title>JSP include element test</title>
     </head>
     <body>
      This content is statically in the main JSP file.<br />
      <%@ include file="included.html" %>
     </body>
</html>
]]>

清單 3 是同一個頁面,只不過這裏轉成使用 jsp:include 標記。

清單 3. 轉成使用 jsp:include
<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
     <head>
      <title>JSP include element test</title>
     </head>
     <body>
      This content is statically in the main JSP file.<br />
      <jsp:include page="included.html" flush="true" />
     </body>
</html>
]]>

您應該注意這兩種代碼類型之間的兩大區別。首先, jsp:include 元素不使用屬於 include 僞指令的 %@ 語法。實際上, jsp 前綴讓 JSP 編譯器知道:它應該尋找標準 JSP 標記集中的元素。其次,指定要包含的文件的屬性從 file 變成了 page 。若是願意,能夠本身測試一下新標記的結果。只需更改上一篇文章(請參閱 參考資料)中 included.html 文件的內容,而後從新裝入瀏覽器頁面,就會當即看到新內容。

flush 屬性

您可能已注意到 jsp:include 代碼示例中的 flush 屬性。顧名思義, flush 指示在讀入包含內容以前是否清空任何現有的緩衝區。JSP 1.1 中須要 flush 屬性,所以,若是代碼中不用它,會獲得一個錯誤。可是,在 JSP 1.2 中, flush 屬性缺省爲 false。因爲清空大多數時候不是一個重要的問題,所以,個人建議是:對於 JSP 1.1,將 flush 設置爲 true;而對於 JSP 1.2 及更高版本,將其設置爲關閉。

 

jsp:include 是如何工做的

若是您有點愛刨根問底,那麼可能十分想知道 jsp:include 標記的行爲爲何與 include 僞指令不一樣。道理其實十分簡單: jsp:include 包含的是所包含 URI 的 響應,而不是 URI 自己。這意味着:對所指出的 URI 進行 解釋,於是包含的是 生成的響應。若是頁面是 HTML,那麼將獲得一點也沒有變化的 HTML。可是,若是是 Perl 腳本、Java servlet 或者 CGI 程序,那麼獲得的將是從該程序解釋而得的結果。雖然頁面一般就是 HTML,但實際程序剛好是達到目的的手段。並且,因爲每次請求頁面的時候都會進行解釋,所以歷來不會象使用 include 僞指令時那樣高速緩存結果。雖然這只是很小的變更,但它卻致使了您所見到的行爲中的所有差別。

 

一種混合搭配的解決方案

include 僞指令在某些網站上有其用武之地。例如,若是站點包含一些(若是有變化,也不多)幾乎沒有變化的頁眉、頁腳和導航文件,那麼基本的 include 僞指令是這些組件的最佳選項。因爲 include 僞指令採用了高速緩存,所以只需放入包含文件一次,其內容就會被高速緩存,其結果會是極大地提升了站點的性能。

然而,對於如今許多 Web 應用程序或站點而言,地毯式的高速緩存並不能解決問題。雖然頁眉和頁腳多是靜態的,可是不可能整個站點都是靜態的。例如,從數據庫提取導航連接是很常見的,而且許多基於 JSP 技術的站點還從其它站點或應用程序上的動態 JSP 頁面提取內容。若是正在處理動態內容,那麼須要採用 jsp:include 來處理該內容。

固然,最好的解決方案是常常把這兩種方法混合搭配使用,將每種構造用到最恰當的地方。清單 4 是混合搭配包含解決方案的一個示例。

清單 4. 混合搭配解決方案
<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
  <title>newInstance.com</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <link href="/styles/default.css" rel="stylesheet" type="text/css" />
</head>
<body>
<jsp:include page="header.jsp" flush="true">
  <jsp:param name="pageTitle" value="newInstance.com"/>
  <jsp:param name="pageSlogan" value=" " />
</jsp:include>
<%@ include file="/navigation.jsp" %>
<jsp:include page="bookshelf.jsp" flush="true" />
<jsp:include page="/mt-blogs/index.jsp" flush="true" />
<%@ include file="/footer.jsp" %>
</body>
</html>
]]>

上面的代碼顯示了前一篇文章中的示例索引頁面。導航連接和頁腳是靜態內容,一年最多更改一次。對於這些文件,我使用了 include 僞指令。內容窗格包含 Weblog 和「bookshelf」組件,它們是動態生成的。這兩個組件須要一直更新,所以對它們,我使用了 jsp:include 標記。header.jsp 文件有點奇怪。這個組件是從另外一個本質上是靜態的 JSP 頁面提取的。可是,正如您將注意到的那樣,它從包含頁提取頁「標語」,而後將它顯示出來。要處理這一共享信息,咱們必須向頁眉文件傳入參數。而要處理那些參數,就必須使用 jsp:include 元素。

若是您想了解有關那些參數的內容,請放心,後續文章不久就將能知足您的須要。在下一篇文章中,我將解釋 JSP 參數以及它們是如何與 JavaBeans 組件交互的。屆時,咱們網上見。

相關文章
相關標籤/搜索