| 導購 | 订阅 | 在线投稿
分享
 
 
 

Struts與MVC模式

來源:互聯網  2007-09-21 05:03:13  評論

在我前面的那篇<<再戰MVC(二)>>最後也說到了:MVC本身就是一個非常複雜的系統,所以采用MVC實現Web應用時,如果采用現成的MVC框架,在此之下進行開發,能夠達到事半功倍的效果。因爲如果說要想在一些有限的時間裏構造出來一個正確並且是可維護性的應用程序,我們必須有一個好的工具或者框架來建立表現層, 縱觀目前在開源社區中針對Web表現層的開源框架webwork,struts等,struts是一個不錯的選擇,因爲Struts有完整的文檔並且相對來講比較簡單。

對MVC體系結構還有一些常用設計模式有了一定的認識之後,回過頭來再次看那本Struts開發者寫的<<struts in action>>,特別是發現第二章的“研究Struts體系結構”能讓你看了對MVC模式以及Struts的體系結構有更深刻的理解,個人感覺這一章是整本書的精華的地方。

Model 1跟Model 2

有關Model 1跟Model 2的介紹在之前的<<再戰MVC>>的兩篇文章中已經介紹了,總的來說就是Servlet可以應付控制流,而 JSP則可專注于編寫HTML的任務。

控制層使應用層和視圖去耦合

認爲區別于MVC 的一個原因是,觀察者/通知模式不能在web 環境內工作 Model 2 並不合適。HTTP 是一個 “拉” 的協議: 客戶請求然後服務器響應。沒有請求就沒有相應。觀察者模式需要一種“推”協議來進行通知,以便服務器能在模型改變時將信息推送到客戶端。書上提到,雖然也有一些方法能模擬將數據推送到客戶端,但這和基本情況相悖,並且會視爲是權宜的修補。

王朝网络

MVC 通常表示爲3個互相連接的組件

上圖是典型的MVC模式,經常被表示爲:一個互相連接的三角形。對于一個基于Web的應用程序而言,是很難維護該三角形的“改變通知(state query/change notification)”這一部分。 這些東西在所有資源都在一台服務器上,而且客戶端保持一個開放連接的情況下工作得非常好。如果資源分布在不同的服務器上,並且客戶端不能維護一個開放的連接情況下,工作的並不理想。 許多分布式系統架構,包括web應用,在視圖進行狀態查詢的概念時退縮了。針對這種不同,絕大多數情況是入分層的概念來設計的,層內的對象可以和同一層或者相鄰層的對象進行通信。在一個複雜應用中,這可以在添加組件時,防止依賴關系呈指數增長。對于分布式應用程序而言,“分層“模式是設計中的核心模式。

王朝网络
正如上圖上所示,使用平面設計而不是傳統的MVC設計方式。控制層處于表現層(視圖)和應用程序邏輯(模式)之間。

從MVC 上下文中,引入層模式將狀態改變和狀態查詢的職責加于控制器之上,並伴隨 著改變通知。

每一個模塊的主要職責並沒有改變。流程有輕微改變,即查詢狀態和改變通知都

必須通過控制器。另一個改變是當視圖(表現層)生成動態內容時,它使用由控制器提供的數據而不是直接由模式提供的數據。所以說這樣的改變使得視圖更加和模式無關了,即由控制器來選擇數據並顯示數據的視圖,這樣就從根本上去除了View 和 Model的耦合。

Struts框架與Servlet

我們知道Sun的Java Servlet作爲一個基本的平台來爲基于Java的Web應用程序提供了很多重要的功能。從Servlet API我們可以發現,Servlet提供了一個基本的接口來處理HTTP的請求和響應,而且我們可以用Session的上下文或其它的上下文(如請求上下文request)來作爲跟蹤應用程序的用戶的重要的手段。其實大部分表現層框架都有一個共性的地方:以Servlet API爲基礎,封裝一些那些經常要處理的而且是令人厭煩的、繁瑣的實現細節,比如說:在一個Web應用中,表單數據的接收是一件經常要做的事,因爲有大量的來自客戶端用戶提交的表單,然後針對這些表單,我們總是要詳細分析Http請求來取出頁面表單的值來。Struts是一個比較好的MVC體系結構的框架,提供了對開發MVC系統的底層支持,采用的主要技術是Servlet,JSP和Custom tag library。

Struts框架的組件結構圖

王朝网络

從上面的組件結構圖我們可以看出來,Struts的核心ActionServlet是一個MVC風格的控制器,它是連接應用程序的Model和View之間的一座橋梁。

Struts跟Model 2, MVC, 層

層模式,在<<UML和模式應用>>第3版(Applying UML and Patterns)這本書講到邏輯架構時說到了有關層模式的概念,其中有一個准則叫做:模型-視圖分離原則。這個原則規定模型(領域)對象不應該直接與視圖(UI)對象連接。Struts 通過提供一個控制器ActionServlet實現了Sun的 Model 2 架構,這個控制器可以用來管理JSP頁面和ActionMapping來保證表現層之外的控制流決策來實現MVC/層模式,通過Struts的配置文件,JSP可以引用一個邏輯目標。控制器組件在運行時提供准確的URI。 供一個控制器Servlet實現了Sun的 Model 2 架構,其他表現設備之間的流程。Struts 通過使用ActionForward MVC/層 模式。

下表列出了Struts的核心類,即對應的經典的MVC組件職責。

核心Struts 類和MVC的對應

王朝网络

除了這些核心類,Struts使用一些配置文件和視圖助手(view helpers)來溝通控制器和模型。下表列出了Struts 配置文件和描述了他們在架構中的角色。爲將Struts配置數據暴露給視圖,框架以JSP標簽的形式提供了大量的助手類,這些都是struts自定義標簽,如下表:

王朝网络

Strtuts配置文件

王朝网络

將以上內容放在一起,下表按層列出了Struts 組件:

Struts 組件,按層索引

王朝网络

在<<UML和模式應用>>這本書裏提到了層模式中的組件應該只能和相同層和相鄰層的組件交互。因此,Model 組件不能直接和View組件進行交互。我們還可以從上表中看出來,Struts中的大部分的組件其實是屬于控制層的組件,因爲Struts沒有對模型層有嚴格的規定,我們可以用EJB或者其它的開源框架等。

實踐中,控制器與視圖的交互通過請求(request),會話(session)以及Servlet平台提供的應用上下文進行(context)。 控制器和模型的交互通過文件和存儲系統完成 (比如裝入sturts的XML配置文檔或者屬性文件),或者通過其他服務,如TCP, 創建一個到JDBC數據庫的連接。

在我前面的那篇[url=http://blog.csdn.net/lin_bei/archive/2006/08/18/1095236.aspx]<<再戰MVC(二)>>[/url]最後也說到了:MVC本身就是一個非常複雜的系統,所以采用MVC實現Web應用時,如果采用現成的MVC框架,在此之下進行開發,能夠達到事半功倍的效果。因爲如果說要想在一些有限的時間裏構造出來一個正確並且是可維護性的應用程序,我們必須有一個好的工具或者框架來建立表現層, 縱觀目前在開源社區中針對Web表現層的開源框架webwork,struts等,struts是一個不錯的選擇,因爲Struts有完整的文檔並且相對來講比較簡單。 對MVC體系結構還有一些常用設計模式有了一定的認識之後,回過頭來再次看那本Struts開發者寫的<<struts in action>>,特別是發現第二章的“研究Struts體系結構”能讓你看了對MVC模式以及Struts的體系結構有更深刻的理解,個人感覺這一章是整本書的精華的地方。 Model 1跟Model 2 有關Model 1跟Model 2的介紹在之前的[url=http://blog.csdn.net/lin_bei/archive/2006/08/18/1095236.aspx]<<再戰MVC>>的兩篇文章中已經介紹了,總的來說就是Servlet可以應付控制流,而 JSP則可專注于編寫HTML的任務。[/url] 控制層使應用層和視圖去耦合 認爲區別于MVC 的一個原因是,觀察者/通知模式不能在web 環境內工作 Model 2 並不合適。HTTP 是一個 “拉” 的協議: 客戶請求然後服務器響應。沒有請求就沒有相應。觀察者模式需要一種“推”協議來進行通知,以便服務器能在模型改變時將信息推送到客戶端。書上提到,雖然也有一些方法能模擬將數據推送到客戶端,但這和基本情況相悖,並且會視爲是權宜的修補。 [img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190322192224.jpg[/img] MVC 通常表示爲3個互相連接的組件 上圖是典型的MVC模式,經常被表示爲:一個互相連接的三角形。對于一個基于Web的應用程序而言,是很難維護該三角形的“改變通知(state query/change notification)”這一部分。 這些東西在所有資源都在一台服務器上,而且客戶端保持一個開放連接的情況下工作得非常好。如果資源分布在不同的服務器上,並且客戶端不能維護一個開放的連接情況下,工作的並不理想。 許多分布式系統架構,包括web應用,在視圖進行狀態查詢的概念時退縮了。針對這種不同,絕大多數情況是入分層的概念來設計的,層內的對象可以和同一層或者相鄰層的對象進行通信。在一個複雜應用中,這可以在添加組件時,防止依賴關系呈指數增長。對于分布式應用程序而言,“分層“模式是設計中的核心模式。 [img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190322192364.jpg[/img] 正如上圖上所示,使用平面設計而不是傳統的MVC設計方式。控制層處于表現層(視圖)和應用程序邏輯(模式)之間。 從MVC 上下文中,引入層模式將狀態改變和狀態查詢的職責加于控制器之上,並伴隨 著改變通知。 每一個模塊的主要職責並沒有改變。流程有輕微改變,即查詢狀態和改變通知都 必須通過控制器。另一個改變是當視圖(表現層)生成動態內容時,它使用由控制器提供的數據而不是直接由模式提供的數據。所以說這樣的改變使得視圖更加和模式無關了,即由控制器來選擇數據並顯示數據的視圖,這樣就從根本上去除了View 和 Model的耦合。 Struts框架與Servlet 我們知道Sun的Java Servlet作爲一個基本的平台來爲基于Java的Web應用程序提供了很多重要的功能。從Servlet API我們可以發現,Servlet提供了一個基本的接口來處理HTTP的請求和響應,而且我們可以用Session的上下文或其它的上下文(如請求上下文request)來作爲跟蹤應用程序的用戶的重要的手段。其實大部分表現層框架都有一個共性的地方:以Servlet API爲基礎,封裝一些那些經常要處理的而且是令人厭煩的、繁瑣的實現細節,比如說:在一個Web應用中,表單數據的接收是一件經常要做的事,因爲有大量的來自客戶端用戶提交的表單,然後針對這些表單,我們總是要詳細分析Http請求來取出頁面表單的值來。Struts是一個比較好的MVC體系結構的框架,提供了對開發MVC系統的底層支持,采用的主要技術是Servlet,JSP和Custom tag library。 Struts框架的組件結構圖 [img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190322192521.png[/img] 從上面的組件結構圖我們可以看出來,Struts的核心ActionServlet是一個MVC風格的控制器,它是連接應用程序的Model和View之間的一座橋梁。 Struts跟Model 2, MVC, 層 層模式,在<<UML和模式應用>>第3版(Applying UML and Patterns)這本書講到邏輯架構時說到了有關層模式的概念,其中有一個准則叫做:模型-視圖分離原則。這個原則規定模型(領域)對象不應該直接與視圖(UI)對象連接。Struts 通過提供一個控制器ActionServlet實現了Sun的 Model 2 架構,這個控制器可以用來管理JSP頁面和ActionMapping來保證表現層之外的控制流決策來實現MVC/層模式,通過Struts的配置文件,JSP可以引用一個邏輯目標。控制器組件在運行時提供准確的URI。 供一個控制器Servlet實現了Sun的 Model 2 架構,其他表現設備之間的流程。Struts 通過使用ActionForward MVC/層 模式。 下表列出了Struts的核心類,即對應的經典的MVC組件職責。 核心Struts 類和MVC的對應 [img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190322192724.jpg[/img] 除了這些核心類,Struts使用一些配置文件和視圖助手(view helpers)來溝通控制器和模型。下表列出了Struts 配置文件和描述了他們在架構中的角色。爲將Struts配置數據暴露給視圖,框架以JSP標簽的形式提供了大量的助手類,這些都是struts自定義標簽,如下表: [img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190322192849.jpg[/img] Strtuts配置文件 [img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190322192974.jpg[/img] 將以上內容放在一起,下表按層列出了Struts 組件: Struts 組件,按層索引 [img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190322193146.jpg[/img] 在<<UML和模式應用>>這本書裏提到了層模式中的組件應該只能和相同層和相鄰層的組件交互。因此,Model 組件不能直接和View組件進行交互。我們還可以從上表中看出來,Struts中的大部分的組件其實是屬于控制層的組件,因爲Struts沒有對模型層有嚴格的規定,我們可以用EJB或者其它的開源框架等。 實踐中,控制器與視圖的交互通過請求(request),會話(session)以及Servlet平台提供的應用上下文進行(context)。 控制器和模型的交互通過文件和存儲系統完成 (比如裝入sturts的XML配置文檔或者屬性文件),或者通過其他服務,如TCP, 創建一個到JDBC數據庫的連接。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有