1
)
MVC
模式
當年做
JSP
生產實習時,印象最深也最困惑的模式就是
MVC
模式了。那時候
Struts
剛紅,幾乎每本
Struts
書中都會有大篇幅的
MVC
介紹。這個模式最早出現在
GUI
,后來在
Web
服務器端紅火起來,先前在
Ajax
書中也看到
Web
客戶端的
MVC
介紹。說實話,在我看了很多人的
MVC
解釋后,我仍有些糊涂,這里說說我的理解。
有人提到MVC模式時說MVC代表了模型層、視圖層、控制層,我覺得這是不對的。在經典的J2EE三層架構中,三層是分為Web層、業務層、持久化層;這個經典分層是基于分布式應用(EJB)的,也就說,Web層物理上是在Web服務器中,
業務層和持久化層物理上是在應用服務器中。在這種情況下,MVC只是屬于Web層這一層的,而不是分為三層。在這種分布式應用中,視圖就是JSP(如果采用的話),控制器就是Servlet(如果采用的話),而模型就是就是調用業務層的在Web層中的樁子。假如我們采用輕量級的SSH技術架構,視圖還是JSP,控制器是Struts,而模型就是Spring+Hibernate。這里最難理解的就是模型的概念。我覺得模型是有狀態和行為的,那么Struts中的Action調用的Servcie方法就是模型的行為,而返回給JSP的DTO(DO)就是模型的狀態。
2
)頁面控制器
對于一個頁面請求,總要有個地方負責處理和頁面跳轉的地方,這個地方就是頁面控制器。頁面控制器有兩種,一種是如Servlet的腳本文件,一種是如JSP的服務器頁面。對于Java來說,JSP就是只應該用來顯示動態的或靜態的信息,而不是用來負責處理Request并Redirect頁面,否則Servlet就要失業了。盡管一個Web程序可以全由JSP文件組成,但將控制甚至業務腳本雜亂的穿插在Tag中真的是太糟糕的實踐了。我記得最初學JSP時,從網上得到的用JSP做的管理系統很多都是純JSP,那時我還以為那就是Java
Web開發的最佳實踐了!
3
)前端控制器
如果你不是Web框架的設計者,想必你不會有機會做個前端控制器,尤其是在擁有了大量優秀的Web框架的Java社區里。前端控制器這個模式我以前在《J2EE核心模式》中看到過,感覺那本書的例子寫的很好。前端控制器是由一個Web處理程序和一個命令(Conmmand)層次結構組成。以Struts1為例,其前端控制器就是ActionServlet,那些我們需要編寫的Action就是前端控制器要處理的命令。在簡化Web開發方面,前端控制器通過Web處理程序做一些具有共性的有價值的事情。比如Struts1的前端控制器通過Form簡化了請求參數的獲取和驗證,而Struts2(WebWork)做的就更多,它的命令Action不是單例的,Action的屬性可以是封裝了請求參數的(經過類型轉換)域對象或傳輸對象,其以攔截器鏈表現的Web
AOP更是簡化了橫切性方面的操作。
4
)模板視圖
Java
Web
中最常用的視圖表現技術就是
JSP
,我們可以以多種編程手法表現來自于數據庫中的數據。我們可以使用
Scriptlet
將模型數據嵌在
HTML
中間,我們可以使用諸如
JSTL
和框架標簽穿插在
HTML
中間,我們也可以自定義標簽來封裝一類數據表現。相比來說,使用標簽要比
Scriptlet
更清晰些,畢竟
JSP
頁面就是應該編寫可視化更好的標簽。但如果有條件判斷等邏輯信息,使用標簽有時也不見得有多清晰,這是可以考慮使用自定義標簽。
5
)轉換視圖
MF
通過
XSLT
介紹了轉換視圖,由于本人沒有使用過
XSLT
,這里不做介紹。我倒想起了以前的
Ajax
編程,也是個轉換視圖的過程。在
Servlet
中將模型數據拼串成
XML
(
HTML
)文檔,然后傳送到
JS
,再構造成
DOM
樹(或是將
HTML
文檔添充在指定的
HTML
標簽內)。在最原始的
Ajax
編程中,無論是在
Servlet
中拼串還是在
JS
中構造
DOM
樹都是很繁瑣很難調試的事情,尤其是在我很不喜歡在
Java
文件中夾雜著
Tag
信息的情況下。
6
)兩步視圖
兩步視圖說的是,用兩個步驟把領域數據轉換成
HTML
:第一步形成某種邏輯頁面,第二步把這些邏輯頁面轉換成
HTML
頁面。這個模式實際上一種裝飾者模式,第二步的視圖渲染過程要做的就是將邏輯視圖加上一致的表現形式。我能想到的是,可以通過諸如
SiteMesh
、
Tiles
等工具完成兩步視圖模式。在不使用
XSLT
的情況下,第一步形成的模板視圖顯然也不是一種諸如
XML
的邏輯頁面
。
7
)應用控制器
這是《
POEAA
》
Web
表現模式中的最后一個模式,
MF
說這個模式很少會被用到,它一般用在具有特定的視圖導航的情況下,也就是說頁面訪問順序不是任意的而是和當時的對象狀態有關。書中介紹的例子是關于狀態模型的,沒完全理解的說。我能想到的例子是具有上下步的注冊過程,可以認為上下步的切換是特定的,是具有狀態信息的;可以強聯系上
MF
的說法,一個輸入控制器將請求傳到應用控制器,應用控制器根據當前步數和請求的步數使用特定的命令進行操作,并傳回輸入控制器下一步的視圖。關于應用控制器的更精確的理解,也歡迎明白的你指出。
注:此文系重溫《企業應用架構模式》一書的簡要筆記,對企業應用架構模式或
Web
表現模式感興趣的朋友可以閱讀一下該書。