MVC框架 大PK

1,Struts1.x
所有客戶端Http請求發送至Struts的核心控制器ActionServlet, 它會根據Struts-config.xml配置文件,找到相應的Action類。同時將請求參數封裝到ActionForm。Action調用Model層的業務方法,根據結果,Action返回ActionForm對象。
--------------------------------------------------------------------

2,JSF
客戶端通過事件觸發,將請求通知給JSF的核心控制器FacesServlet, FacesServlet會創建一個FacesContext對象,它裏面包含了處理請求所必須的信息,接着FacesServlet會將控制權交給LifeCycle處理器。
(LifeCycle生命週期):
恢復視圖 ----》 應用請求值 ----》處理驗證 ----》更新模型值 ----》調用應用程序
----》 呈現響應
-------------------------------------------------------------------
3,SpringMVC
客戶端發送請求到Spring的核心控制器DispacherServlet,它會根據配置文件
(xxx-servlet.xml)找到對應的處理器Handler
Handler處理完業務邏輯後將返回ModelAndView給DispatherServlet. ModelAndView包含了視圖邏輯和渲染視圖所需用到的模型數據對象,由於ModelAndView包含的是視圖邏輯名,所以需通過ViewResolver來完成解析,最後DispatherServlet將請求分派給View對象。
------------------------------------------------------------------

4,WebWork
瀏覽器發送的請求都被ServletDispacher截獲,ServletDispather根據服務名,解析對應的Action名。AppalicationContext,遍歷HttpServletRequest,HttpSession,ServletContext中的數據,將其複製到WebWork的Map實現中,至此之後,數據操作在Map結構中進行,完成內部結構與ServletAPI的分離
ActionProxyFactory根據xwork配置文件(xwork.xml)創建ActionProxy實例,ActionProxy中包含Action的配置信息。
ActionProxy創建相應對應的Action實例,並根據配置進行一系列的處理程序,包含執行相應的預處理程序以及對Action運行結果進行處理。
-----------------------------------------------------------------

5,Struts2
a,瀏覽器發送請求,
b,核心控制器FilterDispather根據請求決定調用合適的Action
c,WebWork的攔截器鏈自動對請求應用通用功能,例如WorkFlow,Validation或文件上傳等功能
d,回調Action的execute方法處理結果信息將被輸出到瀏覽器中,可以是HTML頁面,圖像,也可以是PDF文檔或者其他文檔。此時支持的視圖技術非常多,既支持JSP,也支持Velocity,FreeMarker等模板技術。
----------------------------------------------------------------


Struts1.x存在的問題?
1,支持的表示層技術單一
2,與ServletAPI嚴重耦合,難於測試。
3,代碼嚴重依賴於Struts1API,屬於侵入式設計
----------------------------------------------------------------

Struts2與Struts1的對比
1,在Action實現類方面:Struts1要求Action類繼承一個抽象基類;Struts1的一個具體問題是使用抽象類編程而不是接口。Struts2 Action類可以實現一個Action接口,也可以實現其他接口,使可選和定製服務成爲可能。 Struts2 提供一個ActionSupport基類 去實現常用的接口。即使Action接口不是必須實現的,只有一個包含execute方法的POJO類都可以用作Struts2的Action。
2,線程模式方面:Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能做的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的;Struts2 Action對象爲每一個請求
產生一個實例,因此沒有線程安全問題。

3,Servlet依賴方面:Struts1 Action依賴於Servlet API,因爲Struts1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。Struts2 Action 不再依賴於ServletAPI,從而允許Action脫離Web容器運行,從而降低了測試Action的難度。當然,如果Action 需要直接訪問HttpServletRequest和HttpServletResponse參數,Struts2 Action仍然可以訪問它們。但是,大部分時候,Action都無需直接訪問HttpServletRequest和HttpServletResponse,從而給開發者更多靈活的選擇。

4,可測試方面:測試Struts1 Action的一個主要問題是execute方法依賴於Servlet於ServletAPI, 這使得Action 仍然的測試要依賴於Web容器。爲了脫離Web容器測試Struts1 的Action, 必須藉助於第三方擴展:Struts TestCase,該擴展下包含了系列的Mock對象,從而脫離Web容器測試Struts1的Action類。Struts2 Action可以通過初始化,設置屬性,調用方法來測試。

5,封裝請求參數方面:Struts1 使用ActionForm對象封裝用戶的請求參數,所有的ActionForm 必須繼承一個基類:ActionForm。 普通的JavaBean不能用作ActionForm
因此,開發者必須創建大量的ActionForm類封裝用戶請求參數。雖然Struts1 提供了動態ActionForm 來簡化 ActionForm 的開發,但依然需要在配置文件中定義ActionForm; Struts2 直接使用Action 屬性來封裝用戶請求屬性,避免了開發者需要大量開發ActionForm類的繁瑣,實際上,這些屬性還可以是包含子屬性的Rich對象類型。如果開發者依然懷念Struts1 ActionForm 的模式,Struts 2 提供了ModelDriven 模式, 可以讓開發者使用單獨的Model 對象來封裝用戶請求參數,但該Model對象無須繼承任何Struts2基類,是一個POJO,從而降低了代碼污染。

6,表達式語言方面:Struts1 整合了JSTL,因此可以使用JSTL表達式語言。這種表達式語言有基本對象圖遍歷,但在對集合和索引屬性的支持上則功能不強;Struts2 可以是用JSTL,但它整合了一種更強大和靈活的表達式語言:OGNL(Object Graph Notation Language),因此,Struts2下的表達式語言功能更加強大。

7,綁定值到視圖方面:Struts1 使用標準JSP機制把對象綁定到視圖頁面;Struts2 使用“ValueStack”技術,使標籤能夠訪問值,而不需要把對象和視圖頁面綁定在一起。

8,類型轉換的方面:Struts 1 ActionForm 屬性通常都是String 類型。 Struts1 使用
Commons-Beanutils 進行類型轉換,支持基本數據類型和常用對象之間的轉換。

9,數據校驗的方面:Struts1 支持在ActionForm 重寫 validate方法手動校驗,或者通過整合Commons alidator框架來完成數據校驗。Struts2 支持通過重寫validator方法進行校驗,也支持整合XWork校驗框架進行校驗

10,Action執行控制的方面:Struts1 支持每一個模塊對應一個請求處理(既生命週期的概念),但是模塊中的所有Action必須共享相同的生命週期。Struts2支持通過攔截器堆棧爲每一個Action 創建不通的生命週期。開發者可以根據需要創建相應堆找,從而和不同的Action一起使用。

-----------------------------------------------------------------------------------
WebWork 和 Struts2對比
從某種程度上來看,Struts2是WebWork的升級,而不是Struts1的升級,甚至在Apache的Struts2的官方文檔都提到:WebWork到Struts2是一次平滑的過渡。實際上,Struts2 其實是WebWork2.3而已,從WebWork2.3 遷移到Struts2.0 不會比WebWork2.1到2.2更麻煩。
在很多方面,Struts2 僅僅是改變了WebWork 下的名稱,因此,如果開發者具有WebWork 的開發經驗,將可以更加迅速地進行Struts2的開發領域。
另外,Struts2 刪除了WebWork中少量的特性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章