JSP中的include 機制

來源:互聯網
上載者:User
本文是新的 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 頁面。在此之前,請參考參考資料一節並實驗這裡提供的代碼,我將在網上與您再見。 

可以自動跳轉到出錯頁面的servlet/jsp架構

jsp有一個指令可以定義jsp的錯誤頁面,並在此jsp頁面出錯時跳轉到該頁面輸出出錯日誌。如下的例子:

<%@ page errorPage="errorPage.jsp" %>errorPage.jsp的代碼如下所示:.....<%@ page isErrorPage="ue" %>....//輸出出錯日誌<%= exception.getMessage() %> 

但是,這隻能在jsp頁面層控制。在J2EE的實現中,很多的情況是jsp往往只作為頁面顯示,與業務相關的資料庫操作都是在背景servlet執行,處理完畢之後再跳轉某個jsp顯示頁面。這種設定架構,實現了MVC結構,使得整個系統的維護難度大大降低。 

實際的工作中,儘管系統採用了以上的設定架構,但由J2EE開發人員水平以及編程的習慣都有可能不通,經常會遇到開發人員在servlet中對有可能報錯的地方處理不恰當。最常見的一種情況是,catch一個Exception e,然後僅僅調用e.printStackTrace()。這樣造成的後果非常嚴重。一旦有Exception發生,web頁面會出現白屏,我們可以從兩方面來看: 

(1)如果是使用的使用者。他往往會不知所措,並且有可能還不知道有錯誤發生,繼續使用系統,但這時候的系統已經出錯了,在錯誤的基礎上繼續商務程序,往往會造成更多系統層級的錯誤。 

(2)如果是開發人員。使用者反映了這個出錯,但是不知道出錯原因。只能說出現要白屏。開發人員需要調試抓錯的話,非得到應用伺服器的輸入端查看出錯日誌,定位可能出錯的原因,再進行排錯。 

在此,我介紹一種有效servlet出錯處理機制,這種機制將所有Exception的出錯內容拋出到web頁面,讓使用使用者立即有錯誤發生,並可以及時將該出錯內容提交給開發人員定位出錯原因。 

其實,這種機制非常簡單。思路是定義一個抽象的BaseServlet基類,它繼承HttpServlet。 

並增加一個抽象的 
absact public void doWorkFlow(HttpServletRequest request,HttpServletResponse response)的方法,這個方法是所有BaseServlet子類都必須且僅需實現的方法。BaseServlet基類當然要實現service方法 -- 

public final void service(HttpServletRequest request,HttpServletResponse response)。它的代碼片斷如下: 

public final void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { y{ //在執行doWorkFlow()之前,你可以在此處理是否有許可權處理等問題 ....... doWorkFlow(); }catch(Exception e){ SingWriter out = new SingWriter(); e.printStackTrace(new PrintWriter(out)); request.setAtibute("err_msg", out.toSing()); RequestDispatcher rd = this.getServletContext().getRequestDispatcher("errorServlet.jsp"); rd.forward(request,response); }} 
errorServlet.jsp非常簡單。代碼片斷如下: 

....//輸出出錯日誌<%= request.getAtibute("err_msg") %>  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.