天天看點

Servlets和JSP開發原則(下)

Servlets和JSP開發原則(下)
  • 不要“重新發明輪子”,不要一切從頭開始: 通過定制元件可以提高複用性,不過定制元件仍然需要編寫、測試和調試程式。問題是這個事情别人可能已經實作了,而且你的實作方式并不一定比人家做得更好。這就是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有關的事務。
  • 最好采用 JSP XML 文法: JSP技術中經常存在着兩種完成同一個任務的文法,一種是正常的JSP文法,一種是對應的XML文法。雖然兩種文法作用相同,你最好還是使用XML文法。存在兩種文法的原因是,JSP文法可以與以前的代碼相容,而J2EE使用XML作為其交換資料的核心,是以同時提供了XML文法。随着J2EE的發展,XML的作用會越來越大,是以我建議你使用XML文法。
  • 研究 Sun 提供的 J2EE BluePrints : Sun的Enterprise BluePrints 提供了大量指導原則、設計模式和很好的例子(寵物店,Pet Store)。你可以好好研究一下這些内容,這樣可以提高你的設計和開發水準。
整合 Servlet JSP

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

Servlets和JSP開發原則(下)

圖2: JSP模型一

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

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

Servlets和JSP開發原則(下)

圖3: JSP模型二

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

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

其他:

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

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

1、《Servlet和JSP權威指南》,它的網站為http://www.moreservlets.com/,這裡還有作者的另外一本書《Core Servlet and JSP》的PDF版本可以免費下載下傳。這本書詳細介紹了Servlet、JSP、Tag标記庫、JSTL、MVC和Servlet容器模型等等技術,是一本比較全面的關于使用Java開發Web應用的書。它的缺陷就在于為了與以往程式相容,它在很多地方使用了JSP1.1的文法,當然對于熟悉JSP曆史的讀者來說,這并沒有什麼影響。

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

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

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

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

6、關于Struts,請參考Apache Struts網站。

7、關于JavaServer Faces,請參考Sun的JavaServer Faces網站。

其餘部分請參考:

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

繼續閱讀