MVC模式概述

來源:互聯網
上載者:User
    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="http://www.webjx.com/htmldata/2005-11-17/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中讀出數



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。