程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> J2EE綜合應用之――解析MVC模式

J2EE綜合應用之――解析MVC模式

編輯:關於JAVA

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頁面也不應該修改已有的對象

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

request

session

application

page

或者僅僅使用

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

scope="request" />

基於會話的數據共享

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

scope="session" />

基於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頁面中的相對URL

問題:

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

為什麼這會比較重要?

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

 

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

答案:浏覽器將會把它們看作是相對於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中讀出數

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved