所有最佳實踐都基於 JavaServer Pages 技術。要運行任何一種實踐,需要在本地機器或測試服務器上設置符合 JSP 的 Web 容器,如 apache Tomcat。您還需要使用文本編輯器或 IDE 編寫 JSP 頁面代碼。請參閱參考資料,獲取 Tomcat 和與 JSP 兼容的 Web 容器和 IDE 的清單的鏈接。
更好的外觀
為 Web 頁面創建一致的設計和布局是確保獲得專業化外觀的最容易方法之一。您或許看過足夠多的網站,知道單個站點中的大部分頁面都共用統一的頁面頭、頁面尾以及某種類型的導航欄。在設計良好的站點上,這些元素將在每個頁面上呈現相同的布局、內容和功能,而主面板(通常稱為內容窗格)會隨著每個視圖而變化。
以前,這種布局幾乎完全由框架和框架集實現。每段靜態內容被放置在一個框架中,而頁面的主體內容被放置在中間框架中。框架的麻煩就是不同的浏覽器常常會以不同方式顯示它們,使它們的外觀不一致。使用框架從內部頁面鏈接外部站點則比想像的更加困難。原本是想允許用戶在不離開站點的情況下查看外部內容,但結果往往不一致。用戶最終看到的是整個站點被擠進小得多的框架中,更糟的是,您的站點最終會嵌套在另一個站點框架中。這種混亂驅使 Web 設計者尋找一種更佳的解決方案。服務器端 include(server-side include,SSI)就是一種。
服務器端 include
不久前,SSI 還是用於創建共享內容的最受歡迎的選項之一。簡單的 SSI 偽指令允許您創建包含另一個頁面內容(如頭和腳注文件)的頁面,如下面所示。
- This content is statically in the main Html file.
- ]]>
我們不久將使用該文件來做一個練習。目前,您應該將它另存為 test-ssi.shtml。在大多數設置中,SSI 文件必須以 .shtml 結尾,這讓 Web 服務器知道將它們解析為 SSI 偽指令。下面顯示了名為 included.Html 的包含文件的內容。
- 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 對等偽指令極其相似。下面是 SSI 偽指令的 JSP 對等偽指令。任何支持 JSP 的 Web 容器都將處理該 JSP 頁的顯示(同樣,請參閱參考資料一節,以獲得鏈接)。應該將該文件另存為 test-include.JSP。
- <%@ page language="java" contentType="text/html" %>
- This content is statically in the main JSP file.
- <%@ include file="included.html" %>
- ]]>
include 偽指令使將統一的頭文件和腳注文件合並到您的站點變得非常容易。清單 4 顯示了具有幾個被包含文件的主索引頁。
- <%@ page language="java" contentType="text/html" %>
- <%@ include file="header.jsp" %>
- <%@ include file="navigation.jsp" %>
- <%@ include file="bookshelf.jsp" %>
- <%@ include file="/mt-blogs/index.jsp" %>
- <%@ include file="footer.jsp" %>
- ]]>
通過查看代碼,您將了解有關如何使用 JSP include 的各種方法。您還應該試驗一下該代碼,讓自己掌握其工作原理。
添加動態內容
除了如頭、腳注和導航文件之類的靜態內容外,清單 4 還包括對 Weblog(/mt-blogs/index.jsp)的調用,這涉及動態內容的主題。如同 SSI include 偽指令那樣,當 JSP include 機制應用於動態內容時會出現問題。可以通過使用 JSP include 偽指令來引入動態內容,但將無法獲得對該內容的更改。這是因為 Web 容器將被包含文件作為原始(包含)頁面的一部分讀取。容器將結果高速緩存為單個文件,而不是多個 JSP 組件。因為 Web 容器不會針對更改去輪詢被包含文件,所以它不會知道有任何更改發生,它將自動顯示高速緩存的頁面而不是刷新的頁面。要了解它的工作原理,我們將做一個簡單的練習。首先,將已保存的 included.Html 頁面更新為下面所示的那樣。
- This content is in another file, included.Html.
- Some new content...
- ]]>
接下來,保存這些更改,導航至 test-include.JSP 文件,刷新浏覽器。您將注意到浏覽器中沒有顯示 included.Html 中的新內容。被包含文件的內容在更改發生之前就被高速緩存了,所以它不會顯示出來。如果您的站點包含動態內容或可能被頻繁修改的內容,那麼這會是一個問題。幸運的是,有一個變通方法。在下一個部分中,我將向您演示如何使用 標記將動態內容加入 Web 頁面。在此之前,請參考參考資料一節並試驗這裡提供的代碼,我將在網上與您再見。