Servlets和JSP Pages最佳實務

來源:互聯網
上載者:User
js|servlet


Java Servlet技術與JSP技術使Java伺服器端技術,目前他們控制了整個伺服器端Java技術市場,並且逐漸成為構建商業Web應用的標準。Java開發人員喜歡這些技術是由於很多的原因,包括:這些技術很容易學習,一次編寫,處處運行(Write Once, Run Anywhere)。更重要的是,如果更高效地採用了下面的實踐,Servlet與JSP能夠協助分開Web的表示與內容。“最佳實務”是被證明為開發高品質、可重用與易維護的基於Servlet和JSP的Web應用的較好方法。與此相對應的是,將Java代碼混合在HTML中,這樣很容易產生低效率、不易重用、難於維護的複雜應用程式。最佳實務將改變這些弊端。

本文將描述為Servlets與JSP準備的最佳實務的重要性;這裡假設讀者已經瞭解兩者的基本工作原理。這篇文章將涵蓋以下內容:

  • 簡要介紹Java Servlet與JavaServer Pages (JSP)。
  • 為開發Servlets 與JSP提供一些提示,技巧與規則。
  • 為Servlet與JSP提供最佳實務。

Servlet和JSP Pages概述

類似於通用閘道介面(CGI)指令碼,servlets支援要求響應編程模式。當用戶端給伺服器發送請求時,伺服器將請求發送給servlet。然後,servlet構建一個響應,伺服器將該響應發送回用戶端。然而,跟CGI指令碼不同的是,servlets和HTTP伺服器運行在同一個進程內。

當發出用戶端請求的時候,調用service 方法並傳遞一個請求和響應對象。Servlet首先判斷該請求是GET 操作還是POST 操作。然後它調用下面的一個方法:doGet 或 doPost。如果請求是GET就調用doGet方法,如果請求是POST就調用doPost方法。doGet和doPost都接受請求(HttpServletRequest)和響應(HttpServletResponse)。

最簡單地說,servlets是能夠使用print語句產生動態HTML內容的Java類。然而,有一點必須要提一下,那就是servlets是在一個容器內啟動並執行,並且APIs 提供了對會話和對象的生命週期的管理。因此,當你使用servlets時,你就能獲得Java平台的所有優勢,它包括沙箱 (安全)、通過JDBC的資料庫存取API和具有跨平台可移植性的servlets。

Java Server Pages (JSP)

JSP技術是Servlet技術的一個較高層次的抽象。它是Sun公司開發、開放的技術,是與Microsoft公司的ASP動態網頁技術相似的一種技術,並且它是Java2 企業版(J2EE)的一個關鍵組件。目前,很多商業的應用伺服器(例如BEA WebLogic, IBM WebSphere, Live JRun, Orion等等)都支援JSP。
 

JSP頁面如何工作?

JSP頁面實際上是一個帶有傳統HTML和Java代碼的Web頁面。JSP頁面的副檔名是.jsp而並不是.html或.htm,該副檔名告訴伺服器該頁面需要特殊的處理,該特殊處理必須由伺服器擴充或外掛程式實現。

當一個JSP頁面被讀取時,他首先將被編譯(JSP引擎來做這件事情)為一個Servlet。 這時候這個Servlet就像其他Servlet一樣被交給Servlet引擎來處理。然後Servlet引擎讀取那個Servlet對應的類(用ClassLoader)並且執行它,產生一個動態HTML頁面(圖1)。這個Servlet建立一些必需的元件,然後將這些元件作為一個字串寫入輸出資料流(OutputStream),並顯示在瀏覽器中。
調用JSP頁面時,首先會將它編譯成一個 (通過JSP引擎) Java servlet。這時,servlet引擎處理該servlet,就像處理任何其他servlet一樣。然後,servlet引擎載入servlet類 (使用類載入器) 並執行它建立動態HTML發送給瀏覽器,如圖1所示。Servlet建立所有必需的對象,並將所有對象作為字串寫入到輸出資料流中,並在瀏覽器中顯示。


1: 調用一個JSP頁面的請求/響應流程圖

下次請求該頁面的時候,JSP引擎執行早就裝載的servlet除非JSP頁面早就更改,在這種情況下,會將它自動重新編譯進一個servlet中並執行。

最佳實務

在本節中,將描述在Servelt, 特別是JSP中的最佳實務。強調JSP最佳實務是因為JSP比Servlet得到更為廣泛的應用(也許是因為JSP技術促進了表示與邏輯的分離)。一個整合Servlet與JSP的最佳實務是“模型-顯示-控制器”設計模式(Model View Controller, MVC),將在本文的後面部分進行討論。

  • HTML頁面中不要過多使用Java代碼: 將所有的Java代碼直接放在JSP頁面中,對於小項目而言沒有問題,但是過度使用將會導致意大利麵條似的代碼,難於閱讀,難於理解。減少Java代碼的方法是編寫獨立的Java類來實現計算等邏輯。一旦測試了這些類,就建立了執行個體。
  • 選擇合適的include機制: 最好將頁首、頁尾和導航條內容儲存在單個檔案中,並且不要重新動態產生它們。一旦將這些內容儲存在各個獨立的檔案中,使用下面include機制中的任何一個就能在所有的頁面中引入它們:
    1. Include 指令: <%@ include file="filename" %>
    2. Include行為: <jsp:include page="page.jsp" flush="true" />


當JSP正在轉換成Servlet時,第一種include機制將包含指定檔案的內容(轉換階段),對於第二種include機制來說,當該頁面執行後時,頁麵包含了用Response產生的內容。當被包含的頁面不太改變的時候,我推薦使用第一種include指令方式,這種方式比較快,效能較好;當被包含的檔案經常改變(其中也有動態內容)時,並且在執行首頁的時候不能確定所要引入的的頁面的時候,使用第二種include行為方式。

另一種include機制是使用JSP標準標記庫(JSTL)中的<c:import> 行為標記。可以使用這種方式來包含本地的或者遠端檔案,下面是一些例子:

<c:import url="./copyright.html"/>
<c:import url="http://www.somewhere.com/hello.xml"/>
  • 不要將商務邏輯和表示混合起來: 在更為複雜的應用中,並且更多的代碼被引入時,很重要的一點是不要將商務邏輯與表示混在同一個檔案中。分開商務邏輯與表示使得當其中的任何一方需要改動是不至於影響到另外一方。JSP僅僅被作為前台的表示。那麼,該如何?商務邏輯部分呢?這就是JavaBeans的用武之地了。JavaBeans技術是輕便的、平台無關的組建模型,它使開發人員編寫組件並且可以處處運行。在JSP環境中,JavaBeans組件處理商務邏輯並返回資料給JSP頁面,這反過來格式化從JavaBeans組件返回的資料,以便在瀏覽器中顯示。JSP頁面通過調用JavaBeans組件的get方法和set方法來操作Bean的各項屬性。使用JavaBeans技術的好處如下:
    1. 可重用:不同的應用可以使用同一個組件。 
    2. 分離商務邏輯與表示:可以在JSP頁面上改變資料的顯示外觀而不影響商務邏輯。換而言之,網頁設計師只需要關注設計,Java開發人員只需要關注商務邏輯。
    3. 保持原始碼的安全性,保護自己的智慧財產權。


如果在你的應用程式中使用了Enterprise JavaBeans (EJBs)組件,必須將商務邏輯保留在EJB組件中,提供生命週期管理,事務支援與對多用戶端對域對象(實體Beans)的存取。可以在Enterprise BluePrints 獲得更為詳細的資料。

  • 使用自訂標籤: 並不是所有HTML內容開發人員都喜歡將Java代碼(或scriptlets)嵌入在HTML文檔中的,可能是因為他們不瞭解Java語言並且也不樂意學習它的文法。但是不能使用JavaBeans組件封裝很多Java代碼,在JSP頁面中使用它們仍然要求內容開發人員具有Java文法的知識。

    JSP技術允許你通過標記庫裝置引入新的自訂標籤。作為一個Java開發人員,你可以通過引入能夠部署並在HTML這類文法中使用的自訂標籤擴充JSP頁面。自訂標籤通過進一步分隔商務邏輯和表示邏輯也允許你提供更好的封裝。另外,它們提供了自訂表格示的方法,而使用JSTL卻很難做到這一點。

    自訂標籤的好處:
    1. 他們能夠消除JSP應用程式中的scriptlets。標記必要參數可以作為屬性或內容體傳遞,因此,不需要Java代碼初始化或設定組件屬性。
    2. 它們的文法非常類似。Scriptlets是使用Java代碼編寫的,但是可以在類似於HTML文法中使用自訂標籤。
    3. 它們能夠提高非程式員內容開發人員的生產率,允許它們執行HTML不行完成的任務。
    4. 它們是可重用的。節省了開發與測試的時間。Scriptlets不是可重用的,除非你通過剪下粘貼 來“重用”。


簡而言之,你可以使用和使用HTML建立運算式一樣的方法來通過自訂標籤完成複雜的任務。

編寫自訂標籤庫的時候,可以使用下列編程指南:

    1. 保持簡單性:如果需要在一個標記中包含多個屬性,那麼最好將它分為多個標記。
    2. 使它具有可用性:諮詢標記的使用者(HTML開發人員)從而獲得高可用性。
    3. 不要在JSP頁面中發明一種程式設計語言:不要開發自訂標籤讓使用者編寫顯式的程式。
    4. 盡量不要重新發明輪子:目前有多個JSP標記庫可用,如Jakarta Taglibs Project。查看這些標記庫,看看是否有你所想要的東西。
  • 不要重新發明輪子: 雖然自訂標籤提供了重用寶貴的組件的方法,但是仍然要建立、測試和調試它們。另外,開發人員仍然要不斷地重新發明輪子,該解決方案的效率不是最高的。問題就是通過提供一組顆重用的標準標記解決JavaServer Pages Standard Tag Library (JSTL) 。JSTL定義了一組在任何地方都一樣工作的標準標記庫,這樣你就不再需要使用scriptlet(或各類供應商提供的迭代標記)在集合中進行迭代。JSTL 包括各類標記,迴圈、不使用Java文法就讀取屬性、迭代各類資料結構、有條件地計算運算式、通過一種精確的方式設定屬性和指令碼變數並分析XML文檔。
  • 使用JSTL運算式語言: 使用JSP範圍屬性和請求參數將資訊傳遞給JSP頁面。運算式語言 (EL)是為頁面作者特別設計的語言,將JSP範圍屬性提升為商務邏輯到JSP頁面通訊的標準方法。然而,注意,然而EL是JSP技術的一個關鍵方面,它不是一個通用編成語言。而且,它是簡單的資料存取語言,它不需要使用scriptlet或請求時間運算式值就能方便地存取(並操作)應用資料。

    在JSP 1.x中,頁面作者必須使用運算式<%= aName %> 來存取系統的值,如下面的例子所示:
           <someTags:aTag attribute="<%=
                    pageContext.getAttribute("aName") %>">

或自訂的JavaBeans組件的值:

   <%= aCustomer.getAddress().getCountry() %>

運算式語言允許頁面作者使用簡化的文法存取對象。例如,可以使用下面的語句存取簡單變數:

   <someTags:aTag attribute="${aName}">

如果想要存取嵌套的JavaBeans屬性,可以使用下面的語句:

   <someTags.aTag attribute="${
      aCustomer.address.country}">

如果你使用JavaScript,你將會覺得非常熟悉,因為EL採用JavaScript文法存取結構化資料。

  • 如果可能使用過濾器: 過濾器是JSP技術的一項新功能。如果你曾經遇到過這樣一種情況,那就是有多個servlet或JSP頁面需要壓縮它們的內容,那麼在這種情況下你就能夠編寫一個簡單的壓縮過濾器並將它應用到所有的資源上。例如,在Java BluePrints中,通過過濾器來提供SignOn。
  • 使用可移植的安全模型: 絕大多數伺服器提供伺服器或供應商特定的安全功能,這樣就將開發人員局限於某台特定的伺服器。為了最大化公司專屬應用程式的可移植性,使用一個可移植的Web應用安全模型。然而,到最後,這歸結成權衡問題。例如,如果你有一組早就定義好的使用者,你可以使用基於表單的登入或基本認證來管理他們。但是如果你希望動態建立使用者,你就需要使用容器特定的API來建立和系統管理使用者。但是容器特定的API不具有可移植性,使用適配器(Adapter)設計模式能夠克服這一點。
  • 使用資料庫儲存持久資訊: 可以使用HttpSession 對象實現會話,該對象提供了一個簡單方便的機制來儲存使用者、識別使用者的cookie。使用會話儲存臨時資訊—所以即便這些資訊丟失了,你也不用擔心。(當會話到期或用戶端改變瀏覽器的時候,會話資料就會丟失。) 如果你希望儲存持久資訊,使用資料庫,在瀏覽器之間共用資料庫中的持久資訊更加安全更具有可移植性。
  • 緩衝內容: 永遠都不要動態重建請求之間不會改變的內容。你可以在用戶端、代理端或伺服器端緩衝內容。
  • 使用串連緩衝池: 推薦使用JSTL進行資料庫存取。但是如果你希望自己定製編寫資料庫存取的行為,推薦你使用串連池,這樣能有效地讓所有請求共用資料庫串連。然而,注意,J2EE伺服器在背後提供了該項功能。
  • 快取資料程式庫要求結果: 如果你希望快取資料庫結果,不要使用JDBC的ResultSet 對象作為緩衝對象。它和一個連結緊密結合,這個連結和串連池相衝突。將資料從ResultSet 複製到特定應用的bean,如Vector或JDBC的RowSets。
  • 在必要的時候採取新的JSP XML文法:實際上這基於你希望你的應用程式如何遵守XML。然而,這需要進行權衡,因為這使得JSP成為更加強大的工具,但是對開發人員卻不怎麼友好。
  • 讀取並應用Enterprise BluePrints:Sun的 Enterprise BluePrints 給開發人員提供了指南、 模式、 和例子應用程式,如Adventure Builder和Pet Store。總的來說, J2EE BluePrints提供了最佳實務和一組設計模式,這些實踐和模式是構建具有可移植性、強壯可擴充的Java應用程式中經常出現的問題的解決方案。

整合Servlets和JSP頁面

JSP規範給出了使用JSP頁面構建Web應用程式的兩個方案:JSP模型1和模型2體繫結構。這兩個模型的區別在於處理的位置。在模型1的體繫結構中,如圖2所示,JSP頁面負責處理請求並將響應發送給用戶端。


2: JSP模型1 體繫結構

模型2體繫結構,如圖3所示,整合使用了servlets 和JSP頁面。在該模型中,JSP頁面用於展示層,並且servlets負責處理各類任務。Servlet作為一個控制器,負責處理請求並建立JSP頁面所需的任何bean。該控制器也負責確定將該請求傳遞到哪個JSP頁面。JSP頁面檢索servlet建立的對象,並提取動態內容插入在一個模板中。


3: JSP模型 2 體繫結構

該模型促進了模型視圖控制器(MVC)體繫結構風格設計模式的使用。注意,早就存在多個架構能夠實現該有用的設計模式,並將內容和表示真正地獨立開來。Apache Struts是MVC的形式化架構。該架構非常適用於複雜的應用程式,在這些複雜的應用程式中單個請求或表單提交會產生看起來截然不同的結果。

結束語

最佳實務—事實證明是經常重複出現的問題的解決方案—產生了高品質的應用程式。本文是開發servlet時需要遵守的多個指南和最佳實務-和基於JSP的Web應用程式。

請留心servlets和JSP技術,因為在這些技術中有許多激動人心的東西。例如,JavaServer Faces (JFC),是一個Java程式社區(Java Community Process),它的目標是定義一個標準的Web應用程式框架,這將很好地和Apache Struts整合。





相關文章

聯繫我們

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