作為一名java工程獅,大家肯定經歷過很多面試,但每次幾乎都會被問到什麼是MVC設計模式,你是怎麼理解MVC的類似這樣的一系列關於MVC的問題。
【出現頻率】
【關鍵考點】
- MVC的含義
- MVC的結構
【考題分析】
在java Web開發中,存在兩種普遍的開發模式,通常成為模式1和模式2。模式1使用JSP+JavaBean技術將頁面顯示和業務邏輯分開,由JSP來實現頁面的顯示,JavaBean物件來儲存資料和實現業務邏輯。客戶端直接向JSP發出請求,JSP做出相應的響應,並呼叫JavaBean物件,所有的資料通過JavaBean來處理,然後再返回JSP,由JSP生成最後的返回結果,模型1的結構圖如下所示:
在模型一中,JSP往往會嵌入控制請求流程的程式碼和部分邏輯程式碼,如果把這部分程式碼提取出來,由一個單獨的角色來承擔,該角色也就是控制器,則此時就構成了 模型2,模型2就符合了MVC的設計模式,即模型--檢視--控制器(Model--View--Controller)。
MVC的架構的Web程式被分割成若干邏輯部件,使得程式開發程式設計變的更加容易。它把物件按照功能的不同分割成3個部分,主要目的就是為了將各種物件的耦合度降到最低。被分割成的3個部分為:模型(Model),檢視(View),控制器(Controller)。
- 模型(Model):代表了應用程式的資料和處理這些資料的規則。當模型發生變化時,它會通知檢視,併為檢視提供查詢模型相關狀態的能力。
- 檢視(View):用來組織模型的內容,它從模型中獲取資料,然後將資料展現給客戶,該角色往往又JSP承擔。
- 控制器(Controller):負責從客戶端接受請求,並把這些請求轉換為某種行為。這些行為往往又模型來實現,這些行為完成以後,再選擇一個檢視來展現給客戶。
下面簡單介紹一下最基礎的開發模式(JSP-Servlet)來構建一個MVC架構模式,後來的那些框架都是在此基礎上增加的,代替相應的元件實現MVC的設計模式的。
(JSP-Servlet)開發中,由Servlet來充當控制器的角色,它接受請求,根據請求資訊的不同將它們分發給合適的JSP頁面來作為使用者的響應,同時,Servlet還需要例項化一個JavaBean物件,JSP就可以通過使用JavaBean的相關標籤(如<jsp:getProterty>)來的到JavaBean的資料,結構如下圖所示:
採用模型2,可以將頁面的顯示,業務邏輯的處理和流程的控制很清晰的分離出來。JSP負責資料的顯示,JavaBean負責業務邏輯的處理,Servlet負責流程的控制。MVC模式使得Web應用程式很容易擴充套件和維護,因為各個部件的功能不同,可以由不同的人進行開發和維護。例如,前端攻城獅專門負責JSP頁面,充分發揮她們的美術和設計才能,後臺攻城獅負責業務邏輯的實現。
Struts1框架是如何體現MVC模式的
雖然struts1現在基本由於使用不方便基本已被struts2所替代,但許多老的專案還是用struts1寫的,所以有必要對struts1的框架了解一下,畢竟它曾經也馳騁疆場數載呢,現在依然在某些專案中還能看到它的身影。
struts1的控制器(Controller)由ActionServlet、Action和struts-config.xml組成。ActionServlet是struts的入口,所有的請求都會通過它來處理,然後由它來決定相應的Action來處理請求。Action代表了一次動作,如使用者註冊、購買商品等,開發者的業務邏輯程式碼也會在這裡新增。配置檔案struts-config.xml是對整個struts的配置,包括ActionServlet應該將請求轉發給那個Avtion,Action負責處理完成之後,又該由那個JSP檔案作為響應等。
struts1的模型(Model)主要由ActionForm來實現,它有一點類似於JavaBean,包含了若干可讀可寫的屬性,用於儲存資料,也有資料驗證的功能。一般來說,一個Action會配備一個ActionForm。
struts1的檢視(View)主要由JSP來實現。JSP顯示的資料可以來自ActionForm,也可以是Action儲存在作用範圍(request,session,application)的資料。當然,使用struts自帶的標籤可以起到最大的簡化作用。
使用struts1開發Web應用程式以後,開發者的思考方式需要做一下改變,Action、ActionForm和JSP是一個整體了,每一個HTTP請求都需要它們三者協作來完成。JSP代表使用者可以看到的東西,ActionForm代表的是資料,Action代表的是業務邏輯。下圖所示的是struts1的MVC各個組成部分,以及它們是如何一起協調工作的。
以上就是struts1最核心的設計思想,開發人員大多數的時候只需要完成檔案配置和Action,將大多數精力集中在Action中的業務邏輯實現上面。如果業務上有改動,只需要修改action即可,如果顯示上有變化,也只需要修改JSP,兩者實現了耦合,互不影響。下面這個圖大概講解一下Struts處理請求的過程和原理。