摘要:通過對比WEB應(yīng)用開發(fā)中的傳統(tǒng)開發(fā)模式Model1與Model2(MVC)模式的優(yōu)缺點(diǎn),結(jié)合一個(gè)具體的開發(fā)實(shí)例,提出在STRUTS框架下開發(fā)MVC模式的WEB應(yīng)用的解決方案。
關(guān)鍵詞:Struts;MVC模式;WEB應(yīng)用
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9599 (2012) 22-0000-02
1 引言
當(dāng)前,SUN公司提出的J2EE(Java 2 Enterprise Edition)已經(jīng)逐漸成為企業(yè)Web應(yīng)用開發(fā)的標(biāo)準(zhǔn),這當(dāng)中Servlet/JSP技術(shù)也在眾多網(wǎng)站中得到了廣泛的應(yīng)用,然而,遵循Model1設(shè)計(jì)模式,在僅使用JSP技術(shù)開發(fā)的Web應(yīng)用中,在頁面顯示的代碼中混合了太多HTML和Java代碼,使得閱讀、調(diào)試和維護(hù)等等都非常困難,而且業(yè)務(wù)邏輯不明確,沒有分層和模塊化,不易于開發(fā)人員的分工協(xié)作。
使用Apache Jakarta提供的Struts應(yīng)用框架可以解決以上問題,Struts框架采用的是Model2(MVC)的設(shè)計(jì)思想,它既能很好地分離業(yè)務(wù)邏輯和用戶界面,又提供了大量的自定義標(biāo)記庫,通過在JSP頁面中分離動(dòng)態(tài)顯示邏輯和靜態(tài)的HTML,使得頁面代碼更清晰,同時(shí)也大大提高了代碼的可讀性。大型企業(yè)利用它可以開發(fā)出可重用的代碼,而且對于開發(fā)的Web的維護(hù)也變得非常簡單,減少了企業(yè)開發(fā)Web應(yīng)用的難度和縮短開發(fā)的時(shí)間。
2 傳統(tǒng)開發(fā)模式Model1與Model2(MVC)模式的對比
2.1 Model1 模式
在使用Java技術(shù)建立Web應(yīng)用的實(shí)例中,基于JSP技術(shù)的發(fā)展,很快就形成了一種可快速開發(fā)Web應(yīng)用的模式Model1,即在JSP頁面結(jié)合業(yè)務(wù)邏輯(jsp:useBean)、服務(wù)端處理過程和HTML(),在JSP頁面中同時(shí)實(shí)現(xiàn)顯示、業(yè)務(wù)邏輯和流程控制,從而快速地完成應(yīng)用開發(fā)。
這種開發(fā)模式在進(jìn)行快速和小規(guī)模的應(yīng)用開發(fā)時(shí),是有非常大的優(yōu)勢,但是從工程化的角度考慮,它也有一些不足之處:(1)HTML和Java強(qiáng)耦合在一起。JSP頁面中HTML與大量的Java代碼交織在一起,給頁面設(shè)計(jì)帶來極大的困難的同時(shí),也給閱讀代碼理解程序帶來干擾。(2)極難維護(hù)與擴(kuò)展。在JSP頁面中直接嵌入訪問數(shù)據(jù)的代碼及SQL語句,會(huì)使得數(shù)據(jù)庫的任何改動(dòng),都必須打開所有的JSP頁面進(jìn)行維修,非常不利于應(yīng)用系統(tǒng)業(yè)務(wù)的重用和改動(dòng)。(3)不方便調(diào)試。業(yè)務(wù)邏輯與HTML代碼,甚至JavaScript代碼強(qiáng)耦合在一起,極難定位錯(cuò)誤。(4)業(yè)務(wù)流程對用戶不清晰。要理解應(yīng)用程序的整個(gè)流程,你必須瀏覽所有網(wǎng)頁。
2.2 Model2(MVC)模式介紹
Model2模式表示的是基于MVC模式的框架。MVC是Model-View-Controller的簡寫,即把WEB應(yīng)用項(xiàng)目分為三層,包括模型層、視圖層、控制層。這樣的思想,不僅提高的代碼的重用率、項(xiàng)目的擴(kuò)展性,而且大大降低了項(xiàng)目的維護(hù)成本。此外,model2設(shè)計(jì)模式的這種思想,在邏輯上相當(dāng)?shù)那逦妆蝗藗兘邮?,而且便于開發(fā)人員的分工合作,因此,大大提升了開發(fā)效率。
通過這種設(shè)計(jì)模型把業(yè)務(wù)邏輯、顯示邏輯和處理過程分成不同的層來實(shí)現(xiàn)。層之間可以進(jìn)行交互和重用,從而彌補(bǔ)了Model1的不足,但是,開發(fā)MVC系統(tǒng)比開發(fā)簡單的JSP復(fù)雜多了,原來我們通過建立一個(gè)簡單的JSP頁面就能實(shí)現(xiàn)的應(yīng)用現(xiàn)在要變成多個(gè)步驟的設(shè)計(jì)和實(shí)現(xiàn),也就是說要把一個(gè)JSP頁面分別轉(zhuǎn)化成基于Model-View-Controller三個(gè)步驟來實(shí)現(xiàn)。但是,從大型的Web開發(fā)和企業(yè)的角度出發(fā),Model2比Model1好得多了,而且現(xiàn)在已經(jīng)有了很多可供使用的MVC框架,直接利用它們,在它們的基礎(chǔ)上開發(fā),我們可以取得事半功倍的效果。而Struts就是一個(gè)最好的選擇。
3 Struts與MVC模式的對應(yīng)
3.1 Struts的體系結(jié)構(gòu)
Struts框架是一組相互協(xié)作的類、servlet和JSP標(biāo)記組成的一個(gè)可復(fù)用的MVC 2設(shè)計(jì)。這個(gè)定義表示Struts是一個(gè)框架,而不是一個(gè)庫,但Struts也包含了豐富的標(biāo)記庫和獨(dú)立于該框架工作的實(shí)用程序類。Struts采用的主要技術(shù)是Servlet,JSP和custom tag library。其主要組件件和功能如下表所示:
3.2 Struts與MVC(model-view-controller)模式的對應(yīng)
(1)模型層。Model是業(yè)務(wù)邏輯處理模塊,是對企業(yè)業(yè)務(wù)流程中的對象進(jìn)行抽象,封裝了對象的屬性和對對象操作的業(yè)務(wù)邏輯。Struts為Model部分提供了Action類和ActionForm對象。在Action類中,封裝了業(yè)務(wù)處理邏輯,調(diào)用業(yè)務(wù)邏輯模塊,并且把響應(yīng)提交到合適的View組件以產(chǎn)生響應(yīng),一個(gè)Action類的角色,就是將請求與業(yè)務(wù)邏輯分開。ActionForm對象,可以保存描述客戶端表單的數(shù)據(jù),通過ActionForm對象實(shí)現(xiàn)了對View和Model之間交互的支持。在Struts框架中,模型分為兩個(gè)部分:一是系統(tǒng)的內(nèi)部狀態(tài),是通過一些Bean來表示的,根據(jù)設(shè)計(jì)或應(yīng)用程序復(fù)雜度的不同,這些Bean可以是持久的,與數(shù)據(jù)庫中的數(shù)據(jù)對應(yīng)的,也可以是暫時(shí)的,和View對應(yīng)的。二是可以改變狀態(tài)的操作,即業(yè)務(wù)邏輯?;贛VC模式開發(fā)WEB應(yīng)用,應(yīng)該把應(yīng)用程序中的業(yè)務(wù)邏輯功能封裝成對為此目的設(shè)計(jì)的JavaBean的方法調(diào)用。這些方法可以是用于系統(tǒng)狀態(tài)Bean的相同的類的一部分,或者可以是在專門執(zhí)行業(yè)務(wù)邏輯的獨(dú)立的類中。STRUTS建議將商業(yè)邏輯(“做什么”)和Action類(“決定做什么”)分離開,這樣可以實(shí)現(xiàn)業(yè)務(wù)邏輯的重用。(2)視圖層。View是視圖提供的模型的一種表示,它是應(yīng)用程序的外觀。視圖可以訪問模型的讀方法,但不能訪問寫方法。此外,它對控制器一無所知。當(dāng)更改模型時(shí),視圖應(yīng)得到通知。Struts應(yīng)用中的View部分是通過JSP技術(shù)實(shí)現(xiàn)的。但Struts還提供了自定義的標(biāo)記庫供使用,通過這些自定義標(biāo)記可以非常好地和系統(tǒng)的Model部分交互,通過使用這些自定義標(biāo)記創(chuàng)建的JSP表單,可以實(shí)現(xiàn)和Model部分中的ActionForm的映射,完成對用戶數(shù)據(jù)的封裝,同時(shí)這些自定義標(biāo)記還提供了像模板定制等多種顯示功能。(3)控制層。Controller是流程控制模塊,管理著用戶與View的交互,能從View中取得數(shù)據(jù)并傳給Model去執(zhí)行業(yè)務(wù)邏輯,然后它根據(jù)Model的執(zhí)行結(jié)果,選擇一個(gè)合適的View把結(jié)果展現(xiàn)給用戶。在Struts中Controller功能由ActionServlet和ActionMapping對象構(gòu)成:核心是一個(gè)Servlet類型的對象ActionServlet。這個(gè)ActionServlet通過定義一組映射(ActionMapping)來配置。每個(gè)Mapping定義一個(gè)與所請求的URI相匹配的路徑和一個(gè)Action類,這個(gè)類負(fù)責(zé)執(zhí)行預(yù)期的業(yè)務(wù)邏輯,然后將控制分派給適當(dāng)?shù)腣iew組件來創(chuàng)建響應(yīng)。Controller功能的實(shí)現(xiàn)由Struts提供核心控制部分。我們要做的就是配置ActionMapping對象。Struts對這部分的實(shí)現(xiàn),大大減少了開發(fā)MVC模式的Web開發(fā)所需要做的前提工作。
3.3 Struts的流程處理過程
Struts基于MVC模式的處理過程:首先是控制器(ActionServlet)進(jìn)行初始化工作,先讀取配置文件,根據(jù)配置文件為不同的Struts模塊初始化相應(yīng)的ModuleConfig對象,比如配置文件中的Action映射定義都保存在ActionConfig集合中,相應(yīng)地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等;接著,控制器接收HTTP請求,并從ActionConfig中找出對應(yīng)于該請求的Action子類,如果沒有對應(yīng)的Action類,控制器直接將請求轉(zhuǎn)發(fā)給JSP或者靜態(tài)頁面,否則控制器將請求分發(fā)至具體Action類進(jìn)行處理,然后,請求ActionForm對象利用HTTP請求中的參數(shù)來填充自己;最后,調(diào)用Action類,它一般只包含一個(gè)execute方法,如果需要,它也進(jìn)行相應(yīng)的數(shù)據(jù)檢查。執(zhí)行完成之后,返回一個(gè)ActionForward對象,控制器通過該ActionForward對象來進(jìn)行轉(zhuǎn)發(fā)工作。
4 基于Struts開發(fā)MVC模式的Web應(yīng)用的步驟
下面以某信息系統(tǒng)中用戶注冊登陸模塊為例,談?wù)勅绾位赟truts框架開發(fā)MVC模式的Web應(yīng)用的步驟:(1)定義并生成所有代表應(yīng)用程序的用戶接口的Views,即編寫JSP頁面。用戶注冊登陸實(shí)例的Views部分包含兩個(gè)jsp頁面:一個(gè)是登錄頁面logon.jsp,另一個(gè)是用戶登錄成功后的用戶功能頁main.jsp。(2)生成這些Views所用到的所有ActionForm,并將它們添加到struts-config.xml文件中,然后編寫ActionForm。(3)在ApplicationResource.properties文件中添加必要的MessageResources項(xiàng)目,凡是在上面的JSP頁面中涉及的,都需要在ApplicationResource.properties中定義。(4)生成應(yīng)用程序的控制器,編寫Action類。(5)在struts-config.xml文件中定義Views與 Controller的關(guān)系,填寫Mapping。(6)生成應(yīng)用程序所需要的model組件,即完成應(yīng)用程序業(yè)務(wù)邏輯。(7)編譯、運(yùn)行你的應(yīng)用程序。
上面的文件的存放位置是固定的,先把.java文件編譯成.class文件,啟動(dòng)Tomcat,在IE瀏覽器中輸入http://localhost:8080/logon.jsp,則出現(xiàn)一個(gè)登陸框:
如果,不輸入任何內(nèi)容直接點(diǎn)擊Submit按鈕,就會(huì)返回到logon.jsp并顯示missing username和missing password錯(cuò)誤信息;如果輸入其他內(nèi)容,則會(huì)返回no matched user的錯(cuò)誤;如果輸入的用戶名是struts且口令是struts則會(huì)顯示表示登錄成功的歡迎頁面。
5 結(jié)束語
基于STRUTS框架開發(fā)MVC模式的WEB應(yīng)用經(jīng)過開發(fā)人員多年來的實(shí)踐表明,這是一種比較優(yōu)秀的面向交互式系統(tǒng)開發(fā)的解決方案。MVC模式能很好地分離業(yè)務(wù)邏輯和用戶界面,通過把業(yè)務(wù)邏輯、顯示邏輯和處理過程分成模型層、視圖層和控制層,不僅提高的代碼的重用率、項(xiàng)目的擴(kuò)展性,而且大大降低了項(xiàng)目的維護(hù)成本。此外,這種思想,在邏輯上相當(dāng)?shù)那逦?,易被人們接受,而且便于開發(fā)人員的分工合作,因此,大大提升了開發(fā)效率,具有非常好的應(yīng)用前景。
參考文獻(xiàn):
[1]張婭,杜友福,張南平.用struts建立MVC模式的WEB應(yīng)用[J].微機(jī)發(fā)展 2003(12):105-107.
[2]張南華,陳閎中,衛(wèi)志華.基于STRUTS框架構(gòu)建網(wǎng)上辦公系統(tǒng)[J].微型電腦應(yīng)用,2003(9):27-29.
[3]陳東明.架構(gòu)技術(shù)在WEB開發(fā)中的應(yīng)用[J].中國石油大學(xué)勝利學(xué)院學(xué)報(bào),2003(4):46-48.
[4]Jakarta Team.譯者:李錕.(dlee)Struts用戶指南.http://jakarta.apache.org/.
[5]吳建設(shè).MVC設(shè)計(jì)模式在WEB應(yīng)用程序中的研究與實(shí)現(xiàn)[J].福建電腦,2006(2):66.
*支持項(xiàng)目名稱:數(shù)字化校園環(huán)境下的高職協(xié)同教育模式的研究與實(shí)踐,項(xiàng)目編號(hào):2010TJK311。
[作者簡介]
張宗福(1981-),男,廣東省南雄人,碩士學(xué)位,講師職稱,就職于廣東江門職業(yè)技術(shù)學(xué)院,研究方向:軟件工程。