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頁面上寫結果來直接回應一個用戶請求,或者它可以讓一個應用程序流動到其
它地方做回應。