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 表現模式感興趣的朋友可以閱讀一下該書。