解析MVC模式 (轉(zhuǎn)載)

          MVC 模式概述

            

             MVC 是三個(gè)單詞的縮寫 , 分別為:

            

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

            

             MVC 模式的目的就是實(shí)現(xiàn) Web 系統(tǒng)的職能分工。

            

             Model 層實(shí)現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯,通常可以用 JavaBean EJB 來(lái)實(shí)現(xiàn)。

            

             View 層用于與用戶的交互,通常用 JSP 來(lái)實(shí)現(xiàn)。

            

             Controller 層是 Model View 之間溝通的橋梁,它可以分派用戶的請(qǐng)求并選擇恰當(dāng)?shù)囊晥D以用于顯示,同時(shí)它也可以解釋用戶的輸入并將它們映射為模型層可執(zhí)行的操作。

            

             MVC 模式的好處

            

            各施其職,互不干涉

            

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

            

            有利于開發(fā)中的分工

            

            在 MVC 模式中,由于按層把系統(tǒng)開,那么就能更好的實(shí)現(xiàn)開發(fā)中的分工。網(wǎng)頁(yè)設(shè)計(jì)人員可以進(jìn)行開發(fā)視圖層中的 JSP ,對(duì)業(yè)務(wù)熟悉的開發(fā)人員可開發(fā)業(yè)務(wù)層,而其它開發(fā)人員可開發(fā)控制層。

            

            有利于組件的重用

            

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

            

            不同 JSP 構(gòu)造的應(yīng)用

            

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

            

            典型的做法:使用 JSP 來(lái)簡(jiǎn)化 HTML 內(nèi)容的開發(fā)與維護(hù)

            

            對(duì)于簡(jiǎn)單的動(dòng)態(tài)代碼,使用由腳本元素調(diào)用 JAVA 代碼來(lái)完成。

            

            對(duì)于稍微復(fù)雜一些的應(yīng)用,則可使用腳本元素調(diào)用定制的類來(lái)完成。 ( 即所謂的 help )

            

            對(duì)于比較復(fù)雜的應(yīng)用,則使用 JAVA BEAN 和定制標(biāo)簽

            

            但,這些是不夠的

            

            對(duì)于復(fù)雜的處理過(guò)程,從 JSP 開始做起會(huì)難以處理。

            

             JSP 除了能夠帶來(lái)將實(shí)際的代碼隔離成單獨(dú)的類、 bean 、和定制標(biāo)簽的便利以外,它所隱含的假定是單個(gè)頁(yè)面給出單個(gè)基本視圖。

            

            對(duì) MVC 的誤解

            

            必須采用復(fù)雜的框架

            

            框架有時(shí)很有用

            

             Struts

            

             JavaServer Faces (JSF)

            

            但并非必需 !

            

            對(duì)于大多簡(jiǎn)單或者適度復(fù)雜的應(yīng)用來(lái)說(shuō),使用內(nèi)建的 RequestDispatcher 就能夠很好地實(shí)現(xiàn) MVC

            

             MVC 影響整個(gè)系統(tǒng)的設(shè)計(jì)

            

            我們可以用 MVC 來(lái)處理單個(gè)請(qǐng)求

            

            可以將它認(rèn)為是 MVC 方案,而非 MVC 框架。

            

            也被稱為是模型 2 方案

            

            用 RequestDispatcher 實(shí)現(xiàn) MVC

            

             1. 定義用以表示數(shù)據(jù)的 java bean

            

             2. 使用一個(gè) servlet 處理請(qǐng)求

            

             servlet 讀取請(qǐng)求參數(shù),檢查數(shù)據(jù)的缺失或異常等。

            

             3. 填充 bean

            

            該 servlet 調(diào)用業(yè)務(wù)邏輯或數(shù)據(jù)訪問(wèn)代碼得到最終的結(jié)果。得出的結(jié)果被放在第一步中定義的 bean 中。

            

             4. bean 存儲(chǔ)在請(qǐng)求 , 會(huì)話或 servlet 的上下文中

            

            該 servlet 調(diào)用請(qǐng)求、會(huì)話或 servlet 上下文對(duì)象的 setAttribute 存儲(chǔ)表達(dá)請(qǐng)求結(jié)果的 bean 的引用。

            

             5. 將請(qǐng)求轉(zhuǎn)發(fā)到 JSP 頁(yè)面

            

            該 servlet 確定哪個(gè) JSP 頁(yè)面適合于處理當(dāng)前的情形,并使用 RequestDispatcher forward 方法將控制轉(zhuǎn)移到那個(gè)頁(yè)面。

            

             6. bean 中提取數(shù)據(jù)

            

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

            

             JSP 頁(yè)面并不創(chuàng)建或修改 bean ;它只是提取并顯示由 servlet 創(chuàng)建的數(shù)據(jù)。

            

             jsp:useBean MVC 中的使用與在獨(dú)立 JSP 頁(yè)面中有什么不同

            

             JSP 頁(yè)面不應(yīng)該創(chuàng)建對(duì)象

            

            應(yīng)該由 servlet 創(chuàng)建所有的數(shù)據(jù)對(duì)象。因此,為了保證 JSP 頁(yè)面不會(huì)創(chuàng)建對(duì)象,我們應(yīng)該使用 <jsp:useBean ... type= package.Class />

            

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

            

             JSP 頁(yè)面也不應(yīng)該修改已有的對(duì)象

            

            因此,我們應(yīng)該只使用 jsp:getProperty ,不使用 jsp:setProperty 提示: jsp:useBean scope 選項(xiàng)

            

             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) 構(gòu)架不使用這個(gè) scope

            

            不同數(shù)據(jù)共享方式

            

            向用戶顯示一個(gè)隨機(jī)的數(shù)字。

            

            由于每次請(qǐng)求應(yīng)該產(chǎn)生新的數(shù)字,因而基于請(qǐng)求的共享是恰當(dāng)?shù)摹?/span>

            

            顯示用戶的姓和名

            

            數(shù)據(jù)要為每個(gè)客戶存儲(chǔ),因而基于會(huì)話的共享比較適用。

            

            顯示一個(gè)指定長(zhǎng)度的質(zhì)數(shù)。

            

            數(shù)據(jù)在多個(gè)客戶間共享,因此,基于應(yīng)用的共享比較恰當(dāng)。

            

            基于請(qǐng)求的數(shù)據(jù)共享

             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" />

            

            基于會(huì)話的數(shù)據(jù)共享

             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 的數(shù)據(jù)共享

             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 頁(yè)面中的相對(duì) URL

            

            問(wèn)題:

            

            使用請(qǐng)求分配器進(jìn)行的轉(zhuǎn)發(fā)對(duì)客戶來(lái)說(shuō)是透明的。初始的 URL 是瀏覽器惟一知道的 URL

            

            為什么這會(huì)比較重要?

            

            瀏覽器會(huì)如何處理類似下面的這些標(biāo)簽:

             <IMG SRC="foo.gif" >

             <LINK REL=STYLESHEET

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

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

            

            答案:瀏覽器將會(huì)把它們看作是相對(duì)于 servlet URL

            

            最簡(jiǎn)單的解決方案:

            

            使用以斜杠開始的 URL

            

             Summary

            

             MVC (Model 2) 方式適用于:

            

            單次提交會(huì)產(chǎn)生多個(gè)基本外觀。

            

            幾個(gè)頁(yè)面擁有大量公共的處理過(guò)程。

            

            需要為同樣的數(shù)據(jù)提供多個(gè)視圖的應(yīng)用程序 , 它很好地實(shí)現(xiàn)了數(shù)據(jù)層與表示層的分離,特別適用于開發(fā)與用戶圖形界面有關(guān)的應(yīng)用程序

            

            構(gòu)架

            

            由一個(gè) servlet 應(yīng)答初始的請(qǐng)求

            

             Servlet 完成實(shí)際的數(shù)據(jù)處理并將結(jié)果存儲(chǔ)在 bean

            

             Bean 存儲(chǔ)在 HttpServletRequest, HttpSession, ServletContext

            

             Servlet 使用 RequestDispatcher forward 方法將請(qǐng)求轉(zhuǎn)發(fā)到 JSP 頁(yè)面

            

             JSP 頁(yè)面通過(guò)使用 jsp:useBean 和相應(yīng)的作用域 (request, session, application) bean 中讀出數(shù) ?



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


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          收藏夾

          Java技術(shù)網(wǎng)站

          友情鏈接

          國(guó)內(nèi)一些開源網(wǎng)站

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 平江县| 大竹县| 银川市| 化州市| 同仁县| 青阳县| 鹰潭市| 铁岭市| 子长县| 合江县| 马边| 山东| 汝阳县| 高雄市| 曲周县| 中山市| 安龙县| 墨江| 郑州市| 高州市| 确山县| 德庆县| 伊川县| 东乌珠穆沁旗| 贺州市| 田东县| 盐城市| 新乐市| 林芝县| 昆明市| 乳山市| 连江县| 垣曲县| 古丈县| 雷州市| 博客| 宜春市| 乌苏市| 汕尾市| 石景山区| 门头沟区|