Servlets和JSP開發原則(下)

Servlets和JSP開發原則(下)

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

  • 不要“重新發明輪子”,不要一切從頭開始: 通過定製組件可以提高複用性,不過定製組件仍然需要編寫、測試和調試程序。問題是這個事情別人可能已經實現了,而且你的實現方式並不一定比人家做得更好。這就是JSP標準標記庫(JavaServer Pages Standard Tag Library, JSTL)要做的事情(JSTL請參考JSTL官方網站)。JSTL提供了循環、讀屬性、遍歷各種數據結構、條件表達式求值等各種標記。它也提供了一些複雜的標記,甚至像解析XML文檔的標記它都有。所以如果你要用到一個標記的話,最好先看看有沒有別人已經實現的可以使用,而不要次次從頭開始,自己搞一套。

  • 使用JSTL表達使語言(JSTL Expression Language): 傳遞給JSP頁面的數據一般通過JSP作用域屬性或者請求參數來進行。專門爲網頁開發者設計的表達式語言(Expression Language, EL)把使用作用域屬性傳遞信息作爲從業務邏輯向JSP頁面傳遞信息的標準方式。這裏要注意的是,EL只是JSP技術中關鍵的一個方面,並不是一種通用的程序設計語言。相反,它只是一種數據訪問語言,它可以簡化應用程序的數據的訪問,不用Scriptlet和請求時表達式求值就可以訪問數據。

    JSP中,網頁設計師要使用表達式語法<%= name %>JavaBean組件來取得某些變量或屬性的值,例如:

     <tagLib:tag attribute="<%=

         pageContext.getAttribute("name") %>">

 

 

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

 

表達使語言讓網頁設計師可以使用簡化的語法來訪問信息。如果你只是要訪問一個簡單的變量,你可以使用這樣的語法:

 

  <tagLib:tag attribute="${name}">

 

如果你要訪問一個嵌套JavaBean的屬性,你可以這樣:

 

  <tagLib:tag attribute ="${

      aCustomerBean.address.country}">

 

表達式語言(EL)借用了JavaScript 的語法,所以如果你對JavaScript 很熟悉的話,你就會覺得巨爽。

  • 使用過濾器(filter): 過濾器是一個對象,可以傳輸請求或修改響應。它可以在請求到達Servlet/JSP之前對其進行預處理,而且能夠在響應離開Servlet/JSP之後對其進行後處理。所以如果你有幾個Servlet/JSP需要執行同樣的數據轉換或頁面處理的話,你就可以寫一個過濾器類,然後在部署描述文件(web.xml)中把該過濾器與對應的Servlet/JSP聯繫起來。

創建過濾器其實很容易,你只須實現javax.servlet.Filter接口及它的三個方法:

public void init(FilterConfig config)

public void doFilter(ServletRequest req, ServletResponse rep,

FilterChain chain)

public void destroy()

這樣,你就可以完成你的過濾器。

  • 使用可移植的安全模型: 大部分的應用服務器都提供了安全模型,不過一般它們都是針對某一個服務器或某一個廠商專有的。如果你的應用需要移植的話,那麼你的應用最好使用可以移植的安全模型。如果你的應用有一些預先定義的固定用戶的話,那麼你可以使用FROM驗證和BASIC驗證。可是如果你要動態生成客戶的話(一般都是這種情況),你可能就需要使用服務器特定的API來創建和管理用戶。這樣當你的應用移植到另外一個服務器時,你可能就會碰到API不兼容的問題。這種情況下,最好的解決方法是使用適配器(Adapter)模式(如果你對設計模式不熟悉的話,請參看GoF的《設計模式》一書)。

  • 用數據庫來保存持久性數據: Servlet/JSP中可以使用HttpSession對象也就是會話對象來保存用戶的臨時數據。不過如果你想保存持久性數據的時候,你應該使用數據庫,數據保存數據會更安全,而且對客戶所用的瀏覽器沒有什麼要求。這樣即使你的應用服務器由於某種原因崩潰了,你的數據依然良好。

  • 高速緩存頁面: 應用程序中總有一些東西是相對固定的,而另外一些東西是經常變化的。你應該使用靜態的HTML文檔來存儲那些相對固定的內容,這樣客戶端就可以進行高速緩存,客戶每次訪問你的應用時,只需訪問已經改動的部分。這樣可以加快客戶的訪問速度。

  • 使用連接池: 如果你要自己寫數據庫訪問代碼的話,我覺得使用你應該學會如何使用數據庫連接池技術。每一個服務器都有針對數據庫連接池的配置文檔,你要學習一下如何使用。數據庫連接池可以加速你的應用的數據訪問的速度,而且由於服務器替你管理了數據庫連接,這可以節省你的很多工作。

  • 緩存數據庫的訪問結果: 如果你的應用要對數據庫進行頻繁訪問的話,你可以使用一個對象來緩存你的數據,這樣你就可以節省大量訪問數據庫的開銷。在《J2EE核心模式》和《實用J2EE設計模式編程指南》兩本書中都有關於值對象模式(Value Object Pattern)的詳細探討,你可以參考這兩本書來獲得相應的知識。

  • 使用數據訪問對象模式:如果你的應用需要訪問多個數據庫系統或者可能會移植到其它的存儲系統中,那麼你針對特定廠商的優化代碼就可能會失效。使用通用的代碼存在執行效率的問題,而使用優化代碼又存在移植的問題。所以就產生了數據訪問對象模式(Data Access Object Pattern, DAO),該模式既提供了各數據庫廠商的適應性,又能利用到他們提供的獨特的好處。按照面向對象的分離任務的原則,該模式將與企業信息系統(Enterprise Information System, EIS)通訊需要的邏輯隔離到它自己的類中。這樣,事物對象,如Servlet/JSP組件、JavaBean就可以利用數據訪問對象(DAO)處理所有與EIS有關的事務。

  • 最好採用JSPXML語法: JSP技術中經常存在着兩種完成同一個任務的語法,一種是常規的JSP語法,一種是對應的XML語法。雖然兩種語法作用相同,你最好還是使用XML語法。存在兩種語法的原因是,JSP語法可以與以前的代碼兼容,而J2EE使用XML作爲其交換數據的核心,所以同時提供了XML語法。隨着J2EE的發展,XML的作用會越來越大,所以我建議你使用XML語法。

  • 研究Sun提供的J2EE BluePrints: SunEnterprise BluePrints 提供了大量指導原則、設計模式和很好的例子(寵物店,Pet Store)。你可以好好研究一下這些內容,這樣可以提高你的設計和開發水平。

 

整合ServletJSP

 

JSP技術規範種給出了兩種使用JSP開發Web應用的方式,這兩種方式可以歸納爲模型一和模型二,這兩種模型的主要差別在於它們處理業務的流程不同。模型一,如下圖所示,稱之爲JSP+JavaBeans模型。在這一模型中,JSP頁面獨自響應請求並將處理結果返回給客戶,所有的數據通過JavaBean來處理,JSP實現頁面的表現。

 

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
2 JSP模型一

 

 

從上圖可以看出,模型一也實現了頁面表現和業務邏輯相分離。然而使用這種方式就要在JSP頁面使用大量的Java代碼,當需要處理的業務邏輯很複雜時,這種情況會變得非常糟糕。大量嵌入式代碼使整個頁面程序變得異常複雜。對於前端界面設計的網頁開發人員來說,這簡直是一場噩夢。所以,模型一不能滿足大型應用的需要,但是對於小型應用,因爲該模型簡單,不用涉及諸多要素,從而可以很好地滿足小型應用的需要,所以在簡單應用中,可以考慮模型一。

 

模型二,如下圖所示,稱之爲JSP+Servlet+JavaBeans模型。這一模型結合了JSPServlet技術,充分利用了JSPServlet兩種技術原有的優勢。這個模型使用JSP技術來表現頁面,使用Servlet技術完成大量的事務處理,使用Bean來存儲數據。Servlet用來處理請求的事務,充當一個控制者的角色,並負責向客戶發送請求。它創建JSP需要的Bean和對象,然後根據用戶請求的行爲,決定將哪個JSP頁面發送給客戶。

 

 


3 JSP模型二

 

 

從開發的觀點看,模型二具有更清晰的頁面表現,清楚的開發角色的劃分,可以充分利用開發團隊中的網頁設計人員和Java開發人員。這些優勢在大型項目中表現得尤爲突出,網頁設計人員可以充分發揮自己的美術和設計才能來充分表現頁面,程序編寫人員可以充分發揮自己的業務邏輯處理思維,實現項目中的業務處理。

 

另外,從設計結構來看,這種模型充分體現了模型視圖控制器(MVC)的設計架構。事實上,現存的很多開發框架都是基於這種模型的,充分實現了MVC ,例如Apache Struts框架和JavaServer Faces框架(關於JavaServer Faces框架,我翻譯了一篇介紹性的文章JavaServer Faces開發Web應用》,大家可以參考一下;關於Struts,大家可以參考Apache網站)。

 

 

其他:

 

我們總結了一些用JSP/Servlet技術進行Web開發的原則,通過實施這些原則,可以開發出可以複用的、結構良好的Web應用。當然,我們這裏的總結還是遠遠不夠的,希望在以後的工作和學習中可以得到更大程度的提高。

 

 

如果想詳細瞭解穩中提到的技術,大家可以參考:

 

1、《ServletJSP權威指南》,它的網站爲http://www.moreservlets.com/,這裏還有作者的另外一本書《Core Servlet and JSP》的PDF版本可以免費下載。這本書詳細介紹了ServletJSPTag標記庫、JSTLMVCServlet容器模型等等技術,是一本比較全面的關於使用Java開發Web應用的書。它的缺陷就在於爲了與以往程序兼容,它在很多地方使用了JSP1.1的語法,當然對於熟悉JSP歷史的讀者來說,這並沒有什麼影響。

 

2、《Java2 Web開發認證學習指南》這是一本認證的書,不過裏面還是詳細介紹了Servlet模型、Servlet容器模型、Java授權和認證策略(JAAS)、JSP以及設計模式等等。大家也可以一看。

 

3、《設計模式:可複用面向對象軟件的基礎》這是設計模式的經典書籍,這裏就不說了。

 

4、《J2EE核心模式》介紹了15J2EE的設計模式,對如何設計一個結構良好的應用很有幫助,不過他有些模式使用的技術有些過時。

 

5、《實用J2EE設計模式編程指南》這是一本新書,裏面既有《J2EE核心模式》中的15J2EE設計模式,又涉及了TheServerSide.com模式倉庫(讀者可以訪問模式倉庫)中的17J2EE設計模式。

 

6關於Struts,請參考Apache Struts網站

 

7、關於JavaServer Faces,請參考SunJavaServer Faces網站

 

 

 

其餘部分請參考:

http://www.csdn.net/Develop/read_article.asp?id=18787 Servlets和JSP開發原則(上)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章