java Servlet技術與jsp技術使Java服務器端技術,目前他們控制了整個服務器端Java技術市場,并且逐漸成為構建商業Web應用的標準。Java開發者喜歡這些技術是由于很多的原因,包括:這些技術很容易學習,一次編寫,處處運行(Write Once, Run Anywhere)。更重要的是,如果更高效地采用了下面的實踐,Servlet與JSP能夠幫助分開Web的表示與內容。“最佳實踐”是被證明為開發高質量、可重用與易維護的基于Servlet和JSP的Web應用的較好方法。與此相對應的是,將Java代碼混合在HTML中,這樣很容易產生低效率、不易重用、難于維護的復雜應用程序。最佳實踐將改變這些弊端。
本文將描述為Servlets與JSP準備的最佳實踐的重要性;這里假設讀者已經了解兩者的基本工作原理。這篇文章將涵蓋以下內容:
類似于通用網關接口(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。
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),將在本文的后面部分進行討論。
當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"/>
如果在你的應用程序中使用了Enterprise JavaBeans (EJBs)組件,必須將業務邏輯保留在EJB組件中,提供生命周期管理,事務支持與對多客戶端對域對象(實體Beans)的存取??梢栽?A target=_blank>Enterprise BluePrints 獲得更為詳細的資料。
簡而言之,你可以使用和使用HTML創建表達式一樣的方法來通過自定義標記完成復雜的任務。
編寫自定義標記庫的時候,可以使用下列編程指南:
<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規范給出了使用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集成。
新聞熱點
疑難解答