邊城愚人

          如果我不在邊城,我一定是在前往邊城的路上。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            31 隨筆 :: 0 文章 :: 96 評論 :: 0 Trackbacks

          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,而模型就是SpringHibernate。這里最難理解的就是模型的概念。我覺得模型是有狀態和行為的,那么Struts中的Action調用的Servcie方法就是模型的行為,而返回給JSPDTODO)就是模型的狀態。

          2 )頁面控制器

          對于一個頁面請求,總要有個地方負責處理和頁面跳轉的地方,這個地方就是頁面控制器。頁面控制器有兩種,一種是如Servlet的腳本文件,一種是如JSP的服務器頁面。對于Java來說,JSP就是只應該用來顯示動態的或靜態的信息,而不是用來負責處理RequestRedirect頁面,否則Servlet就要失業了。盡管一個Web程序可以全由JSP文件組成,但將控制甚至業務腳本雜亂的穿插在Tag中真的是太糟糕的實踐了。我記得最初學JSP時,從網上得到的用JSP做的管理系統很多都是純JSP,那時我還以為那就是Java Web開發的最佳實踐了!

          3 )前端控制器

          如果你不是Web框架的設計者,想必你不會有機會做個前端控制器,尤其是在擁有了大量優秀的Web框架的Java社區里。前端控制器這個模式我以前在《J2EE核心模式》中看到過,感覺那本書的例子寫的很好。前端控制器是由一個Web處理程序和一個命令(Conmmand)層次結構組成。以Struts1為例,其前端控制器就是ActionServlet,那些我們需要編寫的Action就是前端控制器要處理的命令。在簡化Web開發方面,前端控制器通過Web處理程序做一些具有共性的有價值的事情。比如Struts1的前端控制器通過Form簡化了請求參數的獲取和驗證,而Struts2WebWork)做的就更多,它的命令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 表現模式感興趣的朋友可以閱讀一下該書。

          posted on 2007-08-23 10:00 kafka0102 閱讀(1601) 評論(0)  編輯  收藏 所屬分類: Pattern

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 美姑县| 新邵县| 从化市| 桐乡市| 微山县| 讷河市| 东宁县| 龙南县| 三明市| 大名县| 榆树市| 繁峙县| 同仁县| 富宁县| 蓬莱市| 兴海县| 巩义市| 通渭县| 沙洋县| 游戏| 新建县| 门源| 牙克石市| 陇西县| 唐山市| 虎林市| 筠连县| 兴海县| 松桃| 延寿县| 安庆市| 枣庄市| 鹰潭市| 东乌珠穆沁旗| 天门市| 古田县| 静乐县| 定结县| 湘乡市| 和林格尔县| 军事|