原文:https://herbertograca.com/2018/08/29/model-1-model-2/
這篇文章是軟件架構(gòu)編年史(譯)的一部分,這部編年史由一系列關(guān)于軟件架構(gòu)的文章組成。在這一系列文章中,我將寫下我對軟件架構(gòu)的學習和思考,以及我是如何運用這些知識的。如果你閱讀了這個系列中之前的文章,本篇文章的的內(nèi)容將更有意義。
JSP 是這樣一種技術(shù),它是可以與 PHP、ASP 或是 Python 比肩的腳本語言,用來創(chuàng)建服務(wù)端的頁面,這些頁面由 JVM 解釋,可以使用 Java 對象。
最早的 JSP 規(guī)范,于 1998 年由 Sun Microsystems 發(fā)布,定義了兩種組織應(yīng)用結(jié)構(gòu)的方式,因此,展現(xiàn)邏輯能夠以 HTTP 請求/響應(yīng)范式和業(yè)務(wù)邏輯甚至用例解耦。
有人認為 “Model 1” 和 “Model 2” 是最早將原本為桌面軟件開發(fā)上下文而生的 MVC 模式應(yīng)用到網(wǎng)絡(luò) HTTP 請求/響應(yīng)范式的嘗試。
Model 1
第一份 JSP spec. v0.92 提案,只是將 JSP 僅用作展現(xiàn)層的制品,它將包含全部展現(xiàn)層和用例邏輯。
![]() |
|---|
| “Model 1” (JSP spec. v0.92) |
這種方法對大多數(shù)當時的用例來說已經(jīng)足夠好了,因為那時大部分 Web 都是由簡單的動態(tài)頁面組成,而不是用我們現(xiàn)在所了解的復雜 Web 企業(yè)應(yīng)用組成。
Model 2
第二份關(guān)于如何使用 JSP 的提案是為了那時所謂的復雜 Web 應(yīng)用。但是,請記住,現(xiàn)在的 Web 應(yīng)用的規(guī)模和復雜性要高得多。
|
| “Model 2” (JSP spec. v0.92) |
在 “Model 2” 中,一個 HTTP 請求將抵達一個 Servlet;它會解釋 HTTP 請求,使用 Java 對象和 EJB(資源庫)執(zhí)行一些邏輯,將結(jié)果數(shù)據(jù)收集起來并將其傳給 JSP;而 JSP 將渲染發(fā)回給客戶端的頁面。在 “Model 2” 中,JSP 純粹作為模板引擎使用。
1999 年 Govind Seshadri 發(fā)表了一篇文章,他將 “Model 2” 和 MVC 做了映射:
- Controller 就是 Servlet,它控制著應(yīng)該為用戶請求做的事情;?
- View 就是 JSP,它決定了展現(xiàn)給用戶的內(nèi)容;
- Model,在 MVC 和 “Model 2” 中都是指整個領(lǐng)域模型。
我對這兩種模式的看法
挺奇怪的,“Model 2” 實際上是我學到的第一個版本的 “MVC”,就在不久之前。
最后,根據(jù)手頭上的項目的范圍和需求,兩種方法現(xiàn)在都可以發(fā)揮作用。
話雖如此,我認為現(xiàn)在的 Web 企業(yè)應(yīng)用需要更好的方法。
我發(fā)現(xiàn)這兩種模式共同的毛病是它們都沒有遵守單一職責原則。
當談到 “Model 1” 時,我希望每個人都清楚的看到被混在一起的關(guān)注點:我們會把模板邏輯和用例邏輯混在一起。
關(guān)于 “Model 2”,我發(fā)現(xiàn) View 和 Controller 都屬于展現(xiàn)層,可是Govind Seshadri 卻說得很清楚:“Model 2 架構(gòu)應(yīng)該導致所有的處理邏輯都集中在控制器 Servlet 之中”,盡管領(lǐng)域邏輯確實是放在外部的 Java 對象和 EJB 之中。
這意味著 “Model 2” 控制器包含了用例邏輯,它應(yīng)該屬于應(yīng)用層而不是展現(xiàn)層。
例如,如果我們要通過事件觸發(fā)一個現(xiàn)存的用例,我們需要在事件監(jiān)聽器中復制用例邏輯(已經(jīng)存在于某個控制器中),而這是一個很大的禁忌,因為這將導致維護性降低并可能導致應(yīng)用不一致(的問題)。
引用來源
1998 – Sun Microsystems – JavaServerTM PagesTM – Specification 0.92
1999 – Govind Seshadri – Understanding JavaServer Pages Model 2 architecture:
Exploring the MVC design pattern
2018 – Paul M. Jones – Model View Controller and “Model 2”
2018* – Wikipedia – JSP model 2 architecture
