6 運用你的Strut

 瞭解MVC架構對於用Struts構建的強大的Web應用程序很重要


Struts是雅加達的一個項目,它提供了一個方法,可以在一個Web應用程序中一起使用JavaServer Pages(JSP)和servlets。它的目的是要解決完全由JSP或完全由servlet實現的應用程序中的固有的問題。 例如,servelts可以生成HTML頁面,但這麼做很麻煩。另一方面,JSP可以很容易地用於傳統的HTML頁面,但JSP頁面有其它的缺點。特別是,用JSP很難將內容同內容的顯示分開。 很容易將Java 代碼同HTML混在一起,結果做出的東西又慢又難以維護。

 

然而,因爲JSP頁面容易使用,所以它們成爲用Java構建動態的Web應用程序的首選方法。除了容易編程外,JSP頁面也被改進了,所以現在它們克服了以前的某些侷限性。JavaBeans和標記庫只是在基礎的JSP技術上的幾個改進。這種類型的方法——JSP頁面單獨負責處理輸入的請求和回覆客戶端——被稱爲Model 1架構。

JavaServer Pages是servlets的特殊情況,所以兩者可以一起工作以彌補每個的不足,這似乎是合乎邏輯的。這種類型的方法——你的Web架構包含截然不同的但又互聯的處理數據模式、顯示代碼和程序控制邏輯的JSP和servlet組件——被稱爲Model 2架構,或Model-View-Controller(MVC)架構。

爲了使用Struts架構以及用JSP和servlets有效地編程,對MVC架構的瞭解是很必要的。Model 1和MVC架構的主要不同就是請求是在哪裏處理的。在Model 1架構中,請求通過JSP接收,主要通過JSP處理。如果JSP頁面需要來自任何其它應用程序組件的服務,如一個數據庫,那麼你就從頁面做適當的調用,把數據返回到頁面,安排數據的格式並顯示出來。你可以把一些代碼放到一個或多個JavaBean中,但是這麼做本身沒有將邏輯同顯示完全分離。

MVC方法採用了JSP和servlet方法的最佳特性,使這兩種技術可以協同工作。明確的是,servlet是處理層(控制器)。Servlet接收請求,很像Model 1架構中JSP頁面所做的那樣,並確定如何滿足那些請求。這就意味着,servlet控制輸入的請求和輸出的迴應。

商業邏輯體現了MVC架構中的模式。商業邏輯代碼爲頁面做處理。如果進入servlet的請求是一個數據庫查詢,servlet就將這個請求傳送到一個SQL調用或類似的數據庫代碼。如果請求是一個包括輸入信用卡號的購買請求,那麼事物處理代碼就接管了。在某種意義上,架構的模式部分是讓應用程序處於領先地位的全部原因。

JSP頁面是顯示層(視圖),是用戶與應用程序交互的地方。它提供輸入並顯示結果。頁面不應該包括任何腳本。它只是將數據傳送到servlet,並接收和顯示返回的數據。

該架構的優勢應該是很明顯的。首先,它將計算和顯示清楚地分開了。結果很理想,在JSP頁面上沒有出現處理過程,在servlet或商業邏輯中沒有數據格式。這種分離的另一個好處是Java程序員可以專注於servlet代碼,HTML編寫者可以專注於JSP。 第二點,控制器servlet做頁面上的所有的決定。 在你的頁面和邏輯中不會出現任何決策。這就提高了一個應用程序的性能和可擴展性,因爲請求可以被導向架構的不同的組件,甚至是不同的服務器。

運用MVC架構
MVC架構沒有必要成爲用於所有Java應用程序的最佳方法。 如你想象的那樣,它在準備和編碼時往往很複雜——這對簡單的應用程序來說是沒必要的。當頁面導航相對來說比較簡單和固定,而且應用程序中的頁面結構可以由一個簡單的目錄結構管理時, Model 1架構仍然是最好的方法。這些應用程序往往將頁面流動信息嵌入到頁面間的鏈接中。(JSP中出現forward()就告訴你,在該頁中有嵌入的邏輯,讓你對顯示下一頁作出決定。)對於對流量或可擴展性需求有限的靜態的應用程序來說,標準的JSP模式仍然是一個可行的選擇方案。

在一些情況下,你可能想把一個JSP應用程序移植到MVC架構中。例如,你可能開始時用的是Model 1,簡單的JSP架構,隨着你的需求的增加,你會發現維護起來太複雜或太難了。如果你花很長的時間對應用程序做相對來說較簡單的修改,或者如果你經常在你的代碼中發現bug,那麼你的JSP導向的應用程序也許就不再是合適的方法了。
隨着應用程序的發展和變化,頁面的流動和商業邏輯也增加了。應用程序變得難以維護,因爲頁面流動邏輯跨多個頁面分佈,而且商業邏輯可能開始存在於未計劃的地方。從Model 1轉到MVC的最佳時機就是當這些類型的維護問題出現的時候。

你也可以預先計劃將你的應用程序從一個架構移植到另一個架構。當你的應用程序中的JSP頁面包含腳本元素,定製標記或JavaScript來執行一個forward()操作時,你可能想調整你最初的設計,變成一種用MVC架構的設計。

Refactoring用在這兒是個不錯的術語。它指的是以一種高度嚴謹的方式重建代碼結構的一種技術。當你的代碼變得難以理解、修改和調試時,你通常就開始考慮調整了。你可以用幾種方式來調整代碼:你可以簡單地重新命名變量和方法,或者將部分代碼移植到不同類型的執行模式中。更多的關於調整及其技術方面的信息,請訪問Martin Fowler的網站www.refactoring.com 或者閱讀他寫的書 Refactoring: Improving the Design of Existing Code。

在許多情況下,一開始就選擇MVC架構是很有意義的,例如你的應用程序是爲廣泛的企業應用而設計的,或者在幾年內,你的應用程序可能擴展到一個相當高的流量。 設計一個MVC架構需要有深謀遠慮。大多數程序員發現寫邏輯腳本或JavaBeans,以及用HTML顯示很容易。當你設計一個MVC架構時,你必須首先進行一個完整的設計。這就意味着,分析需要處理的請求的類型,確定哪些組件(JavaBean、數據庫或其它servlets)將處理這些請求,以及對那些請求的迴應是如何顯示給用戶的。 該設計的關鍵就是請求和數據的流動性。爲MVC架構設計應用程序組件只是對你現在用JSP和servlets所做工作的擴展。面臨的挑戰就是構建一個servlet,它接收請求並把那些請求分到應用程序的不同的組件。將一個數據庫請求傳送到一個數據庫,或將一個處理請求傳送到一個JavaBean是很容易的,但是如果一個請求包含這兩種元素,會怎樣呢?或者如果請求的性質在一些處理出現前不能確定,又怎樣呢?

Struts 構架
該挑戰使我們又回到Struts構架。Struts提供了一個實現MVC架構的高度自動化的方式。它的結構實現了MVC,幷包括一個控制器servlet、一組JSP頁面和應用程序的商業邏輯。控制器將用戶請求打包,並把它們導向架構中的其他對象。

Struts構架是圍繞一個ActionMapping 結構的。控制器用 ActionMapping 把HTTP消息形式的用戶請求轉換成應用程序的動作。ActionMapping指定請求的路徑、計劃處理請求的對象以及任何服務該請求需要的其它信息。ActionMapping創建了一個 Action 對象來處理請求。一旦Action對象完成了一個任務,它就通過在一個JSP頁面上寫結果來直接回應一個用戶請求,或者它可以讓一個應用程序流動到其它地方做迴應。

下個月,我將講述一下將MVC模式用於Struts構架的細節問題。然後,我將用Struts來設計和實現一個Web應用程序,該程序將servlet控制器作爲計劃執行用戶請求的Action對象的“調度”基礎。

關於Struts構架的更多信息,請參閱Tim Holloway寫的封面文章"Struts: a Solid Web-App Framework"。

發佈了20 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章