使用jsp:include控制動態內容的方法_JSP編程

來源:互聯網
上載者:User

本文執行個體講述了使用jsp: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>]]>

雖然 include 非常適於將靜態內容併入 Web 頁面,但對於動態內容卻不盡如人意。我們在前一篇文章中在試圖重新裝入快取檔案時發現了這一問題。與大多數頁首檔案及頁尾檔案不同,動態內容變化頻繁,必須時刻更新。我們將首先扼要地重述一下 include 偽指令的局限性,然後我將向您示範如何用 jsp:include 標記來擴充 JSP 的包含能力。

快取問題

JSP include 偽指令的不足之處有一個是:它會導致 網頁瀏覽器快取所有頁面。在處理諸如頁尾、著作權聲明或一組靜態連結之類的靜態組件時,這是有意義的。這些檔案不會改變,因此沒有理由讓 JSP 解譯器不斷地重新輪詢其中的資料。凡是可能的地方,都應該實現快取,因為它改善了應用程式的效能。

但是,有時侯,進行快取會得不償失。如果提入的內容來自使用動態資料(如 Weblog 或資料庫驅動的 JSP 檔案)的程式,甚至如果所包含的內容是經常變化的 HTML(如時間戳記),那麼每當裝入 Web 頁面時,都需要顯示這些檔案或程式的最新版本。遺憾的是,JSP include 偽指令並不具備這一功能。在測試和開發週期(請參閱側欄“ 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 檔案的內容,然後重新裝入瀏覽器頁面,就會立即看到新內容。

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程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.