摘要:在Java Web開(kāi)發(fā)中,界面和業(yè)務(wù)邏輯的分離給軟件開(kāi)發(fā)帶來(lái)許多好處,如:使得開(kāi)發(fā)思路清晰、軟件維護(hù)容易等。對(duì)于軟件開(kāi)發(fā)來(lái)說(shuō),選擇什么設(shè)計(jì)模式式直接影響軟件的質(zhì)量。在Java技術(shù)中,使用MVC開(kāi)發(fā)模式變得越來(lái)越流行。但是,對(duì)于許多開(kāi)發(fā)者來(lái)說(shuō),應(yīng)該怎么使用MVC模式還存在疑問(wèn)。本文以一個(gè)管理信息系統(tǒng)的開(kāi)發(fā)為例,說(shuō)明MVC模式的使用方式,并通過(guò)MVC模式衍生出其他高級(jí)Web框架。
關(guān)鍵詞:設(shè)計(jì)模式 界面 業(yè)務(wù)邏輯 Web框架
1 概述
一個(gè)管理信息系統(tǒng)的開(kāi)發(fā)成功,應(yīng)該從兩個(gè)方面去考慮,從開(kāi)發(fā)者本身來(lái)說(shuō),開(kāi)發(fā)者必須要有一個(gè)非常清晰的思維,明白此系統(tǒng)的各種邏輯業(yè)務(wù);另一方面,從用戶的角度來(lái)看,用戶總是希望得到一個(gè)功能強(qiáng)大且界面友好的系統(tǒng)。要做好這兩方面的控制,其實(shí)并不簡(jiǎn)單。盡管java技術(shù)在業(yè)務(wù)邏輯方面表現(xiàn)了優(yōu)勢(shì),但要在具體代碼實(shí)施的時(shí)候表達(dá)清楚業(yè)務(wù)邏輯是很難的。要做到功能強(qiáng)大且擴(kuò)展性好,就是要做到界面的設(shè)計(jì)和業(yè)務(wù)邏輯分離。引進(jìn)mvc模式,就可以很好的解決界面和業(yè)務(wù)邏輯計(jì)算分離的問(wèn)題。
2 JavaWeb技術(shù)中的模式(Model)
在JavaWEB開(kāi)發(fā)中,主要有兩種設(shè)計(jì)模式(Model):
2.1 模式1(Model1)
這是一種JSP+JavaClass的技術(shù),具體來(lái)說(shuō),就是JSP+JavaBean技術(shù)。如圖1:
在模式1中,JSP負(fù)責(zé)獲取用戶(瀏覽器)的請(qǐng)求,并根據(jù)請(qǐng)求的內(nèi)容調(diào)用合適JavaBean來(lái)處理業(yè)務(wù)邏輯,最后把處理的結(jié)果返回給JSP,JSP再把結(jié)果回應(yīng)給瀏覽器。在整個(gè)過(guò)程中,如果需要數(shù)據(jù),這些數(shù)據(jù)都由JavaBean去訪問(wèn)獨(dú)立的數(shù)據(jù)庫(kù)服務(wù)器取得。
這種模式帶給開(kāi)發(fā)者一種簡(jiǎn)單的設(shè)計(jì)方法,因?yàn)闃I(yè)務(wù)邏輯計(jì)算都由界面在需要時(shí)直接調(diào)用,所以軟件開(kāi)發(fā)者不用花費(fèi)過(guò)多的時(shí)間去考慮界面各業(yè)務(wù)計(jì)算是否分離。盡管這樣的設(shè)計(jì)簡(jiǎn)單,但后果是:界面部分,即JSP代碼的權(quán)力變大了。它除了負(fù)責(zé)與用戶交互外,還承擔(dān)了調(diào)用業(yè)務(wù)邏輯(JavaBean)計(jì)算的重任。更為嚴(yán)重的是,由于沒(méi)有了界面與業(yè)務(wù)分離的強(qiáng)制性,軟件開(kāi)發(fā)者干脆直接把本該屬于JavaBean的業(yè)務(wù)邏輯代碼直接寫到主要負(fù)責(zé)界面JSP中,這樣導(dǎo)致代碼的冗余,軟件的可維護(hù)性很差。顯然違背了軟件開(kāi)發(fā)中的“高內(nèi)聚,低耦合”的原則。為了強(qiáng)調(diào)界面與業(yè)務(wù)邏輯的分離,JavaWeb開(kāi)發(fā)的模式2被提出。
2.2 模式2(Model2),即MVC設(shè)計(jì)模式
MVC(Model View Controller)設(shè)計(jì)模式,就是模型—視圖—控制器模式。其實(shí)這種技術(shù)已不是一種新技術(shù),它早已存在WEB開(kāi)發(fā)中。如今在WEB開(kāi)發(fā)領(lǐng)域最普遍的兩種技術(shù)——.NET和JAVAEE都支持MVC設(shè)計(jì)模式。在JavaWEB開(kāi)發(fā)中,MVC的Model、View、Controller分別由JavaBean、JSP、Servlet承擔(dān)。其工作原理如圖2:
①模型(Model):處理業(yè)務(wù)邏輯。由JavaBean充當(dāng),對(duì)軟件的所有業(yè)務(wù)流程都封裝在Javabean中。
②視圖(View):負(fù)責(zé)顯示界面給用戶,提供用戶與系統(tǒng)交互視圖層。通過(guò)觸發(fā)控制器(Controller)工作,調(diào)用相應(yīng)的模型(Model)獲取所需數(shù)據(jù),處理相應(yīng)業(yè)務(wù)。最后將業(yè)務(wù)處理結(jié)果通過(guò)視圖響應(yīng)給用戶。視圖主要由JSP承擔(dān)。
③控制器(Controller):系統(tǒng)的流程控制。負(fù)責(zé)處理用戶的所有請(qǐng)求(Request),根據(jù)請(qǐng)求創(chuàng)建JSP需要使用JavaBean對(duì)象,并選擇合適的JSP頁(yè)面作為視圖返回給用戶??刂破饔蒘ervlet承擔(dān)。
在JavaWeb開(kāi)發(fā)中采用MVC模式是一種具有革命性的軟件設(shè)計(jì)方法,它明確分離了軟件系統(tǒng)的界面和業(yè)務(wù)邏輯,具體定義了軟件開(kāi)發(fā)者與網(wǎng)頁(yè)美工人員的分工及任務(wù)。對(duì)軟件系統(tǒng)來(lái)說(shuō),它使得軟件的可維護(hù)性,模塊的可重用性都得到了提高,也提高了軟件的可靠性,更加符合面向?qū)ο螅∣O)的思想。
對(duì)于一個(gè)運(yùn)用JavaWeb技術(shù)開(kāi)發(fā)的大中型管理信息系統(tǒng)來(lái)說(shuō),采用MVC的設(shè)計(jì)模式的優(yōu)勢(shì)是很多的。
3 MVC模式的管理信息系統(tǒng)的開(kāi)發(fā)
以一個(gè)高校的校教學(xué)質(zhì)量工程管理信息系統(tǒng)設(shè)計(jì)為例,說(shuō)明MVC設(shè)計(jì)模式在JavaWeb開(kāi)發(fā)中的流程。此系統(tǒng)的用戶主要是在校老師和在校大學(xué)生。系統(tǒng)的功能概況:利用此系統(tǒng),老師可以申報(bào)精品課程等一些老師的項(xiàng)目,學(xué)生可以申報(bào)科研立項(xiàng)或者創(chuàng)新性實(shí)驗(yàn)等學(xué)生的項(xiàng)目。無(wú)論是老師的項(xiàng)目還是學(xué)生的項(xiàng)目,都分為國(guó)家級(jí)、省級(jí)、校級(jí)三個(gè)級(jí)別。
通過(guò)需求分析等一系列工作后,把此系統(tǒng)劃分為十二個(gè)子系統(tǒng),在此以學(xué)生申報(bào)系統(tǒng)的設(shè)計(jì)為例,說(shuō)明MVC設(shè)計(jì)模式的應(yīng)用。學(xué)生申報(bào)系統(tǒng)主要實(shí)現(xiàn)學(xué)生對(duì)創(chuàng)新性實(shí)驗(yàn)的申報(bào)和審核功能。
3.1 從登錄開(kāi)始,實(shí)現(xiàn)視圖層(View)功能
Web應(yīng)用程序,首先都是接收用戶的數(shù)據(jù)輸入,數(shù)據(jù)輸入的開(kāi)始需要提供系統(tǒng)與用戶交互的入口界面,登錄窗口就是實(shí)現(xiàn)這樣一個(gè)功能的界面。利用MVC 設(shè)計(jì)模式中的視圖(View)層來(lái)設(shè)計(jì)登錄界面。
視圖(View)層的功能由JSP負(fù)責(zé)完成,所以登錄界面的只涉及顯示的HTML+CSS和少量的JSP格式代碼。
3.2 實(shí)現(xiàn)控制層(Controller)功能
MVC設(shè)計(jì)模式的核心是控制層(Controller),用Servlet技術(shù)實(shí)現(xiàn)對(duì)所有模塊的控制作用。
當(dāng)數(shù)據(jù)的請(qǐng)求通過(guò)網(wǎng)絡(luò)傳輸?shù)絎eb服務(wù)器時(shí),就找到相應(yīng)的控制器,由控制器決定這些數(shù)據(jù)要做什么,再調(diào)用相應(yīng)的模型(Model)去做或者調(diào)用相應(yīng)的視圖(View)去顯示。
3.3 實(shí)現(xiàn)模型層(Model)功能
模型實(shí)現(xiàn)了系統(tǒng)的業(yè)務(wù)邏輯功能。以學(xué)生申報(bào)系統(tǒng)的登錄部分?jǐn)?shù)據(jù)處理為例,數(shù)據(jù)模型對(duì)象通過(guò)set和get方法映射數(shù)據(jù)庫(kù)表中的數(shù)據(jù),通過(guò)數(shù)據(jù)庫(kù)連接模型對(duì)象來(lái)連接到相應(yīng)的數(shù)據(jù)庫(kù),然后通過(guò)數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象DAO(Data Access Object)來(lái)訪問(wèn)數(shù)據(jù)庫(kù),將訪問(wèn)結(jié)果以結(jié)果集方式返回,最后根據(jù)結(jié)果集來(lái)判斷用戶提交的數(shù)據(jù)是否符合數(shù)據(jù)庫(kù)中的數(shù)據(jù),進(jìn)而達(dá)到登錄用戶身份合法性的驗(yàn)證。
4 MVC到Web框架
基于MVC的架構(gòu)開(kāi)發(fā)Web應(yīng)用程序,使軟件系統(tǒng)的開(kāi)發(fā)實(shí)現(xiàn)了界面與邏輯的很好分離,邏輯變得清晰。但在使用MVC設(shè)計(jì)過(guò)程中,容易出現(xiàn)一些問(wèn)題,如:編寫控制器(Controller)時(shí)會(huì)出現(xiàn)多個(gè)控制器,同時(shí),在控制器中對(duì)于導(dǎo)航的處理也比較麻煩。故由MVC提出了Web框架。JavaWeb開(kāi)發(fā)中,發(fā)展最成熟的三個(gè)框架是SSH(Struts+Spring+Hibernate)框架。SSH構(gòu)成了JavaWeb開(kāi)發(fā)的基本W(wǎng)eb框架體系。
4.1 Struts
Struts是第一個(gè)真正意義上按照MVC設(shè)計(jì)模式搭建起來(lái)的Web開(kāi)發(fā)框架。Struts對(duì)MVC的模型(Model)、視圖(View)、控制器(Controller)都提供了相應(yīng)的組件支持。
4.1.1 模型(Model)支持
Struts中的模型支持由ActionForm和JavaBean承擔(dān)。ActionForm負(fù)責(zé)提交表單數(shù)據(jù),實(shí)際上充當(dāng)了數(shù)據(jù)載體的JavaBean對(duì)象。Strust1框架中,使用繼承ActionForm的form bean對(duì)象來(lái)封裝表單數(shù)據(jù),完成表單數(shù)據(jù)的初始化和驗(yàn)證任務(wù)。JavaBean部分是由系統(tǒng)開(kāi)發(fā)者為完成本系統(tǒng)的業(yè)務(wù)邏輯而編寫的業(yè)務(wù)邏輯組件。
4.1.2 視圖(View)支持
Struts框架中,視圖部分除了支持JSP外,還支持JSTL、JSF和XSLT等模塊。同時(shí),Struts本身提供了很多的標(biāo)簽庫(kù),也支持自定義的標(biāo)簽庫(kù),從而減少了JSP中腳本的使用,提高了與模型的有效交互性。
4.1.3 控制器(Controller)支持
無(wú)論是純粹的MVC還是Struts框架,控制器都是整個(gè)技術(shù)的核心。在Struts框架中,控制器由ActionServlet和Action兩部分組成,它們也分別叫做系統(tǒng)核心控制器和業(yè)務(wù)邏輯控制器。系統(tǒng)核心控制器根據(jù)用戶不同的請(qǐng)求選擇不同Action類進(jìn)行處理,并預(yù)存了Action類所需的表單數(shù)據(jù)對(duì)象。業(yè)務(wù)邏輯控制器負(fù)責(zé)創(chuàng)建JavaBean對(duì)象或者EJB組件,這些對(duì)象或者組件通過(guò)調(diào)用相應(yīng)的方法就完成相應(yīng)的業(yè)務(wù)邏輯。
4.2 Spring
Spring是一個(gè)開(kāi)源的Web框架,由Rod Johnson創(chuàng)建。隨著企業(yè)應(yīng)用開(kāi)發(fā)越來(lái)越復(fù)雜,要完成復(fù)雜的EJB開(kāi)發(fā)變得很困難,但是利用Spring技術(shù),就可以實(shí)現(xiàn)利用基本的JavaBean解決復(fù)雜的企業(yè)應(yīng)用。Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(loC)和面向切面(AOP)的容器框架。
4.3 Hibernate
只要是做Web應(yīng)用的開(kāi)發(fā),對(duì)數(shù)據(jù)庫(kù)的操作都是非常重要的,Hibernate其實(shí)就是一種對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的技術(shù)。Hibernate不僅可以在Java Web開(kāi)發(fā)時(shí),通過(guò)對(duì)JDBC進(jìn)行非常輕量級(jí)的封裝,使應(yīng)用開(kāi)發(fā)者可以很輕松的操作數(shù)據(jù)庫(kù),而且也適用于任何使用JDBC操作數(shù)據(jù)庫(kù)的客戶端程序中。Hibernate還可以在應(yīng)用了EJB的企業(yè)級(jí)開(kāi)發(fā)應(yīng)用中取代CMP,完成數(shù)據(jù)的持久化功能。
具體的說(shuō),Hibernate通過(guò)5個(gè)核心接口:Session、Session Factory、Transaction、Query和Configuration的使用,完成數(shù)據(jù)的持久化工作。
5 結(jié)束語(yǔ)
在Java Web開(kāi)發(fā)中使用MVC設(shè)計(jì)模式開(kāi)發(fā)方式是一種很好的開(kāi)發(fā)思想,它充分發(fā)揮了設(shè)計(jì)模式高效、邏輯清晰、業(yè)務(wù)和界面分離的優(yōu)勢(shì)。同時(shí),MVC作為其他高級(jí)Web框架的基礎(chǔ),在軟件開(kāi)發(fā)中具有十分重要的作用。對(duì)于中小型的管理信息系統(tǒng)的開(kāi)發(fā),使用MVC設(shè)計(jì)模式顯著提高開(kāi)發(fā)效率。
參考文獻(xiàn):
[1]Brett D.McLaughlin Justin Edelson.JavaTM與XML[J].中國(guó)電力出版社,2011,(3).
[2]孫鑫.Struts 2深入詳解[J].電子工業(yè)出版社,2008.
[3]陳衍卿.JavaScript完全自學(xué)寶典.清華大學(xué)出版社,2008,(7).
作者簡(jiǎn)介:田豐,(1989-),男,云南文山人,大學(xué),研究方向:J2EE開(kāi)發(fā)、管理信息系統(tǒng)開(kāi)發(fā)、網(wǎng)絡(luò)工程。鄒國(guó)忠(1972-),男,云南玉溪人,本科,講師。研究方向:MIS、企業(yè)信息化建設(shè)、網(wǎng)絡(luò)工程。
基金項(xiàng)目:
云南省教學(xué)質(zhì)量工程項(xiàng)目“大學(xué)生創(chuàng)新性實(shí)驗(yàn)計(jì)劃項(xiàng)目”。
“大學(xué)生創(chuàng)新性實(shí)驗(yàn)計(jì)劃項(xiàng)目管理信息系統(tǒng)的開(kāi)發(fā)”(省級(jí))。
項(xiàng)目編號(hào):2011A08