MVC MVC是Model
View
Controller的簡稱
原本是建立Smalltalk 應用的框架
框架支持代表應用狀態
屏幕表現和控制流的
個類
他們分別叫做Model
View和Controller
在Model發生變化的時候
通知View改變
在View需要查詢狀態的時候
向Model發送請求
當View做出一個動作時
比如對數據的修改等
通知Controller
Controller得到狀態改變信息時
發送請求給Model
並且Controller負責選擇顯示新的View
下圖是典型的Model
View
Controller范式
經常被表示為
一個互相連接的三角形
圖 MVC 通常表示為個互相連接的組件 在Design Patterns: Elements of Reusable Object
Oriented Software一書中
作者以smalltalk MVC為例
贊揚了通知/訂閱者(notify/subscribe)協議和觀察者(Observer)模式的使用
其中局的一個經典的例子是對同一數據
系統可能需要不同的顯示視圖
比如條形圖
餅圖
數據表格等等
如下圖
圖不同的View使用相同的Model 圖
所示的每種視圖可能在同一時間顯示給不同的用戶
應用必須保證在其下面的數據或者模型改變時視圖的更新
為改變模型
用戶提交一個請求給控制器
由控制起來配合改變模型
數據視圖必須跟著改變
以反映最近的模型改變狀態
Smalltalk MVC 方案使用觀察者通知模式
在這種模式下
每個視圖注冊為一個模型數據的觀察者
然後模型可以通過發送消息給所有這冊觀察者
通知它們相關的改變
其為 Smalltalk MVC 框架已經通用化了
他也可以應用它其他平台上面
Model Model
是Sun公司為了解決JSP不易維護和功能塊難以復用提出的
Sun的技術人員
提出使用JSP 和 SERVLET同時來部署web 應用
SERVLET可以應付控制流
而 JSP則可專注於討厭的編寫HTML的任務
結合使用 JSP 和 SERVLET 開始被稱為Model
而單獨使用JSP稱為Model
Model
並不是什麼新的東西
其思想上實際是對MVC的一種繼承
很多場合
交互使用Model
和 MVC這兩個詞
但是還是存在一些爭論
即一個應用是否是 MVC
以及是否支持經典的觀察者通知模式
沒有觀察者通知的Model
View
Controller 有時被稱為MVC
或Web MVC
層模式的MVC結構 人們認為Model
不同於MVC的主要原因之一是
基於觀察者/通知模式的經典的MVC是難以在web環境下實現的
因為HTTP協議是一個請求/響應協議
客戶端有請求
服務器端才會有響應
沒有請求
就沒有響應
而觀察者/通知模式要求在服務器端發生變化時能主動給用戶端發消息更新
為了解決經典MVC模式難於在web環境下實現的問題
引入層模式將狀態改變和狀態查詢的職責加於控制器之上
並伴隨著改變通知
如圖
分層的web 應用使用一種比傳統MVC模式更加
扁平
的模式
控制器被夾在表現層(View) 和 應用邏輯 (Model)之間
圖 web應用的層模式 每個組件的主要職責並沒有改變
流程有輕微改變
View不再與Model有直接的聯系
而它們之間的交互都通過Controller
即查詢狀態和改變通知都必須通過控制器
當視圖
或者表現層需要加工動態頁面時
它使用從控制器傳遞的數據而不是直接來自於模型層
這種改變去除了View 和 Model的耦合
允許控制器選擇數據和顯示這些數據的視圖
Struts概要介紹 Struts實現層模式的MVC Struts是一個應用框架
它實現了層次化的MVC模式或者說Sun公司提出的Model
模式
在Model
模式的web編程中
Model部分可以交給EJB及JDBC實現
而View部分可以由Jsp完成
但是卻沒有合適的工具完成獨立的Contrroller
在Model
的思想提出由Servlet應付控制流
在Struts中Servlet就扮演了Front End Controller的角色
當客戶端提出請求
ActionServlet響應請求
並且在指定的Struts
Config
xml文件中查到請求對應的Action(Action是Struts引入的一個核心類
作為Back End Controller
在後文會介紹)
對已經實例化的Action
ActionServlet為這個新的請求開一個線程
對未實例化的Action
ActionServlet將其實例化
Action作為Back End Controller可以與Model部分交互
以實現狀態改變或者狀態查詢
Action還將返回下一步的視圖選擇給ActionServlet
ActionServlet根據對應的Struts
Config
xml找到視圖選擇對應物理地址
並把新的View返回給用戶端
圖 Struts實現層模式的MVC結構 另一種常見的關於Srtuts實現MVC模式的看法是認為只有ActionServlet是Controller
而把Action看作BusinessLogic
我認為
這種看法是沒有前一種將Action視為Back End Controller的看法合理的
因為Controller部分需要完成的視圖選擇實際上是由Action實現的
之所以會有後一種不太合適的關於Struts實現MVC結構的看法存在
主要是起源於編程習慣問題
很多人喜歡把大量的業務邏輯交給Action處理
我認為這是不太合適的
一方面
這樣降低了代碼的可復用性
另一方面使Action看起來臃腫
降低了可讀性
所以
推薦的編程方式是把大量的業務邏輯抽出做成JavaBean
以解放Action
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28626.html