比較
基於Web的MVC framework在J2EE的世界內已是空前繁榮。TTS網站上幾乎每隔一兩個星期就會有新的MVC架構發布。目前比較好的MVC,老牌的有Struts、Webwork。新興的MVC架構有Spring MVC、Tapestry、JSF等。這些大多是著名團隊的作品,另外還有一些邊緣團隊的作品,也相當出色,如Dinamica、VRaptor等。這些架構都提供了較好的層次分隔能力。在實現良好的MVC 分隔的基礎上,通過提供一些現成的輔助類庫,同時也促進了生產效率的提高。
如何選擇一個好的架構應用在你的項目中,將會對你的項目的效率和可重用是至關重要的。本文將對目前最流行、最常用的兩種framework進行介紹。
一、Struts
Struts是Apache軟體基金下Jakarta項目的一部分。Struts架構的主要架構設計和開發人員是Craig R.McClanahan。Struts是目前Java Web MVC架構中不爭的王者。經過長達五年的發展,Struts已經逐漸成長為一個穩定、成熟的架構,並且佔有了MVC架構中最大的市場份額。但是Struts某些技術特性上已經落後於新興的MVC架構。面對Spring MVC、Webwork2 這些設計更精密,擴充性更強的架構,Struts受到了前所未有的挑戰。但站在產品開發的角度而言,Struts仍然是最穩妥的選擇。
Struts有一組相互協作的類(組件)、Serlvet以及jsp tag lib組成。基於struts構架的web應用程式基底本上符合JSP Model2的設計標準,可以說是MVC設計模式的一種變化類型。根據上面對framework的描述,我們很容易理解為什麼說Struts是一個web framwork,而不僅僅是一些標記庫的組合。但 Struts 也包含了豐富的標記庫和獨立於該架構工作的公用程式類。Struts有其自己的控制器(Controller),同時整合了其他的一些技術去實現模型層(Model)和視圖層(View)。在模型層,Struts可以很容易的與資料訪問技術相結合,包括EJB,JDBC和Object Relation Bridge。在視圖層,Struts能夠與JSP, Velocity Templates,XSL等等這些展示層組件想結合。
Struts的體繫結構
struts framework是MVC 模式的體現,下面我們就從分別從模型、視圖、控制來看看struts的體繫結構(Architecture)。
從視圖角度(View)
主要由JSP建立,struts自身包含了一組可擴充的自訂標籤庫(TagLib),可以簡化建立使用者介面的過程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags這幾個Taglib。有關它們的詳細資料請參考struts使用者手冊。
從模型角度(Model)
模型主要是表示一個系統的狀態(有時候,改變系統狀態的商務邏輯操作也劃分到模型中)。在Struts中,系統的狀態主要有ActiomForm Bean體現,一般情況下,這些狀態是非持久性的。如果需要將這些狀態轉化為持久性資料存放區,Struts本身也提供了Utitle包,可以方便的與資料庫操作。
從控制器角度(Controller)
在Struts framework中,Controller主要是ActionServlet,但是對於商務邏輯的操作則主要由Action、ActionMapping、ActionForward這幾個組件協調完成(也許這幾個組件,應該劃分到模型中的商務邏輯一塊)。其中,Action扮演了真正的商務邏輯的實現者,而ActionMapping和ActionForward則指定了不同商務邏輯或流程的運行方向。
對於Struts 如何控制、處理客戶請求,讓我們通過對struts的四個核心組件介紹來具體說明。這幾個組件就是:ActionServlet。Action Classes,Action Mapping(此處包括ActionForward),ActionFrom Bean。
二、Spring
Spring實際上是《Expert One-on-One J2EE Design and Development》一書中所闡述的設計思想的具體實現。在One-on-One一書中,Rod Johnson 倡導J2EE 實用主義的設計思想,並隨書提供了一個初步的開發架構實現(interface21 開發包)。而Spring 正是這一思想的更全面和具體的體現。Rod Johnson在interface21 開發包的基礎之上,進行了進一步的改造和擴充,使其發展為一個更加開放、清晰、全面、高效的開發架構。
Spring是一個開源架構,由Rod Johnson建立並且在他的著作《J2EE設計開發編程指南》裡進行了描述。它是為瞭解決公司專屬應用程式開發的複雜性而建立的。Spring使使用基本的JavaBeans來完成以前只可能由EJB完成的事情變得可能了。然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。
簡單來說,Spring是一個輕量的控制反轉和面向切面的容器架構。當然,這個描述有點過於簡單。但它的確概括出了Spring是做什麼的。為了更好地理解Spring,讓我們分析一下這個描述:
1、輕量
從大小與開銷兩方面而言Spring都是輕量的。完整的Spring架構可以在一個大小隻有1MB多的JAR檔案裡發布。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於輕量,從大小與開銷兩方面而言Spring都是輕量的。完整的Spring架構可以在一個大小隻有1MB多的JAR檔案裡發布。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類。
2、控制反轉
Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用了IoC,對象被動地傳遞它們的依賴而不是自己建立或者尋找依賴對象。你可以認為IoC與JNDI相反??不是對象從容器中尋找依賴,而是容器在對象初始化時不等被請求就將依賴傳遞給它。
3、面向切面
Spring包含對面向切面編程的豐富支援,允許通過分離應用的商務邏輯與系統服務(例如審計與事物管理)進行內聚性的開發。應用對象只做它們應該做的,完成商務邏輯,僅此而已。它們並不負責(甚至是意識)其它的系統關注點,例如日誌或事物支援。
4、容器
Spring包含和管理應用對象的配置和生命週期,在這個意義上它是一種容器。你可以配置你的每個bean如何被建立?基於一個配置原形為你的bean建立一個單獨的執行個體或者每次需要時都產生一個新的執行個體以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量的EJB容器,它們經常是龐大與笨重的,難以使用。
架構:Spring是由簡單的組件配置和組合複雜的應用成為可能。在Spring中,應用對象被聲明式地組合,典型地是在一個XML檔案裡。Spring也提供了很多基礎功能(交易管理、持久性框架組成等等),將應用邏輯的開發留給了你。
所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的代碼。它們也為Spring中的各種子架構提供了基礎。