java MVC設計模式探究——mvc在j2ee中的應用


一、MVC設計模式在java應用程序中的應用

 

 

 

 

 

二、MVC設計模式在網絡中的應用

1. 問題出現

如果是要開發一個在線圖書借閱系統,比如說是集美大學圖書館的借閱系統,這個系統

希望被做成B/S模式的,用戶只要有瀏覽器就可以使用這個系統.

那么,在開發語言方面,我們可以選擇使用純JSP來開發.

OK. 如果你選用純JSP來開發,那么對於一個圖書查詢功能來說,你可能會這樣實現:

在一個JSP頁面中,比如叫BookSearch.jsp中,你放置了一個表單,用戶在這個頁面中

填寫圖書查詢關鍵字,並提交這個表單,這個表單提交到自身頁面,即BookSearch.jsp

進行處理.BookSearch.jsp會在初始化頁面時進行判斷,如果有接收到用戶提交的查詢

關鍵字,則查詢數據庫,並把查詢結果顯示出來.如果沒有,則只顯示圖書查詢表單.即,

整個完整的業務功能流程是:

(提交查詢請求)              (攔截請求)
BookSearch.jsp <---->     BookSearch.jsp  
(顯示查詢結果)            (執行業務邏輯)

如果你用這種方式完成了整個系統.那么,如果現在客戶----集大圖書館希望除了B/S外,

還有個客戶端,即桌面應用程序Application, 你便會發現,只為了多一個Application客

戶端,你卻基本上要重寫這個系統.因為你之前寫的那些jsp頁面對於你寫Application沒

有什么幫助,代碼無法重用.

2. 什么是MVC? 為什么要使用MVC?

如果我們使用MVC模式來開發,那么,以上代碼無法重用的問題便迎刃而解.

M: Model,即模型,負責業務邏輯部分,含執行業務邏輯部分和業務對象部分,一般為普通

   Java類或EJB

V: View,即視圖,負責呈現在用戶面前的部分,一般為JSP頁面.

C: Controller,即控制器,負責整個流程的控制,一般為Servlet.

MVC就是視圖、控制器、模型相分離的一種開發模式。

如果用MVC模式來實現圖書查詢功能,那便會是這樣的:

在一個JSP頁面中用戶提交圖書查詢請求,Servlet攔截這個請求,並轉發到相應的Java類/

EJB進行圖書信息查詢. 執行完圖書查詢后,返回查詢結果給Servlet. Servlet把查詢結果

傳給JSP,JSP顯示查詢結果.

即流程為:

(提交查詢請求)             (攔截請求/C)        (執行業務邏輯)
BookSearch.jsp(V) <---->    Servlet(C)  <--->   普通Java類/EJB(M)
(顯示查詢結果)             (轉發到JSP)

如果是基於以上MVC模式實現,那么,如果此時希望系統多一個Application的客戶端,

則只需要添加C和V部分即可,M部分可以代碼重用,大大提高工作效率.

除了代碼重用外,MVC還可以讓邏輯更加清晰,各個組件都在實現什么功能非常清楚----

V作視圖,C作控制器,M執行業務邏輯,這樣對開發效率也有非常大的提高.試想一下,如果

是像以上的純JSP實現方式那樣,把MVC混合在一個.jsp中,那么調試維護都是很困難的.

3. MVC模式的具體實現

在具體的實現上,View一般為JSP頁面,它包含提交請求的頁面(圖書查詢頁面)和業務邏

輯執行結果的顯示頁面(查詢結果頁面).這兩個頁面,有時可以集合成一個頁面.JSP頁面

提交業務邏輯執行請求給Servlet,Servlet從普通Java類/EJB取得返回結果並返回給JSP,

組織返回結果顯示給用戶. JSP只負責顯示信息,不處理業務邏輯.

在JSP頁面中,我們可以使用scriptlet,即嵌入在jsp頁面中的java代碼,控制組織顯示界面
.

但我認為這不是一個好的選擇.因為,如果網頁美工與Java程序員不是同一個人,而且美工

不懂Java(雖然俺還沒有真的見過這種情況,現在很多小公司都是前后台同一個人,即網頁

美工同時也是Java程序員),那么,面對在.jsp頁面中的一大堆Java代碼,美工人員會很頭疼
.

而且,假設前后台開發人員不分離,那么在一個頁面中調試與維護一個嵌入大量代碼的jsp

頁面也是很麻煩的, 比如.jsp中的

<%
    }
%>

多了,總讓人看了頭暈. 更好的選擇是使用TabLib,如JSTL。 使用JSTL,可以把形如

<%
   if() {
      ....
   }
%> 的scriptlet變成

<c:if ****>

之類的標簽,這樣對於jsp代碼的閱讀、調試與維護非常有利。如果在JSTL的基礎上加上JS
P2.0

的表達式語言(Expression Language),則更進一步有利於寫出清晰的JSP代碼. 以下是一


JSTL+ EL的例子:

    <c:if test="${!empty NotFoundMsg}">
        <c:out value="<BR><font color=red>${NotFoundMsg}</font><BR>"
                                             escapeXml="false" default=""/>
    </c:if>
    (如果參數NotFoundMsg不為空,則顯示參數NotFoundMsg的內容).

以下提到的Struts中,有非常豐富的標簽,那些標簽基本上都覆蓋了JSTL.

另外,在jsp頁面中嵌入大量的CSS和Javascript代碼,我認為也不是一個好的選擇,同樣的,

我認為分離和CSS和Javascript是更好的選擇,分離出他們二者會讓jsp代碼各清晰,也各有

利於CSS代碼和Javascript代碼的復用.


Controller則一般為Servlet, Servlet攔截JSP提交的請求,並把請求轉發到相應的Java

類/EJB上進行執行業務邏輯, 然后把Java類返回的結果,傳給JSP.


Model一般為普通Java類/EJB,實現業務邏輯.這些普通Java類/EJB接收Servlet傳過來的參

數,並由此執行業務邏輯,並把結果返回給Servlet. 目前, 大部分的中小項目都不使用EJB

了,EJB似乎越來越冷,甚至現在有一個口號叫: "J2EE without EJB",不過,以前EJB是J2EE

的核心.與EJB越來越冷相對的,Hibernate等ORM框架正在越來越熱.


除了最原始的JSP+Servlet+Java類的實現外,現在還有很多的MVC框架,像Struts,WebWorks

等.其中,在中國現在最流行的是Struts框架,現在已經有越來越多的公司用Struts來進行

開發了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM