說起MVC,感覺大家都能嘮個兩塊錢的。今天呢,我們也來簡單的聊一聊,並以Java Web開發為例,簡單的講解項目應當如何分層。
MVC之前
在Web開發早期,當Sun公司推出了JSP技術後,在當時是極大的震撼了整個行業,包括微軟後面推出的ASP也是針對JSP推出的反制手段。在早期使用JSP開發的Web應用中,JSP因為其強大的特性,以Java語言寫的代碼塊作為腳本,因此一個JSP文件是一個獨立的、能自主完成所有任務的模塊(其他的動態網站技術比如ASP、PHP也是如此),它可以負責處理業務邏輯、控制頁面跳轉和向用戶展示頁面等。

在上圖這個模式中,”全棧”開發似乎變得簡單了許多,只需要在JSP中開發就可以了。但這麼做的一個明顯的弊端,就是JSP頁面中的功能過於繁雜、耦合性太高,數據、業務邏輯、流程控制全都混雜在一起,使得程序後續難以維護和修改。
為了解決上述問題,SUN公司提供了一種JSP開發的架構模型,我們可以稱之為JSP Model1。在這個模型中,採用JSP+JavaBean(將萬物抽象成對象,提供一些屬性和對應的getter、setter方法)技術,將頁面的顯示和業務邏輯分開。

從上圖中,我們可以看到,JSP Model1將封裝數據和處理數據的業務邏輯交給了JavaBean組件,JSP只負責接收用戶的請求和調用JavaBean組件來響應用戶的請求。這種設計在一定程度上實現了數據、業務邏輯、頁面展示的分離,在一定程度上實現了程序開發的模塊化(分層),降低了程序間的耦合性,讓代碼的維護、修改成本有效的降低。
MVC設計模式
MVC設計是由[Xerox PARC](
https://baike.baidu.com/item/Xerox PARC)(施樂帕克,研究中心)在20世紀80年代為編程語言Smalltalk-80發明的一種軟件設計模式,提供了一種按照功能模塊劃分的指導思想。
MVC設計模式將應用程序分為三個核心模塊:模型(Model)、視圖(View)、控制器(Controller)。每個模塊的作用如下所示:
- 模型(Model):負責管理應用程序的業務數據、定義訪問控制以及修改這些數據的方法。
- 視圖(View):負責與用戶進行交互,它從模型中獲取數據向用戶展示,同時也能將用戶請求傳遞給控制器處理。
- 控制器(Controller):負責應用程序中處理用戶交互的部分,可以從視圖中取數據,控制用戶輸入,並向模型發送數據。

MVC模式廣泛的應用的於Web開發中,我們以Java Web開發來簡單說明應用程序應該怎麼樣劃分模塊:Controller層為Servlet,View層為JSP,Model層為JavaBean。圖中的步驟1、2、3、4是用戶進行請求時的處理流程。

三層架構
三層架構(3-tier architecture)通常是將整個業務應用劃分為:表示層(User show layer, USL)、業務邏輯層(Business Logic Layer, BLL)、數據訪問層(Data access layer, DAL)。其中每層的作用如下:
表示層:又稱表現層UI,位於三層構架的最上層,與用戶直接接觸,主要是用戶瀏覽的頁面,其主要功能是實現系統數據的傳入與輸出,在此過程中不需要藉助邏輯判斷操作就可以將數據傳送到BLL系統中進行數據處理,處理後會將處理結果反饋到表示層中;
業務邏輯層:中間層,對具體問題進行邏輯判斷與執行操作,當接收到表現層UI的用戶指令後,會連接數據訪問層,將數據庫訪問層的增刪改查進行組裝,並將處理結果返回給表示層;
數據庫訪問層:主要用於操作數據庫中的數據,實現數據的增刪改查操作,並將處理結果返回給業務邏輯層。
三層架構相比較於MVC是更宏觀的解決方案,MVC相當於對三層架構中的表示層。不管這兩個的哪一種,都是對應用程序進行分層,其目的就是實現高內聚、低耦合的目標,將程序分成不同的模塊,讓開發和維護變得更清晰明了。
項目分層
這裡給大家推薦《阿里巴巴Java開發手冊》中工程結構里約定的應用分層。

圖中默認上層依賴於下層,箭頭關係表示可直接依賴,如:開放接口層可以依賴於Web 層,也可以直接依賴於 Service 層,依此類推。每個層的定義我們簡單看下:
終端顯示層:各個端的模板渲染並執行顯示的層。當前主要是 velocity 渲染,JS 渲染,JSP 渲染,移動端展示等;
開放接口層:可直接封裝 Service 方法暴露成 RPC 接口;通過 Web 封裝成 http 接口;進行網關安全控制、流量控制等;
- Web層:主要是對訪問控制進行轉發,各類基本參數校驗,或者不復用的業務簡單處理等;
- Service層:相對具體的業務邏輯服務層;
- Manager層:通用業務處理層;
1) 對第三方平台封裝的層,預處理返回結果及轉化異常信息;
2) 對 Service 層通用能力的下沉,如緩存方案、中間件通用處理;
3) 與 DAO 層交互,對多個 DAO 的組合復用;
- DAO層:數據訪問層,與底層 MySQL、Oracle、Hbase 等進行數據交互。
- 外部接口或第三方平台:包括其它部門 RPC 開放接口,基礎平台,其它公司的 HTTP 接口。
在我們的實際項目中,一般是不需要設置web層和manager層的,除非業務特別複雜。因此推薦項目分層如下:

總結
其實許多同學可能會有些疑惑,由於ajax的出現許多項目現在開始實行前後端分離的做法,尤其是現在優秀的前端框架層出不窮,比如Vue、React、AngularJS等,似乎三層架構和我們上面的推薦的分層就不適用了。其實不是這樣的,我們將頁面劃分為終端顯示層,無論項目是否是前後端分離,我們都可以將我們的Java代碼劃分為Controller+services+dao+util+model。
文章到這也就結束了,希望本文對你有所幫助,也希望我們的項目都可以結構清晰,可以使用分層的方式降低代碼之間的耦合性,讓代碼更容易被維護和修改。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/203743.html
微信掃一掃
支付寶掃一掃