Struts2與MVC基礎入門


1、MVC模式基礎

1.1、MVC模式簡介

  MVC是一種架構型模式,它本身並不引入新的功能,只是用來指導我們改善應用程序的架構,使得應用的模型和視圖相分離,從而達到更好的開發和維護效率。在MVC模式中,應用程序被划分成模型(Model)、視圖(View)和控制器(Controller)三個部分。其中,模型部分包含了應用程序的業務邏輯和業務數據;視圖部分封裝了應用程序的輸出形式(頁面、界面);而控制器部分負責協調模型和視圖,根據用戶請求來選擇要調用哪個模型來處理業務,以及最終由哪個視圖為用戶做出應答。MVC模式的這三個部分的職責非常明確,而且相互分離,每個部分都可以獨立的改變而不影響其他部分,大大提高了應用的靈活性和重用性。

1.2、MVC模式基礎

  在MVC模式中,一個應用被划分成了模型(Model)、視圖(View)和控制器(Controller)三個部分。

1.2.1、模型、視圖、控制器各部分的作用

  模型(Model):負責封裝應用的狀態,並實現應用的功能。通常分為數據模型和業務邏輯模型,數據模型用來存放業務數據,比如訂單信息、用戶信息等;而業務邏輯模型包含應用的業務操作,比如訂單的添加或者修改等。

  視圖(View):用來將模型的內容展現給用戶,用戶可以通過視圖來請求模型進行更新。視圖從模型獲得要展示的數據,然后用自己的方式展現給用戶,相當於提供界面來與用戶進行人機交互;用戶在界面上操作或者填寫完成后,會點擊提交按鈕或是以其它觸發事件的方式,來向控制器發出請求。

  控制器(Controller):用來控制應用程序的流程和處理視圖所發出的請求。當控制器接收到用戶的請求后,會將用戶的數據和模型的更新相映射,也就是調用模型來實現用戶請求的功能;然后控制器會選擇用於響應的視圖,把模型更新后的數據展示給用戶。

1.2.2、模型和視圖的關系

  在MVC中,模型和視圖是分離的,通常視圖里面不會有任何邏輯實現;而模型也是不依賴於視圖的,同一個模型可能會有多種不同的展示方式,即同一個模型可以對應多種不同的視圖。例如,在windows操作系統上瀏覽文件夾時,文件夾就那些,數據並沒有變化,但是展示方式就有多種,比如大圖標、小圖標、詳細信息等等展示方式。以tomcat7文件夾下的文件為例,按照不同的展示方式,如圖所示:

模型負責輸出的內容,而視圖負責輸出的形式,模型不依賴於視圖,模型與視圖是解耦的。因此在修改視圖時候,不必關心模型,而只需要直接修改視圖的展示方式即可。

1.2.3、MVC的組件關系圖

MVC的組件關系圖描述了模型、視圖、控制器的交互關系:

(1)首先是展示視圖給用戶,用戶在視圖上進行操作,並填寫一些業務數據

(2)然后用戶點擊提交按鈕發出請求

(3)視圖發出的用戶請求會到達控制器,請求中包含了想要完成什么樣的業務功能以及相關的數據。

(4)控制器會處理用戶請求,把請求中的數據進行封裝,然后選擇並調用合適的模型,請求模型進行狀態更新,然后選擇接下來要展示給用戶的視圖。

(5)模型處理用戶請求的業務功能,同時進行模型狀態的維護和更新

(6)當模型狀態發生改變的時候,模型會通知相應的視圖,告訴視圖它的狀態發生了改變。

(7)視圖接到模型的通知后,會向模型進行狀態查詢,獲取需要展示的數據,然后按照視圖本身的展示方式,把這些數據展示出來。

接下來就是等待用戶下一次操作,再次從頭輪回。

3、MVC模式作用

  在早期開發的時候不遵守MVC模式。結果程序結構划分不明確,各個部分功能混亂,在業務功能發生變更時,無論是業務邏輯修改還是顯示形式修改,都要修改很多的類,“牽一發而動全身”,導致軟件的開發和維護效率低下,錯誤百出。而遵循MVC模式來開發系統,就會極大的避免上述問題的出現。MVC模式的核心手段是解耦,MVC模式通過仔細的划分功能,把整個應用程序划分成模型、視圖、控制器三個部分,然后嚴密控制三個部分之間的通信,從而得到一個結構清晰、功能分布合理、可重用、可擴展、可維護的應用程序。

因此,使用MVC模式,可以獲得以下好處:

  低耦合性:在MVC模式中,模型和視圖是解耦的,模型不會依賴於視圖,視圖僅僅從模型中獲取需要展示的數據,不會與模型的邏輯處理相關聯。

  更低的開發成本:MVC模式幫我們清楚的划分了各部分的職責,讓程序員各司其職,Java程序員只關心業務邏輯的實現,也就是模型部分;而界面程序員只關心頁面展示,也就是視圖部分。

  更好的可維護性:MVC模式划分出明晰的模型和視圖,並使其解耦,在軟件需求發生變更的時候,就可以各自獨立的改變而不會相互影響,使得程序更容易維護和擴展。

4、Model2模型中的MVC

  在Java Web開發中,通常把Servlet+JSP+JavaBean的模型稱為Model2模型,這是一個遵循MVC模式的模型,划分如下:

  JavaBean作為模型,既可以作為數據模型來封裝業務數據,又可以作為業務邏輯模型來包含應用的業務操作。其中,數據模型用來存儲或傳遞業務數據,而業務邏輯模型接收到控制器傳過來的模型更新請求后,執行特定的業務邏輯處理,然后返回相應的執行結果。

  JSP作為表現層,負責提供頁面為用戶展示數據,提供相應的表單(Form)來用於用戶的請求,並在適當的時候(點擊按鈕)向控制器發出請求來請求模型進行更新。

  Serlvet作為控制器,用來接收用戶提交的請求,然后獲取請求中的數據,將之轉換為業務模型需要的數據模型,然后調用業務模型相應的業務方法進行更新,同時根據業務執行結果來選擇要返回的視圖。

Model2實現MVC的基本結構如圖所示:

  Servlet+JSP+JavaBean模型基本的響應順序:當用戶發出一個請求后,這個請求會被控制器Servlet接收到;Servlet將請求的數據轉換成數據模型JavaBean,然后調用業務邏輯模型JavaBean的方法,並將業務邏輯模型返回的結果放到合適的地方,比如請求的屬性里;最后根據業務邏輯模型的返回結果,由控制器來選擇合適的視圖 (JSP),由視圖把數據展現給用戶。

 

2、Struts2基礎

Struts2是基於MVC的輕量級的web應用框架。

  所謂框架:就是能完成一定功能的半成品軟件。在沒有框架的時候,所有的工作都要乖乖的從零做起;有了框架,它為我們提供了一定的功能,就可以在框架的基礎上做起,大大提高開發的效率和質量。

  web應用框架,這說明Struts2的應用范圍是Web應用而不是其它地方。Struts2更注重將Web應用領域的日常工作和常見問題抽象化,提供一個平台讓我們能快速的完成Web應用開發。

  輕量級:是相對於重量級而言,指的是Struts2在運行的時候,對Web服務器的資源消耗較少,比如CPU、內存等,但是運行速度相對較快。

  基於MVC,說明基於Struts2開發的Web應用自然就能實現MVC,也說明Struts2着力於在MVC的各個部分為我們的開發提供相應幫助。

Struts2基本組成

  WebWork與Struts合並之后,根據功能的細分和設計,拆分出一個叫xwork的部分,用來處理與Web無關的部分,也就是與Servlet無關的部分,比如:用戶數據的類型轉換、動作調用之前的數據驗證、動作的調用等等。其余與Web相關的部分,也就是與servlet相關的部分,被稱為struts2部分。因此請注意,此處的“Struts2”可以理解為一個模塊,是Struts2框架的一部分,如:如何接收用戶請求的數據,如何跳轉到下一個頁面等等。其中struts2部分調用了xwork部分,但是xwork部分是不依賴於Struts2部分的,xwork是完全獨立的、純Java的應用。因此,可以用下圖來表示struts2部分和xwork部分的關系。

Struts2能干什么

  了解了Struts2是什么和有什么后,看看Struts2可以做什么?

  Struts2通過簡單、集中的配置來調度動作類,使得我們配置和修改都非常容易。

  Struts2提供簡單、統一的表達式語言來訪問所有可供訪問的數據。

  Struts2提供內存式的數據中心,所有可供訪問的數據都集中存放在內存中,在調用中不需要將數據傳來傳去,都去這個內存數據中心訪問即可。

  Struts2提供在動作類執行的前或后附加執行一定功能的能力,能實現AOP。

  Struts2提供標准的、強大的驗證框架和國際化框架,且與Struts2的其他特性緊密結合。

類似的功能很多,不勝枚舉。

 

3 、Struts2MVC

  Struts2是一種基於MVC的Web應用框架,下面看看Struts2和MVC的關系。這里只是先講一下Struts2是如何跟MVC對應的,其中一些名詞所代表的具體功能,比如前端控制器(FilterDispatcher)、動作(Action)、結果(Result)等。在之后的學習中會不斷深入具體的細節。

 

控制器——FilterDispatcher

  用戶請求首先到達前端控制器FilterDispatcher。FilterDispatcher負責根據用戶提交的URL和struts.xml中的配置,來選擇合適的動作(Action),讓這個Action來處理用戶的請求。FilterDispatcher其實是一個過濾器(Filter,servlet規范中的一種web組件),它是Struts2核心包里已經做好的類,不需要我們去開發,只是要在項目的web.xml中配置一下即可。FilterDispatcher體現了J2EE核心設計模式中的前端控制器模式。

動作——Action

  在用戶請求經過FilterDispatcher之后,被分發到了合適的動作Action對象。Action負責把用戶請求中的參數組裝成合適的數據模型,並調用相應的業務邏輯進行真正的功能處理,獲取下一個視圖展示所需要的數據。Struts2 的Action,相比於別的web框架的動作處理,它實現了與Servlet API的解耦,使得Action里面不需要再直接去引用和使用HttpServletRequest與HttpServletResponse等接口。 因而使得Action的單元測試更加簡單,而且強大的類型轉換也使得我們少做了很多重復的工作。

視圖——Result

  視圖結果用來把動作中獲取到的數據展現給用戶。在Struts2中有多種優秀的結果展示方式,常規的jsp,模板 freemarker、velocity,還有各種其它專業的展示方式,如圖表jfreechart、報表JasperReports、將XML轉化為 HTML的XSLT等等。而且各種視圖結果在同一個工程里面可以混合出現。

  看到這里,大家應該大致知道了Struts2是什么,能干什么,粗略的了解到Struts2里面有什么了,接下來就是究竟如何使用Struts2來開發基於MVC的Web應用了。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM