解析MVC模式 (轉載)

          MVC 模式概述

            

             MVC 是三個單詞的縮寫 , 分別為:

            

            模型 (Model), 視圖 (View) 和控制 Controller)

            

             MVC 模式的目的就是實現 Web 系統的職能分工。

            

             Model 層實現系統中的業務邏輯,通常可以用 JavaBean EJB 來實現。

            

             View 層用于與用戶的交互,通常用 JSP 來實現。

            

             Controller 層是 Model View 之間溝通的橋梁,它可以分派用戶的請求并選擇恰當的視圖以用于顯示,同時它也可以解釋用戶的輸入并將它們映射為模型層可執行的操作。

            

             MVC 模式的好處

            

            各施其職,互不干涉

            

            在 MVC 模式中,三個層各施其職,所以如果一旦哪一層的需求發生了變化,就只需要更改相應的層中的代碼而不會影響到其它層中的代碼。

            

            有利于開發中的分工

            

            在 MVC 模式中,由于按層把系統開,那么就能更好的實現開發中的分工。網頁設計人員可以進行開發視圖層中的 JSP ,對業務熟悉的開發人員可開發業務層,而其它開發人員可開發控制層。

            

            有利于組件的重用

            

            分層后更有利于組件的重用。如控制層可獨立成一個能用的組件,視圖層也可做成通用的操作界面。

            

            不同 JSP 構造的應用

            

            為什么要組合使用 servlet & JSP?

            

            典型的做法:使用 JSP 來簡化 HTML 內容的開發與維護

            

            對于簡單的動態代碼,使用由腳本元素調用 JAVA 代碼來完成。

            

            對于稍微復雜一些的應用,則可使用腳本元素調用定制的類來完成。 ( 即所謂的 help )

            

            對于比較復雜的應用,則使用 JAVA BEAN 和定制標簽

            

            但,這些是不夠的

            

            對于復雜的處理過程,從 JSP 開始做起會難以處理。

            

             JSP 除了能夠帶來將實際的代碼隔離成單獨的類、 bean 、和定制標簽的便利以外,它所隱含的假定是單個頁面給出單個基本視圖。

            

            對 MVC 的誤解

            

            必須采用復雜的框架

            

            框架有時很有用

            

             Struts

            

             JavaServer Faces (JSF)

            

            但并非必需 !

            

            對于大多簡單或者適度復雜的應用來說,使用內建的 RequestDispatcher 就能夠很好地實現 MVC

            

             MVC 影響整個系統的設計

            

            我們可以用 MVC 來處理單個請求

            

            可以將它認為是 MVC 方案,而非 MVC 框架。

            

            也被稱為是模型 2 方案

            

            用 RequestDispatcher 實現 MVC

            

             1. 定義用以表示數據的 java bean

            

             2. 使用一個 servlet 處理請求

            

             servlet 讀取請求參數,檢查數據的缺失或異常等。

            

             3. 填充 bean

            

            該 servlet 調用業務邏輯或數據訪問代碼得到最終的結果。得出的結果被放在第一步中定義的 bean 中。

            

             4. bean 存儲在請求 , 會話或 servlet 的上下文中

            

            該 servlet 調用請求、會話或 servlet 上下文對象的 setAttribute 存儲表達請求結果的 bean 的引用。

            

             5. 將請求轉發到 JSP 頁面

            

            該 servlet 確定哪個 JSP 頁面適合于處理當前的情形,并使用 RequestDispatcher forward 方法將控制轉移到那個頁面。

            

             6. bean 中提取數據

            

             JSP 頁面使用 jsp:useBean 和與第 4 步匹配的位置訪問之前存儲的 bean ,然后使用 jsp:getProperty 輸出 bean 的屬性。

            

             JSP 頁面并不創建或修改 bean ;它只是提取并顯示由 servlet 創建的數據。

            

             jsp:useBean MVC 中的使用與在獨立 JSP 頁面中有什么不同

            

             JSP 頁面不應該創建對象

            

            應該由 servlet 創建所有的數據對象。因此,為了保證 JSP 頁面不會創建對象,我們應該使用 <jsp:useBean ... type= package.Class />

            

            而不是 <jsp:useBean ... class="package.Class" />

            

             JSP 頁面也不應該修改已有的對象

            

            因此,我們應該只使用 jsp:getProperty ,不使用 jsp:setProperty 提示: jsp:useBean scope 選項

            

             request

             <jsp:useBean id="..." type="..." scope="request" />

             session

             <jsp:useBean id="..." type="..." scope="session" />

             application

             <jsp:useBean id=".." type=".." scope="application" />

             page

             <jsp:useBean id= ... type= ... scope= page />

            或者僅僅使用 <jsp:useBean id="..." type="..." />

            

             MVC (Model 2) 構架不使用這個 scope

            

            不同數據共享方式

            

            向用戶顯示一個隨機的數字。

            

            由于每次請求應該產生新的數字,因而基于請求的共享是恰當的。

            

            顯示用戶的姓和名

            

            數據要為每個客戶存儲,因而基于會話的共享比較適用。

            

            顯示一個指定長度的質數。

            

            數據在多個客戶間共享,因此,基于應用的共享比較恰當。

            

            基于請求的數據共享

             Servlet

             ValueObject value = new ValueObject(...);

             request.setAttribute("key", value);

             RequestDispatcher dispatcher =

             request.getRequestDispatcher("/WEB-INF/SomePage.jsp");

             dispatcher.forward(request, response);

            

             JSP

             <jsp:useBean id="key" type="somePackage.ValueObject"

             scope="request" />

             <jsp:getProperty name="key" property="someProperty" />

            

            基于會話的數據共享

             Servlet

             ValueObject value = new ValueObject(...);

             HttpSession session = request.getSession();

             session.setAttribute("key", value);

             RequestDispatcher dispatcher =

             request.getRequestDispatcher("/WEB-INF/SomePage.jsp");

             dispatcher.forward(request, response);

            

             JSP

             <jsp:useBean id="key" type="somePackage.ValueObject"

             scope="session" />

             <jsp:getProperty name="key" property="someProperty" />

            

            基于 ServletContext 的數據共享

             Servlet

             synchronized(this)

             {

             ValueObject value = new ValueObject(...);

             getServletContext().setAttribute("key", value);

             RequestDispatcher dispatcher =

             request.getRequestDispatcher("/WEB-INF/SomePage.jsp");

             dispatcher.forward(request, response);

             }

            

             JSP

             <jsp:useBean id="key" type="somePackage.ValueObject scope="application" />

             <jsp:getProperty name="key" property="someProperty" />

            

             JSP 頁面中的相對 URL

            

            問題:

            

            使用請求分配器進行的轉發對客戶來說是透明的。初始的 URL 是瀏覽器惟一知道的 URL

            

            為什么這會比較重要?

            

            瀏覽器會如何處理類似下面的這些標簽:

             <IMG SRC="foo.gif" >

             <LINK REL=STYLESHEET

             HREF="JSP-Styles.css" TYPE="text/css">

             <A HREF="bar.jsp"> </A>

            

            答案:瀏覽器將會把它們看作是相對于 servlet URL

            

            最簡單的解決方案:

            

            使用以斜杠開始的 URL

            

             Summary

            

             MVC (Model 2) 方式適用于:

            

            單次提交會產生多個基本外觀。

            

            幾個頁面擁有大量公共的處理過程。

            

            需要為同樣的數據提供多個視圖的應用程序 , 它很好地實現了數據層與表示層的分離,特別適用于開發與用戶圖形界面有關的應用程序

            

            構架

            

            由一個 servlet 應答初始的請求

            

             Servlet 完成實際的數據處理并將結果存儲在 bean

            

             Bean 存儲在 HttpServletRequest, HttpSession, ServletContext

            

             Servlet 使用 RequestDispatcher forward 方法將請求轉發到 JSP 頁面

            

             JSP 頁面通過使用 jsp:useBean 和相應的作用域 (request, session, application) bean 中讀出數 ?



          posted on 2006-06-12 11:55 nbt 閱讀(427) 評論(0)  編輯  收藏 所屬分類: MVC框架


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


          網站導航:
           
          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          Java技術網站

          友情鏈接

          國內一些開源網站

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 磴口县| 阜阳市| 南江县| 正定县| 邻水| 宣城市| 门头沟区| 平湖市| 江津市| 溆浦县| 大理市| 水城县| 筠连县| 谷城县| 贺州市| 林西县| 盈江县| 东源县| 明水县| 喀什市| 安远县| 萝北县| 定西市| 翁源县| 乌审旗| 揭西县| 巍山| 泗洪县| 永城市| 福海县| 三河市| 双流县| 马山县| 伊吾县| 阜平县| 育儿| 如皋市| 汉寿县| 尤溪县| 梅河口市| 云和县|