JSP最佳實踐:使用JSP include機制改進外觀 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- JSP最佳實踐:使用JSP include機制改進外觀 (http://www.webasp.net/article/17/16994.htm) |
| -- 作者:未知 -- 發佈日期: 2005-03-15 |
| 本文是新的 JSP 最佳實踐系列文章的第一部分,它介紹了 JavaServer Pages include 機制。請跟隨 Java 編程專家 Brett McLaughlin 學習如何使用 include 將靜態的頭文件和腳注文件加入您的網站或 Web 應用程序頁面中。
歡迎閱讀 Java 專區中最新的最佳實踐系列文章。如果您看過先前的系列文章,那麼您會知道最佳實踐旨在讓您快速瞭解各種 Java 技術的有用方面。這一系列的最佳實踐專門討論 JavaServer Pages(JSP)技術,它是核心 J2EE 技術之一。 簡而言之,JSP 技術是在 Java 平台上構建 Web 頁面或 Web 應用程序接口的工具。JSP 技術允許我們做如下事情:動態響應請求數據、顯示複雜的 XML 和 HTML 以及創建生動有趣、動態驅動的網站。在本系列中,您將學習一些用 JSP 技術構建網站的基礎知識。我將為您介紹最常用的 JSP 機制,通過這些機制,您將瞭解基本的 Web 開發技術,如製作模板、操作動態內容、圖像托管、創建實用程序代碼庫等。 本文是這一系列文章的第一篇,在本文中,我們將集中討論 JSP include 機制,該機制允許我們「拉」入本地 HTML 頁面的內容。我們將首先介紹有關 Web 頁面 include 發展的一些背景知識,尤其是框架和服務器端 include 的使用。然後,我將向您演示如何使用 JSP include 機制將統一的頭文件和腳注文件添加到 Web 頁面或 Web 應用程序屏幕。 JSP 最佳實踐系列 本系列文章並不打算完整地介紹 JSP 技術,也不打算作為如何構建特殊類型應用程序的指南。相反,系列文章中的每個部分都集中討論用 JSP 技術編程的某一個方面,將它分成很小的片段。有關 JSP 技術的更廣泛介紹或者對如何將它用於特殊結果的更深入研究,請參閱參考資料部分。 您將需要什麼 本系列文章中的所有最佳實踐都基於 JavaServer Pages 技術。要運行任何一種實踐,需要在本地機器或測試服務器上設置符合 JSP 的 Web 容器,如 Apache Tomcat。您還需要使用文本編輯器或 IDE 編寫 JSP 頁面代碼。請參閱參考資料,獲取 Tomcat 和與 JSP 兼容的 Web 容器和 IDE 的清單的鏈接。 更好的外觀 為 Web 頁面創建一致的設計和佈局是確保獲得專業化外觀的最容易方法之一。您或許看過足夠多的網站,知道單個站點中的大部分頁面都共用統一的頁面頭、頁面尾以及某種類型的導航欄。在設計良好的站點上,這些元素將在每個頁面上呈現相同的佈局、內容和功能,而主面板(通常稱為內容窗格)會隨著每個視圖而變化。 以前,這種佈局幾乎完全由框架和框架集實現。每段靜態內容被放置在一個框架中,而頁面的主體內容被放置在中間框架中。框架的麻煩就是不同的瀏覽器常常會以不同方式顯示它們,使它們的外觀不一致。使用框架從內部頁面鏈接外部站點則比想像的更加困難。原本是想允許用戶在不離開站點的情況下查看外部內容,但結果往往不一致。用戶最終看到的是整個站點被擠進小得多的框架中,更糟的是,您的站點最終會嵌套在另一個站點框架中。這種混亂驅使 Web 設計者尋找一種更佳的解決方案。服務器端 include(server-side include,SSI)就是一種。 服務器端 include 不久前,SSI 還是用於創建共享內容的最受歡迎的選項之一。簡單的 SSI 偽指令允許您創建包含另一個頁面內容(如頭和腳注文件)的頁面,如清單 1 中所示。 清單 1. 正使用的 SSI <![CDATA[ <html> <head> <title>Simple SSI test</title> </head> <body> This content is statically in the main HTML file.<br /> <!--#include virtual="included.html" --> </body> </html> ]]> 我們不久將使用該文件來做一個練習。目前,您應該將它另存為 test-ssi.shtml。在大多數設置中,SSI 文件必須以 .shtml 結尾,這讓 Web 服務器知道將它們解析為 SSI 偽指令。清單 2 顯示了名為 included.html 的包含文件的內容。 清單 2. 包含的內容 <![CDATA[ This content is in another file, included.html ]]> 當請求 test-ssi.shtml 時,您將看到該文件的內容以及 included.html 的內容。您可以在任何支持 SSI 的 Web 容器(如 Apache Tomcat,請參閱參考資料)上查看這些文件。 從用戶角度看,SSI 與框架相比有重大改進,因為在單個文件和從其它被包含文件引進內容的文件之間沒有顯而易見的差別。不利方面就是 SSI 需要一種特定的服務器設置,而 Java 開發人員常常無法使用這種設置。另外,SSI 通常要求被包含內容是靜態的,儘管在後面的版本中加入了動態內容包含。 對於在網站或 Web 應用程序中包含不同類型的內容來說,SSI 是可行的解決方案,但它們不是 Java 開發人員的最佳選擇。這不僅因為 JavaServer Pages 技術是替代 SSI 的全 Java 技術,還因為這兩種技術不太容易結合在一起。JSP 頁以擴展名 .jsp 結尾,這表示要使 SSI 偽指令起作用,必須更改 SSI 配置以解析 JSP 文件(給每個 JSP 頁解析增加開銷),或者更改 JSP 配置以將 .shtml 擴展名作為 JSP 頁處理(這是一個壞主意)。對於 Java 開發人員來說,JSP 技術是最好的內容管理解決方案,幸運的是,其 include 機制很容易掌握。 JSP include JSP include 偽指令與其 SSI 對等偽指令極其相似。清單 3 顯示了清單 1 所示的 SSI 偽指令的 JSP 對等偽指令。任何支持 JSP 的 Web 容器都將處理該 JSP 頁的顯示(同樣,請參閱參考資料一節,以獲得鏈接)。應該將該文件另存為 test-include.jsp。 清單 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 /> <%@ include file="included.html" %> </body> </html> ]]> include 偽指令使將統一的頭文件和腳注文件合併到您的站點變得非常容易。清單 4 顯示了具有幾個被包含文件的主索引頁。 清單 4. 主索引頁的 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> ]]> 通過查看代碼,您將瞭解有關如何使用 JSP include 的各種方法。您還應該試驗一下該代碼,讓自己掌握其工作原理。 添加動態內容 除了如頭、腳注和導航文件之類的靜態內容外,清單 4 還包括對 Weblog(/mt-blogs/index.jsp)的調用,這涉及動態內容的主題。如同 SSI include 偽指令那樣,當 JSP include 機制應用於動態內容時會出現問題。可以通過使用 JSP include 偽指令來引入動態內容,但將無法獲得對該內容的更改。這是因為 Web 容器將被包含文件作為原始(包含)頁面的一部分讀取。容器將結果高速緩存為單個文件,而不是多個 JSP 組件。因為 Web 容器不會針對更改去輪詢被包含文件,所以它不會知道有任何更改發生,它將自動顯示高速緩存的頁面而不是刷新的頁面。要瞭解它的工作原理,我們將做一個簡單的練習。首先,將已保存的 included.html 頁面更新為清單 5 中所示的那樣。 清單 5. 修改包含的內容 <![CDATA[ This content is in another file, included.html. <br /> Some new content... ]]> 接下來,保存這些更改,導航至 test-include.jsp 文件,刷新瀏覽器。您將注意到瀏覽器中沒有顯示 included.html 中的新內容。被包含文件的內容在更改發生之前就被高速緩存了,所以它不會顯示出來。如果您的站點包含動態內容或可能被頻繁修改的內容,那麼這會是一個問題。幸運的是,有一個變通方法。在下一個部分中,我將向您演示如何使用 <jsp:include> 標記將動態內容加入 Web 頁面。在此之前,請參考參考資料一節並試驗這裡提供的代碼,我將在網上與您再見。 參考資料 要完成本系列文章中的練習,將需要與 JSP 兼容的 Web 容器,如 Apache Tomcat。 您可能還想要研究如何使用符合 JSP 的 IDE。您可以從下面幾個 IDE 中選擇: JUnit NetBeans Eclipse 有關 JSP 技術的基本詳細信息,最好的辦法是閱讀 JSP 規範。 有關 JSP 技術的指導性介紹,請嘗試閱讀教程「JSP 技術入門」(developerWorks,2001 年 8 月)。 developerWorks 也提供了許多有關 JSP 及其相關技術的有一定深度的文章,包括下列文章: 摘自 Professional JSP(2001 年 2 月)的「JSP architecture」是有關 JavaServer Pages 技術的極佳初級讀本。 「JSP 標記庫:著意設計的更好的可用性」(2001 年 12 月)研究了 JSP 定制標記庫工具,該工具允許您開發自己的用於描述 Web 頁面組件的標記。 「利用 JSP 代碼管理您的圖像」(2002 年 11 月)討論了許多本部分 JSP 最佳實踐中提供的概念 ? 但集中討論基於圖像的內容。 Mark Kolb 撰寫的 JavaServer Pages Standard Tag Library 系列文章(共四部分)為本系列文章所包含的最佳實踐提供了一些後端理論。至本次截稿時間,僅發表了三篇文章:JSTL 入門:表達式語言(2003 年 2 月)介紹了 JSTL 和表達式語言(Expression Language);JSTL 入門:探討 core(2003 年 3 月)通過討論流控制和 URL 管理更進一步研究核心庫;以及 Part 3, Presentation is everything(2003 年 4 月)集中討論了用於國際化的 fmt 標記的使用。 Hans Bergsten 的 JavaServer Pages(O´Reilly & Associates,2002 年)是學習 JSP 技術的不可缺少的參考資料。 developerWorks 上的「Ten JSP technology books compared」有點兒過時(2001 年 6 月),但它仍出色地評論了非常有用的 JSP 標題。 如果您喜歡 JSP 最佳實踐,也可以參考 developerWorks 上的 EJB best practices 系列文章。 JSP 技術基於 Java Servlet 技術。通過閱讀 Jason Hunter 撰寫的 Java Servlet Programming(O´Reilly & Associates,2002 年)學習有關 Servlet 的更多知識。 請參閱 developerWorks Java 技術教程頁面,從 developerWorks 獲取免費 Java 技術教程的完整列表。 在 developerWorks Java 技術專區可以找到數百篇有關 Java 編程各個方面的文章(包括有關 JSP 技術的更多文章)。 關於作者 Brett McLaughlin 自從流行 Logo 語言時就一直從事計算機行業(記得小三角形嗎?)。目前,他專門從事使用 Java 以及與 Java 相關的技術來構建應用程序基礎結構的工作。最近幾年,他在 Nextel Communications 和 Allegiance Telecom Inc. 從事這些基礎結構的實現。Brett 是 Java Apache 項目 Turbine 的共同創始人之一,該項目通過使用 Java servlet 為 Web 應用程序開發構建可重用的組件體系結構。他還是 EJBoss 項目(一種開放源碼 EJB 應用程序服務器)和 Cocoon(一種開放源碼 XML Web 發佈引擎)的志願開發者之一。 |
| webasp.net |