前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇mvc框架范文,相信會為您的寫作帶來幫助,發(fā)現(xiàn)更多的寫作思路和靈感。
(中國礦業(yè)大學(xué)〈北京〉機(jī)電與信息工程學(xué)院,中國 北京 100083)
【摘要】一個好的設(shè)計模式能夠有效地建立系統(tǒng)結(jié)構(gòu),降低系統(tǒng)復(fù)雜度。模型-視圖-控制器(mvc)就是一個框架級的設(shè)計模式,它可以分離數(shù)據(jù)訪問和數(shù)據(jù)表現(xiàn),讓開發(fā)人員可以開發(fā)一個可伸縮性強(qiáng)的、便于擴(kuò)展的控制器,來維護(hù)整個流程。本文在介紹了MVC模式的發(fā)展、概念以及實(shí)現(xiàn)的基礎(chǔ)上,詳細(xì)介紹了MVC模式在Struts框架中的具體應(yīng)用。
關(guān)鍵詞 MVC模式;Struts框架;應(yīng)用研究
0引言
MVC模式最早由Trygve Reenskaug在1978年提出,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀(jì)80年代為程序語言Smalltalk發(fā)明的一種軟件設(shè)計模式。并且由于其鮮明特點(diǎn),廣泛受到程序開發(fā)人員的青睞。使用MVC模式的目的是實(shí)現(xiàn)一種動態(tài)的程式設(shè)計,使之簡化對后續(xù)程序的修改和擴(kuò)展,并且可以重復(fù)利用程序的某一部分。而基于MVC模式的Struts框架,可以將問題進(jìn)行劃分,成為一個個的小模塊,這樣使得問題更容易得到解決,系統(tǒng)結(jié)構(gòu)更加清晰,另外當(dāng)問題發(fā)生變化或者當(dāng)技術(shù)有所改變時,我們可以進(jìn)行代碼重用,這能夠極大的提高開發(fā)人員的開發(fā)效率。所以基于MVC模式的Struts框架非常適合開發(fā)大型的復(fù)雜系統(tǒng)。本文詳細(xì)介紹了MVC模式的基本思想,以及Struts框架的體系結(jié)構(gòu)。
1MVC模式概述
1.1MVC架構(gòu)
MVC英文即Model-View-Controller,即把一個應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進(jìn)行分離,這樣一個應(yīng)用被分成三個層——模型層、視圖層、控制層。模型(Model):就是業(yè)務(wù)流程/狀態(tài)的處理以及業(yè)務(wù)規(guī)則的制定。視圖(View)代表用戶交互界面,對于Web應(yīng)用來說,可以概括為HTML界面,但有可能為XHTML、XML和Applet。隨著應(yīng)用的復(fù)雜性和規(guī)模性,界面的處理也變得具有挑戰(zhàn)性??刂?Controller)可以理解為從用戶接收請求,將模型與視圖匹配在一起,完成用戶的請求。這實(shí)際上是一種模型的變化-傳播機(jī)制。模型、視圖、控制器三者之間的關(guān)系和各自的主要功能,如圖1所示。
1.2MVC模式的優(yōu)勢與不足
MVC能夠被眾多的web應(yīng)用系統(tǒng)作為主流框架,主要原因在于它具有巨大而眾多的優(yōu)勢,這主要體現(xiàn)在下面幾個方面。
(1)MVC可以讓一個正在運(yùn)行著的模型,同時建立和使用多個視圖,并且,MVC中具有一種特殊的機(jī)制,那就是內(nèi)置數(shù)據(jù)監(jiān)聽機(jī)制,依靠觀察者模式,這種機(jī)制可以監(jiān)聽模型層數(shù)據(jù)的更新,并且能夠同步將視圖層的數(shù)據(jù)進(jìn)行更新,以此來實(shí)現(xiàn)同步響應(yīng)。
(2)在視圖和控制器之間,是相互透明和獨(dú)立的。這種特點(diǎn),可以讓開發(fā)人員根據(jù)需要來動態(tài)的定制控制器和視圖之間的關(guān)聯(lián)關(guān)系,以此開發(fā)相對復(fù)雜的應(yīng)用系統(tǒng)。同樣因?yàn)橐晥D和模型之間是相互獨(dú)立、分別存在的,所以如果在做跨平臺的系統(tǒng)移植時,把一個模型單獨(dú)移植到新的平臺進(jìn)行工作就會相對比較簡單。我們僅僅需要在新的平臺上將視圖重新設(shè)計,并且重新運(yùn)行控制器。
(3)由于MVC是一種思想,是一種潛在框架結(jié)構(gòu),因此我們可以在此模型的基礎(chǔ)上建立客制化的應(yīng)用框架,以此來滿足客戶的個性化需求。
雖然MVC具有很多的優(yōu)點(diǎn),但是也有一些不足的地方,例如,使得系統(tǒng)結(jié)構(gòu)更加復(fù)雜,從而增加了實(shí)現(xiàn)的難度。此外,MVC適用于相對規(guī)模比較大的系統(tǒng),如果系統(tǒng)實(shí)現(xiàn)的功能結(jié)構(gòu)相對比較簡單,那么如果嚴(yán)格遵循MVC模式,反而會使得系統(tǒng)結(jié)構(gòu)復(fù)雜度增加,并且還有可能由于進(jìn)行跟多的更新操作,導(dǎo)致系統(tǒng)運(yùn)行效率降低。另外,視圖與控制器之間的耦合性過強(qiáng)。雖然在理論上,視圖與控制器之間是相互分離的,但是在實(shí)際的應(yīng)用中,視圖和控制器之間的耦合性還是比較強(qiáng)的。如果視圖中沒有控制器的話,那么他的應(yīng)用將會非常有限,反之亦然。這種強(qiáng)耦合阻礙了組件的獨(dú)立復(fù)用。還有,視圖通過模型界面訪問數(shù)據(jù)的效率很低,這是由于在模型層中提供的接口是不相同的,因此視圖為了獲得足夠多的顯示數(shù)據(jù),往往需要進(jìn)行多次調(diào)用,這種方式訪問數(shù)據(jù)的效率比較低,并且對系統(tǒng)操作性能也有一定的影響。
綜上所述,通過對MVC模式的分析,可以看出MVC模式的作用是很明顯的,并且在大的系統(tǒng)結(jié)構(gòu)中作用會更加明顯。
2MVC模式基本實(shí)現(xiàn)方法
實(shí)現(xiàn)MVC模式的方法不止一種,例如使用Struts或jsf等MVC模式的框架,本身就是一個實(shí)現(xiàn)。下面主要來介紹一種簡單的基本實(shí)現(xiàn)方法。
2.1Model的實(shí)現(xiàn)
在Model的實(shí)現(xiàn)過程中,最關(guān)鍵的地方在于定義一個具有存儲多個數(shù)據(jù)更新的用的監(jiān)聽對象向量。并且根據(jù)這個向量可以編寫出下面的兩個函數(shù),以此來分別實(shí)現(xiàn)添加數(shù)據(jù)業(yè)務(wù)時監(jiān)聽對象的添加和發(fā)生更新時能及時把消息發(fā)送給所有的監(jiān)聽對象:
//當(dāng)注冊模型發(fā)生修改時需通知的對象
public void addChangeListener(View cv) throwsException{
//** 1添加cv到變化監(jiān)聽隊(duì)列
changeListeners. add(cv);
}
//觸發(fā)模型變化事件
private void fireModelChangeEvent(Objectf){
View V;
for ( int i=0; i<changeListeners. size(); i++){
try {
//將變化通知隊(duì)列中的每個視圖
System. ou.t println(dMode:l fireModelChangeEvent loopd+i);
v=(View)changeListeners. get( i);
v. handleChange(f);
}catch(Exception e){
System out println(e toString());
}
}
}
2.2View的實(shí)現(xiàn)
在視圖的實(shí)現(xiàn)過程中,關(guān)鍵的地方有三點(diǎn)。第一點(diǎn)是我們在進(jìn)行視圖構(gòu)造函數(shù)時,需要將視圖注冊到指定的模型對象中去(model addChangeListener(view));第二點(diǎn)需要做的就是定義一個能夠存放和它所關(guān)聯(lián)的控制器對象的向量,并且我們需要根據(jù)這個向量的對象,定義增加動作監(jiān)聽者的注冊方法(public void addUserGestureListener(Controllerb));最后,我們還得需要為視圖編寫一個能夠依靠傳入對象的類型來顯示不同的界面的方法。通過上面所說的三個關(guān)鍵點(diǎn),視圖就能夠?qū)崿F(xiàn)接收模型更新的通知、發(fā)送動作到控制器,并且能夠接受控制器對顯示界面的控制。
2.3Controller的實(shí)現(xiàn)
相對于模型的實(shí)現(xiàn)和視圖的實(shí)現(xiàn),控制器的實(shí)現(xiàn)要簡單很多。因?yàn)閷τ诳刂破鱽碚f,只需定義一個模型對象和視圖對象就能能實(shí)現(xiàn)。模型對象是為了方便在函數(shù)中進(jìn)行調(diào)用其業(yè)務(wù)的行為,視圖對象是為了方便于將控制器的動作注冊到視圖中去,使他們可以成為該視圖的動作接收者。
3基于MVC模式的Struts框架
所謂的基于MVC模式的STRUTS框架,實(shí)際上就是把JavaServlet、JSP、自定義標(biāo)簽(TagLib)、JavaBeans、XML和信息資源(Resource Bundles)整合到一個統(tǒng)一的框架中,由此組成了一個可復(fù)用的MVC設(shè)計。Struts框架本身帶有自己的控制器,同時還整合了其它的一些能夠?qū)崿F(xiàn)模型層和視圖層的技術(shù),而且,Struts框架提供了許多可供擴(kuò)展和定制的地方。同時,Struts提供自定義標(biāo)記庫,通過這些自定義標(biāo)記可以順利完成和系統(tǒng)的Model部分交互,通過使用這些自定義標(biāo)記創(chuàng)建的JSP表單,可以實(shí)現(xiàn)和Model部分中的ActionForm的映射,以此來完成對用戶數(shù)據(jù)的封裝。圖2顯示了Struts的工作流程。
(1)Struts框架總控制器(ActionServlet),作用是用來完成所有初始化工作。當(dāng)啟動總控制器之后,首先會讀取Struts-config.xml 的配置信息,目的是為相應(yīng)的對象進(jìn)行不同的Struts模塊初始化。當(dāng)在Web容器啟動時,初始化動作也會自動完成,總控制器完成初始化動作后,將通過URL匹配映射截獲所有以.do結(jié)尾的URL請求。
(2)用戶向Web應(yīng)用程序器提交一個請求的方法有兩種,一種是提交表單,另一種是調(diào)用URL,而用戶請求的數(shù)據(jù)會通過HTTP協(xié)議上傳給Web服務(wù)器。
(3)控制器接收HTTP請求,然后控制器首先會通過ActionConfig找出對應(yīng)該請求的Action子類,如果沒有找到對應(yīng)的Action,控制器直接會把請求轉(zhuǎn)發(fā)給JSP或者靜態(tài)頁面。如果有對應(yīng)的Action,并且這個Action有一個相應(yīng)的ActionForm,ActionForm首先會被控制器實(shí)例化,然后會使用HTTP請求的數(shù)據(jù)來填充其屬性, 然后保存在ServletContext 中,這樣就可以被其它Action對象或者JSP調(diào)用。
(4)控制器根據(jù)配置信息將請求切換到具體的ActionFormBean也一并傳給這個Action的execute()方法。
(5)Action一般其中只包含一個execute()方法, 它的作用是負(fù)責(zé)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯,然后會返回一個ActionForward對象, 控制器會通過這個ActionForward對象來進(jìn)行轉(zhuǎn)發(fā)工作。
(6)根據(jù)業(yè)務(wù)處理時產(chǎn)生的不同結(jié)果,Action會返回一個目標(biāo)相應(yīng)對象給總控制而這個目標(biāo)相應(yīng)對象對應(yīng)的是一個具體的JSP頁面或者另外一個Action。
(7)總控制器根據(jù)業(yè)務(wù)功能Action返回的目標(biāo)響應(yīng)對象,將HTTP請求轉(zhuǎn)換到這個目標(biāo)響應(yīng)對象中, 通常來說,它是一個具體的JSP頁面。
(8)目標(biāo)響應(yīng)對象(JSP)將結(jié)果頁面展現(xiàn)給用戶。
4結(jié)論
綜上所述,MVC模式已經(jīng)被廣泛的應(yīng)用于軟件開發(fā)之中,它可以通過對復(fù)雜度的簡化,使程序結(jié)構(gòu)更加直觀。軟件系統(tǒng)通過對自身基本部分分離的同時也賦予了各個基本部分應(yīng)有的功能。而使用基于MVC模式的Struts框架極大的提高了控制層的靈活性,增加了代碼的可重用性。并且由基于MVC模式的Struts框架構(gòu)建的復(fù)雜系統(tǒng)可以分離數(shù)據(jù)訪問和數(shù)據(jù)表現(xiàn),讓開發(fā)人員可以開發(fā)一個可伸縮性強(qiáng)、便于擴(kuò)展的控制器,來維護(hù)整個流程。因此在結(jié)構(gòu)復(fù)雜的系統(tǒng)中基于MVC模式的Struts框架有著很大的優(yōu)勢和發(fā)展前景。
參考文獻(xiàn)
[1][美]Ivor Horton.Java 2 入門經(jīng)典 JDK5[M].潘曉雷,于浚泊,,等,譯.北京:機(jī)械工業(yè)出版社,2005:1-1058.
[2]賴英旭,劉增輝,李毛毛.MVC模式在B/S系統(tǒng)開發(fā)中的應(yīng)用研究[J].微計算機(jī)信息,2006,22(10-3):62-64.
[3]孫衛(wèi)琴.精通Struts:基于MVC的Java Web設(shè)計與開發(fā)[M].北京:電子工業(yè)出版社,2004,8:7-35.
[4]菜劍,景楠. Java Web應(yīng)用開發(fā):J2EE和Tomcat[M].2版.北京:清華大學(xué)出版社,2005,1:35-250.
[5]孫衛(wèi)琴,李洪成.Tomcat與Java.Web開發(fā)技術(shù)詳解[M].北京:電子工業(yè)出版社,2004,4:29-134.
[6]殷兆麟,張永平,姜淑娟.Java網(wǎng)絡(luò)高級編程[M].北京:清華大學(xué)出版社,北京交通大學(xué)出版社,2005,5:94-235.
【關(guān)鍵詞】mvcjava應(yīng)用程序框架實(shí)踐探索
一、框架的設(shè)計
1、設(shè)計目標(biāo)
設(shè)計目標(biāo)是完成應(yīng)用程序通用的部分,這樣程序員就可以將自己的精力和注意力放在具體程序的業(yè)務(wù)邏輯上,而和業(yè)務(wù)邏輯沒有關(guān)系的部分就可以被忽略??蚣苁褂玫氖荕VC模式,該模式可以把數(shù)據(jù)的顯示和數(shù)據(jù)分開。對于程序員來說,其工作就是把核心數(shù)據(jù)放到表示數(shù)據(jù)的類之中,此外將相應(yīng)的方法添加到其中。從本質(zhì)上將,框架屬于完整的程序,因此其運(yùn)行不需要添加一行代碼。關(guān)于框架支持的應(yīng)用程序的分類:(1)單文檔單視圖。也就是說在應(yīng)用程序中存在一個文檔。此外,只有一種類型的一個視圖。(2)多文檔類型。在同一個應(yīng)用程序?qū)嵗校瑧?yīng)用程序可以將多個文檔框架窗口打開。
2、MVC 模式的使用
之所以使用MVC 模式,是因?yàn)槠渚哂幸韵聝?yōu)點(diǎn):(1)MVC 模式和該框架的設(shè)計目標(biāo)相符。(2)可以建立和使用多個視圖。(3)視圖與控制器的可接插性。(4)模型的可移植性。(5)MVC模式有很多的應(yīng)用,比如:java的可視化組件就對其進(jìn)行了使用。
3、類的劃分
應(yīng)用程序框架中的類主要包括以下幾個方面:應(yīng)用程序類、文檔類、視圖類、子框架窗口類、事件類、框架窗口類、狀態(tài)欄類、工具欄類、菜單欄類等。
4、類之間的關(guān)系
文檔類,視圖類和控制類之間的關(guān)系如圖1所示。
圖1 文檔類、視圖類和控制類之間的關(guān)系
應(yīng)用程序類和文檔管理類的關(guān)系見圖2。
圖2應(yīng)用程序類和文檔管理類的關(guān)系
視圖類和子框架窗口類的關(guān)系見圖3。
圖3 視圖類和子框架窗口類的關(guān)系
二、框架中消息流程
命令消息的流程。框架中的命令消息分為:數(shù)據(jù)操作命令消息和框架命令消息兩類??蚣苊钕ⅲ涸谠伎蚣苤?,有新建文檔命令,將文檔命令打開,對文檔命令進(jìn)行保存,另存文檔命令和退出程序命令。數(shù)據(jù)操作命令消息:消息流程是:用戶操作控制類對象框架窗口子框架窗口視圖文檔視圖。
"激活"消息流程。一定要讓視圖的視覺狀態(tài)和在框架中真實(shí)狀態(tài)一致。當(dāng)視圖處于活動狀態(tài)時,需要滿足以下幾個條件:(1)視圖處于接受操作的狀態(tài)。(2)和視圖有關(guān)的子框架窗口處于活動狀態(tài)。(3)文檔管理器表示活動文檔的成員指向該文檔。激活"消息的傳送流程設(shè)計見圖4。
圖4"激活"消息的傳送流程設(shè)計
1、模板功能的實(shí)現(xiàn)
可以生成某個類實(shí)例的對象就是模板。一個模板可以生成若干個對象,也可以只生成一個對象。模板功能的實(shí)現(xiàn)思路:程序員需要先創(chuàng)建一個類的對象,之后將其注冊到框架。在需要時,框架對該對象進(jìn)行使用,這樣就可以生成其他對象。
2、文檔類的實(shí)現(xiàn)
文檔類對數(shù)據(jù)的公共操作包括:新建文檔,打開文檔,另存文檔,保存文檔操作,關(guān)閉文檔操作。文檔數(shù)據(jù)的存取。文檔類型不同,那么其中的數(shù)據(jù)也就有差異。因此,還沒有一種方法把全部種類的文檔的數(shù)據(jù)序列化到文件,因此需要提供這兩個抽象接口。
3、視圖類的實(shí)現(xiàn)
視圖類的方法有:視圖更新方法,接受激活消息的方法,關(guān)閉視圖類實(shí)例的方法。此外,視圖必須捕獲激活事件。
視圖類子類XxView的設(shè)計。第一步對父類的構(gòu)造函數(shù)進(jìn)行調(diào)用,第二步對數(shù)據(jù)成員變量、可視化組件實(shí)施初始化,最后把這些組件添加到視圖之中。需要實(shí)現(xiàn)的方法是ViewMvc getInstance().
4、 文檔管理類的設(shè)計
文檔管理類可以被分為兩類:(1)僅僅用于單文檔模式,這一類只管理一個文檔。(2)用于多文檔模式。這一類可以管理多個文檔。
文檔管理類基類 DocumentManager的設(shè)計。面對對象理論主要強(qiáng)調(diào)的是針對接口進(jìn)行編程,這樣做對于系統(tǒng)的擴(kuò)展和維護(hù)是十分有利的。在文檔管理類的設(shè)計中使用該原則的目的是讓單文檔管理器和多文檔管理器的差異對于框架透明。我們可以可以提取這兩種管理器的共同操作,因此就可以形成一個接口。對這個接口我們命名為:DocumentManager。DocumentManager有:(1)新建文檔接口。文檔管理器主要對文檔進(jìn)行管理,比如:銷毀、創(chuàng)建以及初始化等。因此,框架處理用戶的"新建......"命令時,需要調(diào)用文檔管理器的新建文檔接口。(2)打開文檔接口。文檔的打開可以說是文檔創(chuàng)建的一種方式,因此框架在響應(yīng)用戶"打開......"命令時,也會把這一任務(wù)交給文檔管理器。此時,文檔管理器就會打開文檔。(3)關(guān)閉文檔接口。文檔的銷毀即文檔的關(guān)閉,因此當(dāng)響應(yīng)用戶退出程序命令時,會對文檔管理器進(jìn)行委托,關(guān)掉全部的文檔。(4)接收文檔激活消息的接口。如果試圖激活,那么和試圖有關(guān)的文檔此時也會被激活。該文檔被激活的消息需要被發(fā)送到文檔管理器,這樣做的目的是方便讓文檔管理器激活這一文檔。
結(jié)束語:
21世紀(jì)軟件工業(yè)發(fā)展的一大趨勢是軟件構(gòu)件化。目前,工業(yè)化的軟件復(fù)用已經(jīng)進(jìn)化到了面向領(lǐng)域的應(yīng)用框架??蚣苁且环N可復(fù)用設(shè)計,主要表現(xiàn)形式是:構(gòu)件實(shí)例間交互的方法。筆者對mvc的java應(yīng)用程序框架的實(shí)踐進(jìn)行了分析和探討,希望對大家有借鑒的意義。
參考文獻(xiàn):
關(guān)鍵詞:MVC模式;Struts;Web應(yīng)用
中圖分類號:G642 文獻(xiàn)標(biāo)識碼:A
傳統(tǒng)的Web應(yīng)用開發(fā)工具(ASP、JSP)將頁面顯示、商業(yè)邏輯和數(shù)據(jù)處理大部分都集中在頁面代碼中,Web應(yīng)用擴(kuò)展維護(hù)比較困難,在大型Web應(yīng)用開發(fā)中愈發(fā)顯得力不從心。MVC設(shè)計模式將頁面顯示、商業(yè)邏輯和數(shù)據(jù)處理相分離,最大限度地降低系統(tǒng)各部分之間的耦合性,提高代碼重用率,易于分工協(xié)作。而Struts是一個為開發(fā)基于MVC模式的應(yīng)用架構(gòu)的開源框架。
1MVC設(shè)計模式
MVC設(shè)計模式是一種著名的用戶界面軟件開發(fā)設(shè)計模式,它是模型-視圖-控制器(Model-View-Controller)縮寫。在MVC設(shè)計模式中,它把應(yīng)用程序分成了3個核心部分,原理如圖1所示。
(1) 模型(Model)。模型封裝了用戶數(shù)據(jù)和處理數(shù)據(jù)的業(yè)務(wù)邏輯,體現(xiàn)了應(yīng)用程序的當(dāng)前狀態(tài),而且可以將用戶數(shù)據(jù)狀態(tài)的變化提供給多個顯示該數(shù)據(jù)的視圖共用。
(2) 視圖(View)。視圖提供了用戶界面,是用戶和應(yīng)用程序的交互的窗口,既接受用戶輸入,也把模型數(shù)據(jù)狀態(tài)顯示給用戶,但是視圖不負(fù)責(zé)任何業(yè)務(wù)邏輯處理,僅僅是將用戶輸入數(shù)據(jù)傳遞給控制器或?qū)⒛P蛿?shù)據(jù)顯示給用戶。
(3) 控制器(Controller)??刂破鬟B接了模型和視圖,根據(jù)用戶請求判斷將請求交給哪個模型來完成,然后調(diào)用視圖來顯示模型處理后的用戶請求結(jié)果。
MVC設(shè)計模式將應(yīng)用程序進(jìn)行了分層,提高了軟件的可擴(kuò)展性、可維護(hù)性。
2Struts框架
Struts框架繼承了MVC設(shè)計模式的特性,是J2EE體系架構(gòu)的一種輕量級實(shí)現(xiàn)。其工作原理如圖2所示:
(1) 控制器的實(shí)現(xiàn)。Struts框架中采用了ActionServlet和Action類以及Struts-config.xml配置文件作為控制器的實(shí)現(xiàn)。其中,Struts-config.xml配置文件配置了不同用戶請求及對應(yīng)的具體業(yè)務(wù)邏輯組件來供ActionServlet類查詢。ActionServlet類是中心Servlet,負(fù)責(zé)處理所有的用戶請求。當(dāng)用戶提出請求,ActionServlet類最先對請求進(jìn)行處理,它將根據(jù)Struts-config.xml配置文件將用戶請求映射到具體的Action類;而當(dāng)Action類調(diào)用模型組件處理好用戶請求,并返回了處理結(jié)果后,仍然由ActionServlet類根據(jù)Struts-config.xml配置文件將結(jié)果轉(zhuǎn)發(fā)到視圖提供給用戶,或者轉(zhuǎn)發(fā)另外一個Action做進(jìn)一步處理。Action類實(shí)現(xiàn)了具體的業(yè)務(wù)邏輯,它接受用戶的輸入,然后調(diào)用具體的模型組件來完成用戶請求。
(2) 視圖的實(shí)現(xiàn)。Struts構(gòu)架主要采用了JSP作為視圖的實(shí)現(xiàn),它提供了豐富的JSP標(biāo)簽庫支持應(yīng)用程序的開發(fā),而且引入了ActionForm組件(實(shí)質(zhì)為JavaBean)作為用戶表單的封裝來完成數(shù)據(jù)的傳輸。
(3) 模型的實(shí)現(xiàn)。Struts框架對模型――即復(fù)雜的數(shù)據(jù)持久化層沒有提供太多的支持,但是這也就是說開發(fā)人員有更多自由來選擇合適量級的持久化技術(shù),比如Hibernate、EJB等。
3Struts工作流程
對于采用Struts 框架的Web應(yīng)用,其具體工作流程如下:
(1) 客戶端通過本地瀏覽器向服務(wù)器發(fā)出一個請求;
(2) 控制器接收請求,找到對應(yīng)的Action;
(3) Action類執(zhí)行建立在模型組件基礎(chǔ)上的業(yè)務(wù)邏輯;
(4) 一旦Action類處理完業(yè)務(wù)邏輯,它把控制權(quán)返回給ActionServlet;
(5) 當(dāng)ActionServlet把Action類的處理結(jié)果傳送到指定的視圖中。
4Web開發(fā)中的應(yīng)用
以一個Web考試系統(tǒng)中的考生注冊子系統(tǒng)為例,說明Struts 在Web程序開發(fā)中的應(yīng)用。考生在注冊頁面上輸入考生名、密碼等相關(guān)信息,若注冊成功,控制將轉(zhuǎn)向一個顯示注冊成功的頁面,否則控制將轉(zhuǎn)向一個顯示失敗的頁面。具體步驟如下:
(1) 項(xiàng)目建立。
(2) 實(shí)現(xiàn)視圖功能的用戶界面的設(shè)計。Struts中,JSP 頁面中利用Struts框架提供的taglib 標(biāo)記庫的標(biāo)記能夠大大提高開發(fā)效率。在該系統(tǒng)中,其注冊頁面reguserinfo.jsp 概要如下:
…
//引用Struts bean 標(biāo)記
…
UserName:
Password:
…
(3) 實(shí)現(xiàn)模型功能的組件設(shè)計。模型部分包含了應(yīng)用程序的業(yè)務(wù)邏輯。
① 系統(tǒng)狀態(tài)組件(FormBean),即實(shí)體模型類,它繼承自ActionForm類,用來存放表單數(shù)據(jù),與注冊頁面的表單對應(yīng)的數(shù)據(jù)Bean如下:
…;
public class UserForm extends ActionForm{
…
public String getUserID(){return userID;}
public void setUserID(String userID)
{this.userld= userID;}
…
}
② 指令類組件(ActionBean),它擴(kuò)展了Action 類,主要是用來控制應(yīng)用程序的流程,當(dāng)注冊考生按“Submit”按鈕后,來自用戶的請求被Servlet 送到指令類組件RegUserAction,指令類調(diào)用相應(yīng)的業(yè)務(wù)邏輯進(jìn)行處理,然后把請求轉(zhuǎn)發(fā)給相關(guān)的JSP,其程序概要為:
…;
public class RegUserAction extends Action
{
public ActionForward perform(ActionMapping
mapping, ActionForm form, HttpServletRequest
req, HttpServletResponse response) {
//獲取注冊信息,并據(jù)此做相應(yīng)操作
…
}
}
(4) 實(shí)現(xiàn)控制器功能的指令??刂破黝怉ctionServlet的核心是Struts-config.xml 配置文件,它包含了應(yīng)用程序的整個邏輯流程。在考生注冊信息過程中,用reguserinfo.jsp實(shí)現(xiàn)注冊頁面;用UserForm(擴(kuò)展了ActionForm)封裝了表單數(shù)據(jù);用RegUserAction實(shí)現(xiàn)了考生注冊信息并控制了應(yīng)用程序流程;而在Struts-config.xml 配置文件里實(shí)現(xiàn)了注冊頁面(reguserinfo.jsp)、數(shù)據(jù)Bean(UserForm)、邏輯Bean(RegUserAction)之間的聯(lián)系,其配置信息為:
…
name="userForm"scope="request">
…
當(dāng)在注冊頁面上單擊“Submit”按鈕時,考生請求被提交給ActionServlet, ActionServlet 根據(jù)Struts-config.xml 中的配置信息,把/reguser.do 的URL映射到RegUserAction,把考生注冊信息封裝到UserForm,由RegUserAction 完成
注冊操作,然后轉(zhuǎn)發(fā)給“/regsuccess.jsp”。
(5) 系統(tǒng)運(yùn)行。 完成整個系統(tǒng)的功能實(shí)現(xiàn)。
5總結(jié)
Struts體系框架自從2001年7月了1.0版之后,已經(jīng)越來越得到Java開發(fā)者的支持,實(shí)踐證明,Struts體系框架的確是一個優(yōu)秀的框架,大大縮短了Java Web應(yīng)用程序的開發(fā)周期,提高了系統(tǒng)開發(fā)效率。
參考文獻(xiàn):
[1] 孫衛(wèi)琴. 精通Struts:基于MVC的JavaWeb設(shè)計與開發(fā)[M]. 北京:電子工業(yè)出版 ,2004.
[2] 閻宏. Java與模式[M].北京:電子工業(yè)出版社,2002.
[3] Ted Husteel, Cedric Dumoulin, David Wiwerfeldt, et al.《Struts in Action》[M]. ManningPublication co.2001.
Application Methods of Struts Framework Based on MVC Designed Pattern
XU Cong, WANG Ya-xuan
(Software College, Dalian University of Foreign Language, Dalian 116044, China)
關(guān)鍵詞:Ajax技術(shù);Struts框架;異步響應(yīng);JavaScript
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)34-1650-03
The Research of Web Application Framework Based on the Collaboration of Ajax Technology and MVC Pattern
HE Xi-chun, XIONG Qian-xing, WU Ting
(Department of Computer Science and Technology, Wuhan University of Technology, Wuhan 430063, China)
Abstract: There are many problems in the existing Electronic Application System with the B/S mode. For example: The user always needs to wait for a long time for the result; the server always has to be under large pressure; a large part of resources at the client-side are leaved unused and so on.. This article studies the Ajax technology at first, and then combines it with the Struts Framework based on the MVC design pattern. With the collaborative work from the two parts, we can promote the response speed of the Web applications based on the B/S mode and construct a more effective web-application framework.
Key words: Ajax technology; Struts framework; asynchronous response; JavaScript
隨著Internet的飛速發(fā)展,基于Web的諸多應(yīng)用以其豐富而生動的界面和方便使用等特點(diǎn)在信息化的建設(shè)中發(fā)揮的作用日益顯著。隨著服務(wù)器端開發(fā)技術(shù)的成熟,越來越多的開發(fā)人員開始親睞B/S(Browser/Server)的設(shè)計模式。如何克服B/S模式自身的一些問題:例如用戶體驗(yàn)不如C/S模式;服務(wù)器端壓力過大,沒有充分利用客戶端的資源,也就成為應(yīng)用系統(tǒng)需要研究的新問題。例如,某大型水路征稽系統(tǒng),就是一個典型的電子政務(wù)系統(tǒng)。該系統(tǒng)集征稽與管理為一體,征稽部分幫助完成用戶開票操作,管理部分用于數(shù)據(jù)的統(tǒng)計分析和查詢。征稽部分對實(shí)時性和數(shù)據(jù)的準(zhǔn)確性要求很高,
并且用戶輸入的過程中涉及到相關(guān)數(shù)據(jù)的驗(yàn)證。綜合起來,就是要求服務(wù)器既能提供相當(dāng)于本地系統(tǒng)似的響應(yīng)速度,又可以提供大量數(shù)據(jù)的統(tǒng)計查詢。
針對以上問題,本文提出將Ajax技術(shù)與MVC模式相結(jié)合的新型web框架應(yīng)用到電子系統(tǒng)中。為了避免頁面的臃腫和維護(hù)的困難,在中間層上采用MVC的設(shè)計模式。同時利用Ajax技術(shù)實(shí)現(xiàn)瀏覽器與服務(wù)器無刷新交互,數(shù)據(jù)的按需獲取與頁面的部分加載,極大的緩解網(wǎng)絡(luò)流量。將Ajax的優(yōu)越性,與現(xiàn)有的MVC設(shè)計模式相結(jié)合,使得Web應(yīng)用不僅層次分明,可重用性強(qiáng),具有高的健壯性和可伸縮性,而且具有良好、豐富的用戶體驗(yàn)。
1 基于MVC模式的Struts框架介紹
MVC(Model-View-Control)模式,就是模型-視圖-控制器模式,其核心思想是將程序劃分
成相互獨(dú)立又能協(xié)同工作的三個部分,現(xiàn)在是web應(yīng)用程序普遍采用的開發(fā)模式。Struts即是MVC設(shè)計模式一種實(shí)現(xiàn)。
1) 控制器:控制層,起到控制整個業(yè)務(wù)流程(Flow Control)的作用,實(shí)現(xiàn)視圖和模型部分的協(xié)同工作。在Struts中起著控制器的作用的是ActionServlet。所有的控制邏輯利用Struts一config.xml文件來配置。
2) 視圖:視圖是應(yīng)用程序中與用戶實(shí)現(xiàn)交互的界面相關(guān)的部分,即表示層,通常實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出功能。主要是由JSP來控制頁面的輸出。
3) 模式:模型是應(yīng)用程序的主體部分。模型表示業(yè)務(wù)數(shù)據(jù),或者業(yè)務(wù)邏輯,具有實(shí)現(xiàn)具體的業(yè)務(wù)邏輯、狀態(tài)管理的功能。
模型-視圖-控制器模式工作流程見圖1。
Struts框架優(yōu)點(diǎn)顯而易見:可以將邏輯處理與頁面顯示清楚分開;頁面顯示可以使用JSP標(biāo)簽庫,從而大大提高開發(fā)效率;通過一個配置文件,既可以把握整個系統(tǒng)各部之間的聯(lián)系,又可以大大減少后期維護(hù)的工作量。但是在服務(wù)器端提供了良好而成熟的架構(gòu)實(shí)現(xiàn)的Struts框架,在客戶端卻沒有相應(yīng)的架構(gòu),這使Struts在一些交互性強(qiáng)的頁面應(yīng)用不理想,導(dǎo)致刷新頁面頻繁,延長用戶的等待時間。在上例的系統(tǒng)中,存在很多用戶交互頻繁的頁面,這也導(dǎo)致系統(tǒng)效率低下,造成服務(wù)器資源和網(wǎng)絡(luò)資源的浪費(fèi)。
2 Ajax的工作原理
Ajax(Asynchronous JavaScript and XML)并不是一門新的語言或技術(shù),實(shí)際上它是幾項(xiàng)技術(shù)按一定方式的組合,在共同的協(xié)作中發(fā)揮各自的作用。
傳統(tǒng)的web應(yīng)用遵循一種請求/響應(yīng)的模式,對于每個請求都會重新加載整個頁面。Ajax的工作原理相當(dāng)于在用戶和服務(wù)器之間加了一個中間層,使用戶操作與服務(wù)器響應(yīng)異步化,從而消除了網(wǎng)絡(luò)交互過程中的“處理―等待―處理”的缺點(diǎn)[1]。每當(dāng)需要更新時,客戶端Web頁面的修改是異步的和逐步增加的。并且客戶端的瀏覽器可以分擔(dān)一部分的業(yè)務(wù)邏輯,而不再僅僅是顯示內(nèi)容;服務(wù)器傳送的僅僅是數(shù)據(jù),而不是內(nèi)容。這樣,Ajax在提交Web頁面內(nèi)容時大大提高了用戶界面響應(yīng)的速度。在基于Ajax的應(yīng)用程序中沒有必要長時間等待整個頁面的刷新。頁面中需要更新的那部分才進(jìn)行更改,如果可能的話,更新是在本地完成的,并且是異步的。所以基于Ajax技術(shù)的應(yīng)用程序可以給用戶提供桌面程序般的使用體驗(yàn)?;贏jax的web模型和Ajax引擎模型見圖2。
由于Ajax技術(shù)本身的優(yōu)越性,基于Ajax技術(shù)的Web型框架現(xiàn)在已經(jīng)應(yīng)用到很多程序中。例如Gmail、Google Map、Google Suggest就是幾個經(jīng)典的Ajax應(yīng)用。本文中重點(diǎn)要討論的就是將Ajax技術(shù)與現(xiàn)有的MVC開發(fā)模式相結(jié)合,應(yīng)用到項(xiàng)目開發(fā)中。
3 Ajax技術(shù)與MVC模式相結(jié)合的web框架
綜合上面所分析的,基于MVC模式的Struts是一種框架,雖然它可以很好的將業(yè)務(wù)邏輯和表示分離,但是大多數(shù)的Struts應(yīng)用都是標(biāo)準(zhǔn)的“如同一個平面文檔Web頁面”的結(jié)構(gòu)。Ajax是一項(xiàng)技術(shù),它的優(yōu)勢是使得Web頁面看起來接近像用戶所期望的桌面應(yīng)用的動態(tài)應(yīng)用程序,而不是一個平面的顯示文檔。將Ajax技術(shù)應(yīng)用到Struts框架中,可以充分的發(fā)揮兩者的優(yōu)點(diǎn),形成一種高效的web應(yīng)用框架。
3.1 Ajax技術(shù)與MVC相結(jié)合的方法
Ajax中實(shí)現(xiàn)異步響應(yīng)的onReadyStateChange事件具有在客戶端程序中的事件監(jiān)聽功能。在MVC模式中,視圖相當(dāng)于用戶看到的頁面,通過內(nèi)置的Ajax對象一步方式給控制器發(fā)送請求,Ajax中的onReadyStateChange則開始監(jiān)聽;控制器接受到頁面發(fā)送過來的請求(Get或者Post方式),通過請求判斷后發(fā)送給相應(yīng)的業(yè)務(wù)或者數(shù)據(jù)模型;則業(yè)務(wù)或者數(shù)據(jù)模型開始執(zhí)行業(yè)務(wù)操作,執(zhí)行完畢后直接給頁面發(fā)送數(shù)據(jù)更新的通知。頁面中Ajax對象的onReadyStateChange接收到數(shù)據(jù)的更新通知后,根據(jù)實(shí)際的情況用DOM進(jìn)行頁面更新。從上面的結(jié)合原理上可以了解,Ajax技術(shù)與Struts框架的結(jié)合要體現(xiàn)在頁面和控制器之間,進(jìn)行異步的控制。通過分析,在Struts框架中應(yīng)用Ajax技術(shù),實(shí)際上就是加入一個Ajax引擎,這個引擎主要是用來發(fā)送Ajax異步請求到服務(wù)器和接收服務(wù)器的Ajax響應(yīng),并動態(tài)更新頁面,由于采用的是Struts框架,那么無論是發(fā)送請求還是接收響應(yīng),都應(yīng)該完成到StrutsForm形式和StrutsAction形式的轉(zhuǎn)換。具體的結(jié)合方式可參見圖3中所示。
用戶的瀏覽器在執(zhí)行任務(wù)時就裝載了Ajax引擎,Ajax引擎用JavaScript語言編寫,它負(fù)責(zé)解釋執(zhí)行用戶界面及與服務(wù)器之的交互。Ajax引擎允許用戶與應(yīng)用軟件之間的交互過程異步進(jìn)行,獨(dú)立于用與網(wǎng)絡(luò)服務(wù)器間的交流。用JavaScript調(diào)用Ajax引擎來代替產(chǎn)生一個HTTP用戶動作,內(nèi)存中的數(shù)據(jù)編輯、頁面導(dǎo)航、數(shù)據(jù)校驗(yàn)這些不需要重新載入,整個頁面的需求可以交給Ajax來執(zhí)行。
通過分析Ajax技術(shù)與Struts框架結(jié)合的原理,可以知道Ajax作為一項(xiàng)技術(shù),能夠很方便的融入到基于MVC模式的Struts框架中。它并不需要任何新的庫文件或者服務(wù)器代碼;只需要使用現(xiàn)有的Struts庫文件和Action類。關(guān)鍵是在Struts的應(yīng)用中根據(jù)實(shí)際業(yè)務(wù)的需要,以模塊為單位加入Ajax的相關(guān)設(shè)置。首先需要確定哪些部分需要動態(tài)顯示,然后將她們更新到Ajax的異步通信執(zhí)行。
以Ajax技術(shù)的實(shí)現(xiàn)框架DWR為例。它能夠把服務(wù)器端Java對象的方法公開給JavaScript代碼。所以在這個引擎里,它最重要的就是提供了一個Java類到JavaScript對象的映射機(jī)制,也即是DWRServlet。DWR是作為Web應(yīng)用程序中的Servlet部署的。而在Struts的視圖、控制和模型三個組件中,ActionServlet就是它的控制器(Controller)。那么要將兩個框架結(jié)合起來,其實(shí)也就是將DWRServlet和Actionservlet結(jié)合起來,作為整合框架的核心-MVC模式的新的控制器。
3.2 新型web框架的應(yīng)用
某大型的水路征稽系統(tǒng)中的開票業(yè)務(wù)和協(xié)議簽訂業(yè)務(wù),對系統(tǒng)的響應(yīng)速度要求很高,且在運(yùn)行的過程中,需要對用戶的每一步輸入的信息進(jìn)行驗(yàn)證。這樣的需求,可以通過應(yīng)用Ajax技術(shù)和Struts架構(gòu)相結(jié)合的新型框架來滿足。
以統(tǒng)繳業(yè)務(wù)為例,該模塊幫助用戶完成協(xié)議的簽訂和電子協(xié)議的生成。首先需要在系統(tǒng)的web.xml文件中配置DWR和Struts這兩個Servlet以及其映射。
……
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
</init-param>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
……
<!----以上是指定Struts的ActionServlet--->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
……
</servlet>
<!---以上是指定DWR的DWRServlet---->
要調(diào)用的JavaBean方法需要在DWR的配置文件dwr.xml中進(jìn)行聲明,建立映射,如:
<create creator="new" javascript="getSnxyxx" scope="page">
<param name="class"
value="edu.whut.cwts.tj.xy.getSnxyxx" />
</create>
在頁面中直接調(diào)用相關(guān)的JavaBean:
function funcresult(result)
{
if(result=="1")//如果公司名稱驗(yàn)證通過,獲取該公司到目前的協(xié)議情況
{var result;
getSnxyxx.getallxxdwmc.value, dwxz.value,funcresult);
}
……}
function funcresult(result)
{//對公司協(xié)議信息的顯示
……
}
DWR允許用戶像調(diào)用JavaScript的函數(shù)一樣調(diào)用Java方法,對于Struts框架中的ActionForm類和Action類也可以直接通過DWR調(diào)用,只需要在dwr.xml文件根據(jù)實(shí)際業(yè)務(wù)需要,對用到的類進(jìn)行如上的聲明即可。程序中,根據(jù)實(shí)際業(yè)務(wù)需要有的地方DWR進(jìn)行實(shí)現(xiàn),有的地方用Struts來實(shí)現(xiàn),有的需要兩者結(jié)合實(shí)現(xiàn),進(jìn)行靈活控制,開發(fā)高效的水路電子征稽系統(tǒng)。
4 結(jié)束語
本文將現(xiàn)在比較流行的Ajax技術(shù)與成熟的開發(fā)模式MVC相結(jié)合,可以充分發(fā)揮兩者的優(yōu)點(diǎn),組成更為合理高效的新型web框架。Ajax技術(shù)可以異步響應(yīng)頁面請求,使得頁面的展現(xiàn)更加靈活動態(tài);基于MVC模式的Struts框架使得系統(tǒng)的開發(fā),測試和維護(hù)更加科學(xué)合理。將這種新型web框架應(yīng)用到應(yīng)用系統(tǒng)的開發(fā)中,有利于改善B/S模式應(yīng)用系統(tǒng)中普遍存在的問題,充分利用客戶端的資源,減輕服務(wù)器端壓力,給用戶提供基于web的功能和桌面級的用戶體驗(yàn)。
參考文獻(xiàn):
[1] 游麗珍,郭宇春,李純喜.Ajax引擎的原理和應(yīng)用[J].微計算機(jī)信息,2006,6(9):205-207.
[2] 佘名高,吳海林,熊童滿,等.Ajax在Struts中的應(yīng)用[J].計算機(jī)技術(shù)與發(fā)展,2007,10(17):69-72.
【關(guān)鍵詞】MVC模式;Joomla!;Web系統(tǒng);專家答疑組件
【中圖分類號】G40-057 【文獻(xiàn)標(biāo)識碼】A 【論文編號】1009―8097(2009)06―0097―04
軟件開發(fā)中,通常用耦合度和內(nèi)聚度作為衡量模塊獨(dú)立程度的機(jī)制。傳統(tǒng)的Web系統(tǒng)開發(fā),常常圍繞著事件驅(qū)動的界面表示層來組織開發(fā),此開發(fā)模式把數(shù)據(jù)處理、程序功能和界面層代碼完全雜糅在一起,不利于模塊間的復(fù)用,降低了系統(tǒng)各模塊間的獨(dú)立性,系統(tǒng)模塊間具有高耦合度。MVC模式由于把數(shù)據(jù)處理、程序輸入輸出控制和數(shù)據(jù)表示分離開來,并描述了三者之間的通訊方式,提高了系統(tǒng)各模塊間的獨(dú)立性與模塊的可復(fù)用性,很好的解決了上述傳統(tǒng)Web系統(tǒng)開發(fā)中所遇到的問題。
在Web系統(tǒng)開發(fā)中,對于MVC模式的實(shí)現(xiàn)主要有三種技術(shù)框架:基于ASP.NET的框架、基于PHP的框架、基于JSP的框架。基于ASP.NET的框架的最大弱點(diǎn)是不具有跨平臺性,依賴于Window平臺,安全性與穩(wěn)定性較弱且版權(quán)使用費(fèi)用昂貴;基于JSP的框架的最大弱點(diǎn)是開發(fā)周期長,技術(shù)實(shí)現(xiàn)復(fù)雜,只合適大型Web系統(tǒng)項(xiàng)目應(yīng)用;而實(shí)現(xiàn)MVC模式的PHP的框架由于具有跨平臺性、安全性與穩(wěn)定性高、開發(fā)周期短、開源(軟件免費(fèi)使用)等特征在中小型Web系統(tǒng)開發(fā)中得到了廣泛的應(yīng)用。作者通過文獻(xiàn)調(diào)研發(fā)現(xiàn),研究ASP.NET的框架與JSP的框架在Web系統(tǒng)開發(fā)中應(yīng)用的文獻(xiàn) 較多,而對于實(shí)現(xiàn)MVC模式的PHP框架在Web系統(tǒng)開發(fā)中的應(yīng)用研究則很少。
目前,基于MVC模式的PHP技術(shù)框架眾多,如Symfony、Zend Framework、Joomla!、Drupal等,開發(fā)者依據(jù)開發(fā)需求靈活的選擇框架,本文則選取Joomla!框架, 探討其在Web系統(tǒng)開發(fā)中如何進(jìn)行組件擴(kuò)展開發(fā)。首先,本文分析了基于MVC模式的Joomla!框架在Web系統(tǒng)擴(kuò)展開發(fā)中的應(yīng)用 設(shè)計思想、技術(shù)方法;其次,重點(diǎn)分析了Joomla!框架在Web系統(tǒng)擴(kuò)展開發(fā)中的擴(kuò)展機(jī)制;最后,以某外語教育出版社高等英語教學(xué)網(wǎng)專家答疑組件擴(kuò)展開發(fā)為案例,剖析了Joomla!框架擴(kuò)展機(jī)制在Web系統(tǒng)擴(kuò)展開發(fā)中的實(shí)現(xiàn)。
一 Joomla!框架應(yīng)用于Web系統(tǒng)的組件擴(kuò)展設(shè)計
由于Joomla!框架具有自帶的用戶注冊管理、新聞、媒體管理等組件,并且擁有優(yōu)秀的擴(kuò)展能力等優(yōu)勢,提高了開發(fā)的效率和靈活性,因此它在中小Web系統(tǒng)開發(fā)中得到了廣泛應(yīng)用。Joomla!框架的組件概念即是完成一定功能的應(yīng)用程序。下面圍繞Joomla!框架的Web組件擴(kuò)展問題分別對Joomla!框架應(yīng)用于Web系統(tǒng)組件擴(kuò)展開發(fā)的設(shè)計思想、技術(shù)方法進(jìn)行探討。
1 Joomla!框架組件擴(kuò)展的MVC模式設(shè)計思想
為了克服傳統(tǒng)Web開發(fā)中將數(shù)據(jù)處理、程序功能和界面代碼完全雜糅在一起的問題,Joomla!框架應(yīng)用于Web系統(tǒng)組件擴(kuò)展開發(fā)遵循MVC模式設(shè)計思想,如圖1所示,包含三個部分:模型(Model)視圖(View)和控制器(Controller) ,分別對應(yīng)于內(nèi)部數(shù)據(jù)數(shù)據(jù)表示和輸入輸出控制。
模型用于封裝與應(yīng)用程序的業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)以及對數(shù)據(jù)的處理方法;視圖是模型的外在表示,一個模型可以對應(yīng)一個或者多個視圖,視圖是程序系統(tǒng)與外界的接口;控制器起到 溝通模型和視圖的作用,用于控制應(yīng)用程序的流程。它處理來自用戶的行為事件和數(shù)據(jù)模型的改變事件,并對事件進(jìn)行響應(yīng)。
如圖1所示,Joomla!框架遵循MVC設(shè)計思想進(jìn)行Web系統(tǒng)擴(kuò)展開發(fā)采用如下的數(shù)據(jù)交換機(jī)制:控制器――視圖和控制器――模型方法。控制器是視圖和模型之間進(jìn)行數(shù)據(jù)交換的紐帶,在控制器――視圖方法中,控制器根據(jù)用戶輸入直接調(diào)用不同視圖改變響應(yīng)流程,或與模型交互后獲得需要顯示的數(shù)據(jù),再調(diào)用視圖改變響應(yīng)流程;而在控制器――模型方法中,控制器與模型交換,控制器將輸入數(shù)據(jù)傳遞給模型處理,控制器中也可以從模型中抽取數(shù)據(jù)。
2 Joomla!框架組件擴(kuò)展的技術(shù)方法
采用Joomla!框架進(jìn)行Web系統(tǒng)的組件擴(kuò)展開發(fā),要求開發(fā)者編程語言必須使用PHP技術(shù),數(shù)據(jù)庫使用MySQL、 Web服務(wù)器通常推薦開源的(免費(fèi)使用)的Apache。Joomla!官方的最新框架版本采用分層架構(gòu)機(jī)制:框架層、應(yīng)用層、擴(kuò)展層,框架層由Joomla!的基本類庫和插件組成;應(yīng)用層由應(yīng)用程序類構(gòu)成;擴(kuò)展層由組件、模塊、模板構(gòu)成,其架構(gòu)機(jī)制如圖2所示。
Joomla!框架應(yīng)用于Web系統(tǒng)擴(kuò)展開發(fā)的方法對于Web系統(tǒng)交互界面設(shè)計人員來說是采取模板定制方案,將設(shè)計好的Web頁面與CSS樣式遵循Joomla!模板定制機(jī)制,將已經(jīng)設(shè)計好的模板嵌入到Joomla!框架中,依據(jù)客戶的不同需求進(jìn)行個性化Web系統(tǒng)外觀的設(shè)計;對于Web系統(tǒng)編程人員來說,Joomla!框架已經(jīng)為Web系統(tǒng)中最常用的功能進(jìn)行了實(shí)現(xiàn) ,如果Web系統(tǒng)開發(fā)有另外的功能需求,可以使用Joomla!框架進(jìn)行Web系統(tǒng)的擴(kuò)展開發(fā),即遵循Joomla!框架擴(kuò)展開發(fā)的規(guī)范與機(jī)制編寫組件、模塊、插件來滿足Web系統(tǒng)開發(fā)的功能需求。
二 Joomla!框架應(yīng)用于Web系統(tǒng)的組件擴(kuò)展機(jī)制
對于Web系統(tǒng)編程人員來說,應(yīng)用Joomla!框架進(jìn)行Web系統(tǒng)擴(kuò)展開發(fā)需要遵循Joomla!框架擴(kuò)展開發(fā)的規(guī)范與機(jī)制開發(fā)組件、模塊、插件來滿足Web系統(tǒng)的功能需求。Joomla!框架最重要的擴(kuò)展機(jī)制當(dāng)屬組件擴(kuò)展機(jī)制,圖3所示為Joomla!框架的組件擴(kuò)展機(jī)制MVC模式圖。
Joomla!框架中JModelJController JView三個類分別對應(yīng)于圖3中的ModelController View部分,其中JController類是JModel類和JView類數(shù)據(jù)交換的紐帶,這三個類與Joomla!框架中的JDispatcher類, JRoute類等互相配合,進(jìn)行Web組件擴(kuò)展開發(fā)。
JModel類是Joomla!框架組件擴(kuò)展機(jī)制的事務(wù)邏輯處理模塊,其是最終負(fù)責(zé)處理客戶請求的模塊。它能夠處理用戶的大多數(shù)需求,快速的從數(shù)據(jù)庫中獲取請求數(shù)據(jù),協(xié)調(diào)事務(wù),保證應(yīng)用程序各部分間的事務(wù)組合;JController類是Joomla!框架組件擴(kuò)展機(jī)制的控制模塊。此模塊首先接收客戶端發(fā)送的與網(wǎng)絡(luò)協(xié)議相關(guān)的請求,然后解析請求并轉(zhuǎn)換為事物邏輯模塊(JModel)的輸入?yún)?shù), 調(diào)用相應(yīng)的事務(wù)邏輯模塊進(jìn)行處理,最后根據(jù)事物邏輯模塊的處理結(jié)果調(diào)用相應(yīng)的用戶視圖模塊(JView)生成結(jié)果頁面,返回至瀏覽器;JView是Joomla!框架組件擴(kuò)展機(jī)制的用戶視圖模塊。此模塊的主要功能是根據(jù)事務(wù)邏輯模塊(JModel)處理結(jié)果生成返回至客戶端的頁面。
開發(fā)者應(yīng)用Joomla!框架進(jìn)行組件擴(kuò)展開發(fā),都需要繼承JModel類、JView類、JController類,形成如圖4所示的Joomla!框架組件擴(kuò)展開發(fā)機(jī)制圖,開發(fā)者借助于圖4的流程,運(yùn)用PHP編程語言對上述三個類分別進(jìn)行繼承,完成Web系統(tǒng)擴(kuò)展組件的開發(fā)。開發(fā)者依據(jù)此模式進(jìn)行Web系統(tǒng)開發(fā),提高了代碼的可復(fù)用程度,節(jié)省了開發(fā)的時間,提高了開發(fā)效率;Joomla!框架通過提供擴(kuò)展組件的方式來滿足Web系統(tǒng)的功能擴(kuò)展,提高了系統(tǒng)各個部分之間的獨(dú)立性,降低了Web系統(tǒng)模塊間的耦合度。
三 組件擴(kuò)展案例――高等英語教學(xué)網(wǎng)專家答疑組件
本文以某外語教育出版社高等英語教學(xué)網(wǎng)專家答疑組件的擴(kuò)展開發(fā)為案例,具體闡述Joomla!框架組件擴(kuò)展機(jī)制在Web系統(tǒng)組件擴(kuò)展開發(fā)中的應(yīng)用流程和實(shí)現(xiàn)方法。
1 專家答疑組件的擴(kuò)展開發(fā)需求
為教師的教學(xué), 和學(xué)生的學(xué)習(xí)提供異步專家指導(dǎo);專家也可以發(fā)表指導(dǎo)英語教學(xué)和學(xué)習(xí)的文章;對于教師和學(xué)生的問題應(yīng)分開顯示;對于教師和學(xué)生的提問應(yīng)有歸類和按類別顯示功能;支持關(guān)鍵字搜索;頁面支持圖片與附件功能;教師與學(xué)生提問審核功能;教師與學(xué)生的提問具有優(yōu)先功能;具有創(chuàng)建管理問題種類功能。
2 專家答疑組件的組成
Joomla!框架的擴(kuò)展組件由后臺管理與前臺顯示兩大部分構(gòu)成。專家答疑組件的后臺管理具有對問題的管理分類審核 優(yōu)先 與上傳附件功能;專家答疑組件的前臺顯示專家的指導(dǎo)和教師與學(xué)生的提問,并顯示問題的搜索和分類界面。
3 專家答疑組件的數(shù)據(jù)庫設(shè)計
Joomla!框架的組件擴(kuò)展開發(fā)使用MySQL數(shù)據(jù)庫,在已存在的數(shù)據(jù)庫中新建組件開發(fā)所需要的表。專家答疑組件,在已存在的數(shù)據(jù)庫中新建專家答疑數(shù)據(jù)表,它包含主鍵標(biāo)識符、問題標(biāo)題、問題答案、問題分類、疑問主體、關(guān)鍵詞、創(chuàng)建時間這些字段。通過繼承Joomla!框架中的JTable類,將得到一個專家答疑表類文件存放在Tables文件夾中,它將在組件擴(kuò)展的Model部分存儲數(shù)據(jù)方法中得到調(diào)用。
4 專家答疑組件的后臺管理開發(fā)
遵循Joomla!框架的組件擴(kuò)展開發(fā)機(jī)制和流程,應(yīng)該包括三個部分:Model、Controller和View,進(jìn)行組件開發(fā)的時候,通常創(chuàng)建Models文件夾存放 組建開發(fā)中的Model文件;Controllers文件夾存放 組件開發(fā)中的Controller文件;Views文件夾存放 組件開發(fā)中的View文件。下面將以專家答疑組件為例具體闡述Model、Controller、View這三個部分的開發(fā)。
專家答疑組件的Models文件夾中包含有QuestionanswersModel和QuestionanswerModel文件,它們都繼承自Joomla!框架中的Jmodel類,負(fù)責(zé)對問題管理列表和單個問題進(jìn)行數(shù)據(jù)邏輯處理。這兩個類除了擁有共同的Jmodel的父類方法,還共同擁有數(shù)據(jù)保存方法、數(shù)據(jù)刪除方法,代碼的可復(fù)用程度得到很大提高。對于 處理多個問題列表的QuestionanswersModel類還具有分頁方法,方便用戶進(jìn)行瀏覽。在數(shù)據(jù)保存方法中通過對專家答疑表類的調(diào)用,將信息綁定到相應(yīng)的數(shù)據(jù)庫的表中,簡化了開發(fā)者對于 數(shù)據(jù)保存的處理,提高了開發(fā)者的效率。
專家答疑組件的Controllers文件夾中包含QuestionanswerController文件,這個文件包含一個QuestionanswerController類,它繼承自Joomla!框架中的Jcontroller類。除了文件夾之外,還有一個默認(rèn)的QuestionansersController類,Joomla!組件擴(kuò)展開發(fā),通常把這個默認(rèn)的類放在Controllers文件夾外,它的作用是默認(rèn)情況下,調(diào)用組件Views文件夾下問題管理列表這個頁面。而QuestionanswerController類是通過一系列方法與專家答疑組件中的Model類進(jìn)行聯(lián)系,從而調(diào)用專家答疑組件中的對應(yīng)的單個問題頁面將結(jié)果返回給瀏覽器。這個類除了擁有父類Jcontroller的方法外,還具有對于 問題進(jìn)行編輯的方法、對于 問題進(jìn)行保存的方法、對于 問題進(jìn)行刪除的方法 、取消操作的方法。對于 問題的添加和編輯方法,通過設(shè)置調(diào)用專家答疑組件中的相關(guān)View文件夾下的類,直接將頁面返回給瀏覽器;對于 問題進(jìn)行保存、刪除的方法是通過調(diào)用專家答疑組件中的QuestionanswerModel中的數(shù)據(jù)保存和刪除方法來完成;對于 取消操作的方法是通過進(jìn)行 地址的重新定位來實(shí)現(xiàn)。在Joomla!組件開發(fā)中,Controllers文件夾下的各個控制類文件都擁有上述的共同方法,在開發(fā)的時候,除了調(diào)用不同的Model和View外,其他的代碼都大致相同,代碼在很大程度上可以進(jìn)行復(fù)用。
專家答疑組件中的Views文件夾下有兩個子文件夾,它們分別是專家答疑的問題管理顯示頁面和單個問題顯示頁面。兩個子文件夾下都包含一個模板文件夾和對應(yīng)的View類,模板文件夾可以存放若干個模板文件,以供View類進(jìn)行選擇調(diào)用,將所獲得的數(shù)據(jù)填入到模板文件中形成顯示頁面。它使數(shù)據(jù)處理與功能代碼與界面表示層代碼得以分離,避免了代碼的雜糅,提高了各部分間的獨(dú)立性。專家答疑組件擁有QuestionanswersView類和QuestionanswerView類,它們都繼承自Joomla!框架中的Jview類。它們通常運(yùn)用一個顯示方法將數(shù)據(jù)填入到指定的模板文件中,由于專家答疑組件的顯示頁面都具有單一的模板文件,所以沒有涉及到模板的選擇調(diào)用。
5 專家答疑組件的前臺開發(fā)
由于專家答疑組件的前臺開發(fā)和上述的后臺管理開發(fā)方法完全一樣,所以限于篇幅不再重復(fù)敘述。但是需要指出的是前臺開發(fā)除了多個問題顯示和單一具體顯示功能外,還具有問題搜索和問題分類顯示功 。開發(fā)者僅僅需要在其Models文件夾、Controllers文件夾和Views文件夾增加相應(yīng)的類文件即可,不會影響到其他部分的功能代碼,很方便為組件增加 額外的功能,提高了組件各個部分之間的獨(dú)立性,降低了系統(tǒng)之間的耦合度。
6 專家答疑組件的安裝
經(jīng)過上述五個步驟,就完成了專家答疑組件的開發(fā),開發(fā)者最后還需要建立一個XML文件,將專家答疑組件所擁有的文件按照層次順序添加到XML中,完成安裝的XML文件后, 進(jìn)行壓縮成ZIP格式的文件進(jìn)行安裝使用,專家答疑組件的后臺問題管理頁面效果圖如下所示。
四 結(jié)束語
本文以某外語教育出版社高等英語教學(xué)網(wǎng)的專家答疑組件開發(fā)為案例詳細(xì)闡述了應(yīng)用Joomla!框架進(jìn)行Web系統(tǒng)組件擴(kuò)展開發(fā)的機(jī)制和流程,限于篇幅,對于Joomla!框架的Module和Plugin開發(fā)沒有涉及。通過遵循Joomla!框架的MVC組件擴(kuò)展機(jī)制,我們在開發(fā)過程中提高了系統(tǒng)各個部分的獨(dú)立性與代碼的可復(fù)用程度,降低了系統(tǒng)各部分之間的耦合度。
參考文獻(xiàn)
[1] MVC模式研究的綜述.任中芳,張華,閆明松等 [J].計算機(jī)應(yīng)用研究,2004,10:1-2.
[2] MVC模型在Web程序中的應(yīng)用及java實(shí)現(xiàn).張瑩,許俊華,張毅, 等[J].計算機(jī)工程與應(yīng)用,2001,17:160-161.
[3] 基于的MVC設(shè)計模式的研究.林慶,朱翠苗, 等[J].計算機(jī)工程與設(shè)計,2008,1:167-168.
[4]Dan Rahmel.Professional Joomla![M].US: Wiley Publishing Inc,2007.
[5]Dan Rahmel.Beginning Joomla! [M].US: press Publishing, 2007.
[6]James Kennard. Mastering Joomla!! 1.5 Extension and Framework Development [M].Birmingham: Packt publishing, 2007.
[7]Joseph LeBlanc. Learning Joomla!!1.5 Extension Development [M].Birmingham: Packt publishing, 2007.
[8] [EB/OL].
[9] [EB/OL].
[10] [EB/OL].
[11] [EB/OL].
A Study on the Application of MVC-Based Joomla! Framework in Extension and Exploration of Web Components
HU Qian-jinCAI Yong-zhou WU Min
(University of Science and Technology of China, Center of Modern Educational Technology, Hefei Hubei, 230026)