<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    sharky的點(diǎn)滴積累

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      56 隨筆 :: 104 文章 :: 10 評(píng)論 :: 0 Trackbacks

    MVC模式概述


    ?    MVC是三個(gè)單詞的縮寫,分別為:
    模型(Model),視圖(View)和控制Controller)。
    MVC模式的目的就是實(shí)現(xiàn)Web系統(tǒng)的職能分工。
      
    ?    Model層實(shí)現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯,通常可以用JavaBean或EJB來實(shí)現(xiàn)。 
    ?    View層用于與用戶的交互,通常用JSP來實(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)頁設(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來簡(jiǎn)化HTML內(nèi)容的開發(fā)與維護(hù) 
    ?    對(duì)于簡(jiǎn)單的動(dòng)態(tài)代碼,使用由腳本元素調(diào)用JAVA代碼來完成。 
    ?    對(duì)于稍微復(fù)雜一些的應(yīng)用,則可使用腳本元素調(diào)用定制的類來完成。(即所謂的help類) 
    ?    對(duì)于比較復(fù)雜的應(yīng)用,則使用JAVA BEAN和定制標(biāo)簽
    ?    但,這些是不夠的 
    ?    對(duì)于復(fù)雜的處理過程,從JSP開始做起會(huì)難以處理。 
    ?    JSP除了能夠帶來將實(shí)際的代碼隔離成單獨(dú)的類、bean、和定制標(biāo)簽的便利以外,它所隱含的假定是單個(gè)頁面給出單個(gè)基本視圖。

    對(duì)MVC的誤解

    ?    必須采用復(fù)雜的框架 
    ?    框架有時(shí)很有用 
    ?    Struts 
    ?    JavaServer Faces (JSF) 
    ?    但并非必需! 
    ?    對(duì)于大多簡(jiǎn)單或者適度復(fù)雜的應(yīng)用來說,使用內(nèi)建的RequestDispatcher就能夠很好地實(shí)現(xiàn)MVC
    ?    MVC影響整個(gè)系統(tǒng)的設(shè)計(jì) 
    ?    我們可以用MVC來處理單個(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ù)訪問代碼得到最終的結(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頁面 
    ?     該servlet確定哪個(gè)JSP頁面適合于處理當(dāng)前的情形,并使用RequestDispatcher的forward方法將控制轉(zhuǎn)移到那個(gè)頁面。 
    ?    
    ?    6. 從bean中提取數(shù)據(jù) 
    ?    JSP頁面使用jsp:useBean和與第4步匹配的位置訪問之前存儲(chǔ)的bean,然后使用jsp:getProperty輸出bean的屬性。 
    ?    JSP頁面并不創(chuàng)建或修改bean;它只是提取并顯示由servlet創(chuàng)建的數(shù)據(jù)。

    jsp:useBean在MVC中的使用與在
    獨(dú)立JSP頁面中有什么不同
    ?    JSP頁面不應(yīng)該創(chuàng)建對(duì)象 
    ?    應(yīng)該由servlet創(chuàng)建所有的數(shù)據(jù)對(duì)象。因此,為了保證JSP頁面不會(huì)創(chuàng)建對(duì)象,我們應(yīng)該使用<jsp:useBean ... type=“package.Class” />
    而不是
    <jsp:useBean ... class="package.Class" />
    ?    JSP頁面也不應(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ù)摹?nbsp;
    ?    
    ?    顯示用戶的姓和名 
    ?    數(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頁面中的相對(duì)URL
    ?    問題: 
    ?    使用請(qǐng)求分配器進(jìn)行的轉(zhuǎn)發(fā)對(duì)客戶來說是透明的。初始的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è)頁面擁有大量公共的處理過程。 
    ?    需要為同樣的數(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頁面 
    ?    JSP頁面通過使用jsp:useBean和相應(yīng)的作用域(request, session, application)從bean中讀出數(shù)
    posted on 2005-09-30 20:35 sharky的點(diǎn)滴積累 閱讀(193) 評(píng)論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 污污免费在线观看| 麻豆69堂免费视频| 69免费视频大片| 78成人精品电影在线播放日韩精品电影一区亚洲 | 57pao国产成永久免费视频| 亚洲av激情无码专区在线播放| 久久www免费人成精品香蕉| 亚洲综合精品香蕉久久网| 久久久免费观成人影院| 久久久久久久综合日本亚洲| 久久精品成人免费网站| 精品亚洲国产成AV人片传媒| 国产精品免费精品自在线观看| 亚洲免费视频网址| 国产男女猛烈无遮档免费视频网站 | 亚洲av麻豆aⅴ无码电影| 九九免费精品视频在这里| 国产亚洲精品线观看动态图| 精品国产麻豆免费人成网站| 久久久久亚洲Av无码专| 日韩免费a级毛片无码a∨| 亚洲AV无码一区二区大桥未久| 全黄性性激高免费视频| 97在线免费观看视频| 亚洲黄色网址在线观看| 色播在线永久免费视频| 一级做a爰片久久免费| 老司机亚洲精品影院无码| 成人特黄a级毛片免费视频| 一出一进一爽一粗一大视频免费的| 人人狠狠综合久久亚洲88| 黄色片在线免费观看| 四虎影视在线看免费观看| 亚洲AV日韩精品久久久久久| 扒开双腿猛进入爽爽免费视频| 免费的黄网站男人的天堂 | 亚洲高清一区二区三区| 亚洲精品tv久久久久久久久久| 久久久久久久99精品免费| 亚洲avav天堂av在线网毛片| 无码乱人伦一区二区亚洲一|