前言:一篇好文章的誕生,需要你不斷地搜集資料、整理思路,本站小編為你收集了豐富的mvc框架主題范文,僅供參考,歡迎閱讀并收藏。
關(guān)鍵詞:JavaScript mvc框架;DOM;Backbone.js
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)10-2242-04
Abstract: The basic structure and design pattern of JavaScript MVC framework are introduced and analyzed to achieve the client code readability, testability, maintainability and scalability in Web development. Taking the Backbone.js framework as examples, the codes of JavaScript MVC framework in Web Development are demonstrated and other precautions are elaborated in practical application.
Key words: JavaScript MVC Framework; DOM; Backbone.js
1 問(wèn)題的提出
在傳統(tǒng)的B/S軟件開發(fā)中,服務(wù)器端進(jìn)行業(yè)務(wù)邏輯和數(shù)據(jù)處理,客戶端進(jìn)行HTML頁(yè)面顯示,其中客戶端JavaScript主要用于改善用戶體驗(yàn)。而隨著Ajax、JQuery及相關(guān)插件的推廣,部分業(yè)務(wù)邏輯就無(wú)可避免地會(huì)在客戶端實(shí)現(xiàn)??蛻舳说腏avaScript文件很容易從幾句變成幾千行代碼,開發(fā)人員也會(huì)陷入一系列的DOM操作和嵌套的JQuery回調(diào)函數(shù)中。開發(fā)的復(fù)雜性也日益明顯,常常會(huì)出現(xiàn)一個(gè)人無(wú)法看懂另外一人開發(fā)的JavaScript代碼的情況,很難做到客戶端代碼的可讀性、易測(cè)試、可維護(hù)性和可擴(kuò)展性。
2 MVC框架
MVC是模型(model)-視圖(view)-控制器(controller)的縮寫,是傳統(tǒng)Web應(yīng)用開發(fā)中服務(wù)器端廣泛使用的軟件開發(fā)模式,它用一種業(yè)務(wù)邏輯和數(shù)據(jù)顯示分離的方法來(lái)組織代碼,具有耦合性低、重用性高、可維護(hù)性高、有利于軟件工程化管理的特點(diǎn)。最典型的MVC是JSP + servlet + javabean的模式。
1)模型(model)主要包括業(yè)務(wù)邏輯模塊(web項(xiàng)目中的Action,dao類)和數(shù)據(jù)模塊(pojo類)。模型與數(shù)據(jù)格式無(wú)關(guān),這樣一個(gè)模型能為多個(gè)視圖提供數(shù)據(jù)。
2)視圖(view)是用戶與之交互的界面,在web中視圖一般由jsp,html組成。
3)控制器(controller)接收來(lái)自界面的請(qǐng)求并交給模型進(jìn)行處理。
典型的HTTP請(qǐng)求/響應(yīng)過(guò)程MVC流程如下:
3 JavaScript MVC框架
當(dāng)前Web應(yīng)用程序在客戶端有越來(lái)越多的邏輯判斷和數(shù)據(jù)處理,尤其是客戶端包括地理信息、本地化存儲(chǔ)、websocket等功能時(shí),客戶端代碼極難維護(hù)。為了解決這一問(wèn)題,現(xiàn)在已有多個(gè)JavaScript MVC框架(Backbone.js、 Ember.js、 AngularJS、Knockout等)將傳統(tǒng)的MVC框架引入到前端開發(fā)中。
JavaScript MVC框架中M代表數(shù)據(jù),V代表DOM,C協(xié)調(diào)輸入輸出并操作數(shù)據(jù),MVC框架就是將數(shù)據(jù)與DOM進(jìn)行分離,它并不僅僅只是一種,還有多種擴(kuò)展模式,表示為MV*(星號(hào)代表有不同選擇),例如:MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)。
JavaScript MVC與傳統(tǒng)的服務(wù)器端MVC有所不同,它主要是將數(shù)據(jù)和界面顯示分開,即將模型和視圖進(jìn)行分離。事實(shí)上,不同的JavaScript MVC框架在控制器(controller)方面,其實(shí)現(xiàn)方式也各不相同。有些框架(例如Backbone.js)控制器與視圖的界限比較模糊,原本部分應(yīng)該在控制器中進(jìn)行的操作直接就在視圖中實(shí)現(xiàn)了,有些框架(例如Ember.js和ExtJS)則將控制器作為調(diào)度中心,用來(lái)啟動(dòng)應(yīng)用程序、初始化數(shù)據(jù)模型、監(jiān)測(cè)數(shù)據(jù)變化、調(diào)用相應(yīng)操作等。
從設(shè)計(jì)模式來(lái)說(shuō),JavaScript MVC框架主要采用觀察者模式、策略模式和組合模式,根據(jù)不同框架的實(shí)現(xiàn)方式,也可能會(huì)用到工廠模式和模板方法模式。JavaScript MVC框架采用觀察者模式實(shí)現(xiàn)內(nèi)部核心通信(當(dāng)數(shù)據(jù)變化時(shí)通知觀察者),通過(guò)這種方式實(shí)現(xiàn)多個(gè)視圖綁定到一個(gè)模型并進(jìn)行同步。
4 Backbone.js在Web開發(fā)中的應(yīng)用
Backbone.js 是一個(gè)重量級(jí)javascript MVC框架,主要組件是模型、視圖、集合和路由器。在 Backbone.js中,模型存儲(chǔ)通過(guò) RESTful JSON 接口從服務(wù)器檢索到的數(shù)據(jù),模型與視圖密切關(guān)聯(lián),負(fù)責(zé)為特定 UI 組件渲染 HTML 并處理元素上觸發(fā)的事件,路由器處理URL并在客戶端進(jìn)行邏輯處理。Backbone.js具有以下特點(diǎn):
u強(qiáng)制依賴于 Underscore.js。
u非強(qiáng)制依賴于 jQuery/Zepto。
0 引言
隨著互聯(lián)網(wǎng)迅猛發(fā)展,使得動(dòng)態(tài)網(wǎng)站建設(shè)要求更高,在網(wǎng)站開發(fā)方式上傳統(tǒng)的模式已經(jīng)無(wú)法滿足人們的需要,MVC模式對(duì)這個(gè)問(wèn)題進(jìn)行來(lái)了很好的解決[1]。MVC作為一種開發(fā)模式在解決大型Web項(xiàng)目問(wèn)題上發(fā)揮了重要作用。PHP是一種專業(yè)的網(wǎng)站的開發(fā)語(yǔ)言,然而現(xiàn)有的PHP開發(fā)模式尚未有成熟、統(tǒng)一的規(guī)范,系統(tǒng)水平的高低取決于開發(fā)人員的專業(yè)素質(zhì)及經(jīng)驗(yàn)等,已經(jīng)無(wú)法滿足人們?cè)陂_發(fā)效率、可擴(kuò)展性、可靠性及可維護(hù)性等方面快速房展的需求[2]。因而把框架機(jī)制引入PHP的開發(fā)成為人們關(guān)注的重點(diǎn)。
1 MVC設(shè)計(jì)模式
1.1 MVC設(shè)計(jì)模式在Web中的應(yīng)用
MVC(Model-View-Controller)把數(shù)據(jù)處理、數(shù)據(jù)表示及程序輸入輸出控制進(jìn)行分離,對(duì)不同部分對(duì)象間的通信方式進(jìn)行了描述,使其不受其它數(shù)據(jù)模型及其方法的影響,從而讓程序結(jié)構(gòu)更加清晰并具有靈活性[3]。MVC把應(yīng)用程序的輸入、輸出、處理強(qiáng)行分離,MVC的應(yīng)用程序分為模型、控制器及視圖三個(gè)部件[4]。MVC組件的功能及關(guān)系如圖1所示。
Web應(yīng)用程序從傳統(tǒng)意義上來(lái)說(shuō)一般都是由ASP/PHP進(jìn)行創(chuàng)建的。它們把數(shù)據(jù)層代碼、HTML表示層代碼混合,即便開發(fā)者經(jīng)驗(yàn)豐富、水平較高,從表示層把數(shù)據(jù)分離也具有一定的困難[5]。MVC把它們從根本上進(jìn)行了強(qiáng)制分離,雖然MVC的構(gòu)造工作量變大,但仍就有諸多優(yōu)點(diǎn)。其一,具有低耦合性。視圖層、業(yè)務(wù)層分離,視圖層代碼更改不需要對(duì)模型、控制器代碼進(jìn)行修改。同樣,改變業(yè)務(wù)流程或者規(guī)則只要對(duì)MVC的模型改動(dòng)就可以,不需要更改視圖層代碼。模型和控制器、視圖是分離的,因而應(yīng)用程序的數(shù)據(jù)層及業(yè)務(wù)規(guī)則改變十分容易。其二,具有高重用性、可適用性??茖W(xué)技術(shù)水平不斷提高,訪問(wèn)應(yīng)用程序的方式變得多種多樣。同樣一個(gè)服務(wù)器端的代碼MVC模式可以讓多種視圖進(jìn)行訪問(wèn)如Web瀏覽器等。模式只能夠?qū)?shù)據(jù)未格式化的部分進(jìn)行返回,因而為不同界面的使用提供了便利。其三,具有快速開發(fā)的能力,MVC模式可以讓界面設(shè)計(jì)人員對(duì)表現(xiàn)形式更加關(guān)注,程序員對(duì)開發(fā)業(yè)務(wù)邏輯更加重視,使系統(tǒng)的前端、后端同時(shí)開發(fā),使系統(tǒng)開發(fā)時(shí)間大為縮短。其四,具有可維護(hù)性。視圖層、業(yè)務(wù)邏輯層進(jìn)行分離,使得它們之間聯(lián)系只能通過(guò)接口,任何部分內(nèi)部都不會(huì)對(duì)其他部分產(chǎn)生影響,從而使Web應(yīng)用具有可維護(hù)性。其五,為軟件工程化管理提供了便利。不同層可各司其職,一個(gè)層面的應(yīng)用不同但也有某些相同特征,為軟件工程化管理提供了便利。
1.2 MVC設(shè)計(jì)模式的PHP實(shí)現(xiàn)
PHP對(duì)象在服務(wù)器端不能跨頁(yè)面存在,所有PHP實(shí)際上是沒(méi)有辦法實(shí)現(xiàn)傳統(tǒng)的MVC架構(gòu)的,其問(wèn)題主要在模型上得到體現(xiàn),如在Java中,數(shù)據(jù)模型是獨(dú)立的,不同于業(yè)務(wù)邏輯、表現(xiàn)邏輯等,它可以在服務(wù)器端跨頁(yè)面存在,JavaBean 就是在這個(gè)方面發(fā)揮作用[6]。PHP進(jìn)程在內(nèi)存中不能長(zhǎng)期存在,只能在PHP頁(yè)面剛剛執(zhí)行時(shí)創(chuàng)建,頁(yè)面執(zhí)行結(jié)束,則該進(jìn)程已經(jīng)結(jié)束,基于這種情況,模型不能進(jìn)行直接實(shí)現(xiàn)。
因PHP語(yǔ)言跨頁(yè)面無(wú)法存在,PHP開發(fā)框架中使用被動(dòng)MVC更為適合。在被動(dòng)MVC模式上,模型身處MVC結(jié)構(gòu)下卻不知。也就是說(shuō)模型是一個(gè)普通的ο螅和MVC中的其他部分是沒(méi)有關(guān)聯(lián)的。這樣的話,模型就不用再跨頁(yè)面存在,改變了使用MVC導(dǎo)致的效率低下現(xiàn)象。
被動(dòng)MVC模式和傳統(tǒng)意義上的主動(dòng)MVC模式不同,模型是一個(gè)簡(jiǎn)單的獨(dú)立的對(duì)象,因而自身的改變不能傳達(dá)給視圖;視圖也無(wú)法對(duì)模型的更新作出訂閱及監(jiān)視等。視圖只能夠?qū)刂破鱾魉偷臄?shù)據(jù)進(jìn)行使用或者在得到控制器通知之后再去模型進(jìn)行最新數(shù)據(jù)的提取。所以被動(dòng)MVC模式下,控制器還要把模型更新之后的數(shù)據(jù)傳送給視圖,因而在設(shè)計(jì)上相較于主動(dòng)MVC更加困難。
2 基于MVC設(shè)計(jì)模式的開發(fā)框架建設(shè)與改進(jìn)
2.1 框架入口設(shè)計(jì)
傳統(tǒng)的Web應(yīng)用程序中,一般是以頁(yè)面或者文件為基礎(chǔ)的,接入模式一般采取多點(diǎn)接入。這種接入模式可以讓用戶對(duì)系統(tǒng)的文件進(jìn)行直接訪問(wèn),并且這些文件可以對(duì)用戶的請(qǐng)求進(jìn)行處理并把這些處理的結(jié)果反應(yīng)給用戶[7]。一個(gè)系統(tǒng)請(qǐng)求入口就有很多。這種接入方式給用戶顯示的接口非常多,容易帶來(lái)安全隱患,對(duì)全局的處理、優(yōu)化等起了不利影響。
在MVC設(shè)計(jì)模式上實(shí)現(xiàn)的THINKPHP框架,可以實(shí)現(xiàn)傳統(tǒng)的多點(diǎn)接入模式,同樣也可以進(jìn)行配置,設(shè)置成為單點(diǎn)接入模式。
單點(diǎn)接入模式把Web應(yīng)用應(yīng)用程序的全部請(qǐng)求都集中到一個(gè)腳本文件即所有的HTTP請(qǐng)求都由入口文件統(tǒng)一進(jìn)行接受。用戶和系統(tǒng)進(jìn)行交互的入口只有這一個(gè)。這種接入模式具有許多優(yōu)點(diǎn),其一,方便全局處理,如對(duì)數(shù)據(jù)進(jìn)行安全監(jiān)測(cè)等。其二,可以使程序結(jié)構(gòu)更加清晰,方便進(jìn)行管理。入口進(jìn)行集中控制,程序人員只需要負(fù)責(zé)開發(fā)自己的模塊就可以,們不需要對(duì)程序運(yùn)行進(jìn)行協(xié)調(diào)。其三,保證安全,采用單點(diǎn)入口模式,只開放需要開放的模塊,模塊的訪問(wèn)地址都是同一個(gè)php文件,用戶難以辨別,可以保證系統(tǒng)的安全性。另外,單點(diǎn)接入也使系統(tǒng)的一些耦合缺陷不對(duì)用戶進(jìn)行開放。相對(duì)于多點(diǎn)接入模式來(lái)講,多點(diǎn)模式采用不同的php文件訪問(wèn)web,URL相對(duì)簡(jiǎn)單整潔,但是不方便同一控制,即便可以使用公用配置文件,倘若項(xiàng)目太大,公用配置也不是好的解決方案。
2.2 控制器設(shè)計(jì)
在MVC設(shè)計(jì)模式中,控制器主要作用是負(fù)責(zé)接受用戶輸入的數(shù)據(jù)并調(diào)用模型和視圖功能去完成用戶提出的需求。當(dāng)用戶通過(guò)web頁(yè)面中的超鏈接和發(fā)送HTML表單時(shí),控制器本身不做任何處理,也不會(huì)輸出任何東西。它只接受請(qǐng)求并決定調(diào)用哪個(gè)模型構(gòu)件去處理請(qǐng)求,然后決定用哪個(gè)視圖來(lái)顯示模型處理返回的結(jié)果[8]。
THINKPHP的控制器層由核心控制器和業(yè)務(wù)控制器組成,核心控制器由系統(tǒng)內(nèi)部的App類完成,負(fù)責(zé)應(yīng)用(包括模塊和操作)的調(diào)度控制,包括HTTP請(qǐng)求攔截和轉(zhuǎn)發(fā)、加載配置等;業(yè)務(wù)控制器則由用戶定義的Action類或者其他控制器類完成。關(guān)鍵代碼如下:
…
if(defined('GROUP_NAME')){
if(is_file(CONF_PATH.GROUP_NAME.'/config.php'))
C(include CONF_PATH.GROUP_NAME.'/config.php');// 加載分組配置文件
if(is_file(COMMON_PATH.GROUP_NAME.'/function.php'))
include COMMON_PATH.GROUP_NAME.'/function.php';// 加載分組函數(shù)文件
}
…
業(yè)務(wù)控制器把客戶請(qǐng)求和業(yè)務(wù)邏輯分開,業(yè)務(wù)控制器是由用戶自定義的Action.php文件來(lái)實(shí)現(xiàn)的,業(yè)務(wù)控制器全部由Action類派生而來(lái),繼承了所有Action類的方法,把數(shù)據(jù)傳送給視圖的抽象方法是$this->display。關(guān)鍵代碼如下:
…
class Abstract extends Action {
public function index(){
$this->display();
}
}
…
2.3 數(shù)據(jù)操作
PHP支持的數(shù)據(jù)庫(kù)眾多,典型的數(shù)據(jù)庫(kù)就是 MySql,對(duì)于接口支持不具有統(tǒng)一性[9]。
THINKPHP框架對(duì)數(shù)據(jù)庫(kù)增刪改操作進(jìn)行了封裝,簡(jiǎn)化了數(shù)據(jù)庫(kù)操作,使得開發(fā)人員不需要學(xué)習(xí)SQL語(yǔ)句的相關(guān)語(yǔ)法,只需使用GetLastSql()指令將需要操作的SQL語(yǔ)句輸出到瀏覽器調(diào)整即可。開發(fā)人員可以有更多的精力用在系統(tǒng)業(yè)務(wù)邏輯上,不再考慮SQL的語(yǔ)法。進(jìn)行簡(jiǎn)單封裝還降低的程序的書寫錯(cuò)誤,降低了調(diào)試出錯(cuò)概率。
2.4 視圖技術(shù)
在THINKPHP中,利用視圖模板技術(shù)把數(shù)據(jù)層、HTML表示層代碼進(jìn)行分離。Web服務(wù)器接收URL請(qǐng)求之后,首先需要確認(rèn)的是不是第一次對(duì)URL進(jìn)行請(qǐng)求,第一次請(qǐng)求的URL,首先對(duì)模板進(jìn)行調(diào)用,判斷模版主題,然后再由控制器代碼等進(jìn)行編譯,最后用戶視圖生成數(shù)據(jù)并輸出;不是第一次則在已具有的用戶視圖上進(jìn)行直接定位,也要判斷模版主題,這種請(qǐng)求節(jié)省解析以及讀取的時(shí)間??蚣軙?huì)使系統(tǒng)偽靜態(tài)化,考慮使用rewrite篩選器完成。加快了程序的運(yùn)行速度,提高了效率。關(guān)鍵代碼如下:
function isMobile() {
// 如果有HTTP_X_WAP_PROFILE則一定是移動(dòng)設(shè)備
if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])){
return true;
}
return false;
}
$info=isMobile();
if($info){ $theme = 'phone'; //手C模板
}else{$theme = 'default'; //默認(rèn)模板
}
3 結(jié)語(yǔ)
關(guān)鍵詞:Spring MVC框架;Web登錄系統(tǒng);B/S架構(gòu);session對(duì)象
1 概述
隨著世界經(jīng)濟(jì)的繁榮和科技的迅猛發(fā)展,信息化的程度越來(lái)越高,各種軟件相繼出現(xiàn)。大批量種類繁多的軟件雖然提高了信息處理的效率,但是安全方面的隱患也日益突出。用戶想要進(jìn)入到不同的應(yīng)用軟件和服務(wù)系統(tǒng)時(shí)都必須進(jìn)行登錄認(rèn)證,隨之而來(lái)的遺忘密碼、黑客攻擊、密碼泄露等問(wèn)題,都將嚴(yán)重干擾到業(yè)務(wù)運(yùn)作。在這種情況下,一種安全可靠的用戶登錄模塊就顯得必不可少。
基于這種情況,該文研究了如何利用Spring MVC框架開發(fā)一款安全、靈活的Web登錄模塊。系統(tǒng)的任何用戶操作界面都可以提供登錄入口,提示用戶進(jìn)行登錄,通過(guò)認(rèn)證后,合法用戶就可以使用他相應(yīng)的權(quán)限功能。
2 Spring MVC框架概述
Spring是分層的Java SE/EE應(yīng)用一站式的輕量級(jí)開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的。Spring框架提供了構(gòu)建Web應(yīng)用程序的全功能 MVC 模塊。在Spring的MVC中,支持各種視圖技術(shù),例如JSP、Velocity、Tiles等。Spring MVC分離了控制器、模型對(duì)象、分派器以及處理程序?qū)ο蟮慕巧?,這種分離讓它們更容易進(jìn)行定制。
Spring MVC的角色劃分非常清晰,各組件的功能單一,很好地達(dá)到了高內(nèi)聚低耦合的效果。Spring MVC相當(dāng)靈活,且可以擴(kuò)展,其MVC框架是圍繞 DispatcherServlet這個(gè)核心展開的。核心控制器的作用就是截獲請(qǐng)求,并將其分發(fā)到相應(yīng)的業(yè)務(wù)控制器中,由業(yè)務(wù)控制器調(diào)用業(yè)務(wù)處理方法處理業(yè)務(wù)邏輯,返回一個(gè)模型和視圖對(duì)象,核心控制器再根據(jù)此對(duì)象找到視圖顯示出處理結(jié)果。
3 登錄模塊的設(shè)計(jì)與實(shí)現(xiàn)
本登錄模塊采用B/S的三層結(jié)構(gòu)模式,分為服務(wù)器、用戶和數(shù)據(jù)庫(kù)三個(gè)部分??蛻舳伺c服務(wù)器之間采用HTTP協(xié)議進(jìn)行通信,Web服務(wù)器采用Tomcat6.0,數(shù)據(jù)庫(kù)服務(wù)器采用Oracle10.0.2。在用戶登錄模塊的開發(fā)過(guò)程中,提供對(duì)身份認(rèn)證、權(quán)限分配等有效的安全策略,來(lái)實(shí)現(xiàn)用戶的驗(yàn)證與登錄,在沒(méi)有得到系統(tǒng)授權(quán)的前提下是無(wú)權(quán)對(duì)文檔進(jìn)行瀏覽和管理的。
3.1 總體設(shè)計(jì)
用戶登錄模塊按照不同的人員職責(zé),提供不同的登錄界面,具體包括系統(tǒng)管理員、管理員、游客等登錄界面。有游客,管理員,身份證,電話號(hào)碼+密碼等多種登錄方式。
登錄模塊采用基于角色的身份認(rèn)證技術(shù),根據(jù)不同的用戶角色,提供不同的登錄選項(xiàng),分配不同的使用權(quán)限。根據(jù)實(shí)際情況定義了三種角色:超級(jí)管理員、管理員、注冊(cè)用戶,通過(guò)登錄界面確認(rèn)用戶的身份,再根據(jù)不同的用戶類型確定其相應(yīng)的操作權(quán)限。
其中,超級(jí)管理員具有對(duì)角色、權(quán)限、菜單等進(jìn)行增刪改查操作以及角色的賦權(quán)。管理員具有對(duì)用戶賬號(hào)管理,信息的修改、統(tǒng)計(jì)等處理權(quán)限。注冊(cè)用戶具有修改個(gè)人資料,信息瀏覽等權(quán)限。
3.2 數(shù)據(jù)庫(kù)配置
public UserInfo getUserByUserName(String userName){
UserInfo userInfo=null;
try{
userInfo=(UserInfo)
getSqlMapClientTemplate().queryForObject("USERINFO.getUserByUserName", userName);
}catch(Exception e){
logger.error(e);}
return userInfo;}
3.3登錄模塊的實(shí)現(xiàn)
本模塊登錄時(shí)沒(méi)有區(qū)分用戶角色,當(dāng)進(jìn)入系統(tǒng)后根據(jù)角色權(quán)限加載菜單項(xiàng)。用戶通過(guò)輸入用戶名和密碼,然后單擊登陸按鈕實(shí)現(xiàn)以上信息的提交并驗(yàn)證,若正確無(wú)誤進(jìn)入系統(tǒng)。
3.3.1錯(cuò)誤鎖定
登陸模塊根據(jù)用戶身份進(jìn)入系統(tǒng),顯示擁有權(quán)限的操作菜單。如果用戶不存在,則找不到數(shù)據(jù);如果用戶存在,密碼錯(cuò)誤,同樣找不到數(shù)據(jù),均提示用戶名密碼錯(cuò)誤;如果用戶名和密碼同時(shí)存在,則獲取用戶信息,并進(jìn)入相應(yīng)的界面。為系統(tǒng)安全考慮,若用戶連續(xù)而且超過(guò)三次輸入密碼錯(cuò)誤,則需要輸入驗(yàn)證碼。errorTime為輸入錯(cuò)誤次數(shù),當(dāng)驗(yàn)證碼輸入為空,或輸入錯(cuò)誤,就返回-1,此時(shí)對(duì)該賬號(hào)鎖定, 登錄失敗,必須經(jīng)過(guò)超級(jí)管理員解鎖才能重新使用。部分代碼分析如下:
if(errorTime>=3){
if(entryVlidateCode==null||(!entryVlidateCode.equals(realValidateCode))){
map.put("errorMsg","驗(yàn)證碼錯(cuò)誤");
map.put("userInfo",null);
map.put("errorCode",-1);
return map;
}}
3.3.2在線提示
用戶在登錄時(shí),會(huì)創(chuàng)建一個(gè)session,用于保存用戶信息。如果在線用戶列表中查找到該用戶已經(jīng)在線,同時(shí)又在其他機(jī)器登錄,那么首先提示用戶已經(jīng)在線,然后給出選擇擠下或者取消登錄。如果擠下,那么被擠機(jī)器就無(wú)法繼續(xù)前后臺(tái)的數(shù)據(jù)交互,自動(dòng)退出,登錄失敗。也就是限制用戶重復(fù)登錄,每個(gè)時(shí)刻只允許在一臺(tái)機(jī)器上登錄。
先從ServletContext中取出存放用戶登錄的session相關(guān)信息,檢查這個(gè)列表,若已經(jīng)存在相同的登錄信息,則說(shuō)明用戶之前已經(jīng)登錄過(guò),移除前面一條記錄。再把此次登錄的信息加入到ServletContext中。監(jiān)聽實(shí)現(xiàn)SessionListener類,當(dāng)session失效的時(shí)候,從ServletContext中移除相應(yīng)記錄。過(guò)濾所有頁(yè)面,sesison失效后轉(zhuǎn)向登錄頁(yè)面。但是要實(shí)現(xiàn)用戶二次登錄后強(qiáng)制先前的登錄失效,需要在這里控制。登錄時(shí)存入的是session值和session ID,用戶二次登錄時(shí)移除了前次記錄,存入的session值是相同的,但是ID卻不同。 當(dāng)?shù)谝淮蔚卿涰?yè)面請(qǐng)求的時(shí)候,在這里檢查ServletContext中是否存在當(dāng)前的session值與ID,如果沒(méi)有就銷毀這個(gè)session。
3.3.3非法退出
對(duì)于WEB系統(tǒng)來(lái)說(shuō),均遵循HTTP協(xié)議的請(qǐng)求/應(yīng)答模型。所以網(wǎng)站本身是不能保存數(shù)據(jù)的,用戶正確登錄后,系統(tǒng)更改當(dāng)前用戶的狀態(tài)為在線。如果用戶在使用系統(tǒng)時(shí),不通過(guò)退出按鈕來(lái)執(zhí)行退出操作,而是非法退出,包括網(wǎng)絡(luò)斷線、系統(tǒng)癱瘓、突然斷電等情況。這些都使系統(tǒng)沒(méi)有給用戶記錄一個(gè)退出系統(tǒng)的操作機(jī)會(huì),這種情況下用戶的在線狀態(tài)會(huì)一直保留,從而影響下次登錄。因此,系統(tǒng)應(yīng)該設(shè)置一個(gè)定時(shí)器,定時(shí)清理并且還原用戶的初始狀態(tài)。
當(dāng)用戶以登陸身份請(qǐng)求服務(wù)器資源時(shí),記錄用戶的最后活躍時(shí)間。接著擬定一個(gè)失效時(shí)間,假設(shè)某個(gè)用戶的最后活躍時(shí)間和當(dāng)前時(shí)間的差值大于這個(gè)失效時(shí)間,也就是說(shuō)該用戶這一段時(shí)間都沒(méi)有和服務(wù)器交互了,那么就認(rèn)為該用戶已下線,否則認(rèn)為他是在線的。
3.3.4超時(shí)管理
Session對(duì)象是由服務(wù)器自動(dòng)創(chuàng)建的與用戶請(qǐng)求相關(guān)的對(duì)象。服務(wù)器為每個(gè)用戶都生成一個(gè)session對(duì)象,用于保存該用戶的信息,跟蹤用戶的操作狀態(tài)。應(yīng)用session對(duì)象時(shí)要注意它的生命周期,當(dāng)用戶首次訪問(wèn)時(shí)將產(chǎn)生一個(gè)新的會(huì)話,從用戶打開網(wǎng)站生成,關(guān)閉瀏覽器刪除,以后服務(wù)器就會(huì)記住這個(gè)會(huì)話狀態(tài),在這一段時(shí)間內(nèi),用戶都可以訪問(wèn)到會(huì)話對(duì)象中保存的信息。當(dāng)會(huì)話生命周期超時(shí),或者服務(wù)器端強(qiáng)制使會(huì)話失效時(shí),這個(gè)session就不能使用了,需要用戶重新登錄。
通過(guò)setMaxInactiveInterval()方法可以設(shè)置Session的生命周期,通過(guò)getMaxInactiveInterval()方法可獲得Session的生命周期,如果超過(guò)這個(gè)時(shí)間則失效。
4 結(jié)束語(yǔ)
信息的規(guī)范化、高效化管理在很大程度上體現(xiàn)了一個(gè)組織的工作效率,而登陸功能在其中起到了關(guān)鍵性作用,同時(shí)也為系統(tǒng)提供了安全性保障。該文對(duì)Web登錄模塊進(jìn)行了分析,使用Spring MVC框架進(jìn)行設(shè)計(jì),提出了解決方案,實(shí)現(xiàn)了系統(tǒng)用戶的登錄、出錯(cuò)處理、超時(shí)檢查等功能,使系統(tǒng)的重用性和擴(kuò)展性更好,用戶界面簡(jiǎn)潔統(tǒng)一,功能靈活,提高了系統(tǒng)的易用性、安全性及穩(wěn)定性。
參考文獻(xiàn) :
[1] 劉震宇,肖武魁.基于J2EE框架與ExtJS的Web系統(tǒng)登錄設(shè)計(jì)[J].中南林業(yè)科技大學(xué)學(xué)報(bào),2010(8).
[2] 張瑞青,李鐵柱.基于SpringMVC的用戶登錄系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].科技信息,2012(10).
關(guān)鍵詞:評(píng)教系統(tǒng);LINQ;UML;MVC
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1007-9599 (2011) 12-0000-01
Online Teaching Evaluation System Design and Implementation 3.5 MVC Framework
Chen Liang
(Changsha Normal College,Changsha410100,China)
Abstract:In this paper,**College for example,in-depth analysis of the school's teaching evaluation system status and system requirements,the use of software systems development ideas and methods for the evaluation of teaching overall system analysis and detailed design.Platform using Visual Studio 2008 features,take B/S architecture,the C# language development,database selection Sql Server 2008.Framework for MVC framework support,let us see more of the highlights,so we use the MVC framework to design the web front system,let the workload in many ways to save,MVC's relatively independent,so that the program the operating mechanism is more clear,structured,low coupling,but also increase the program's scalability.
Keywords:Teaching evaluation system;LINQ;UML;MVC
信息是人們對(duì)世界的客觀的描述,是人們進(jìn)行聯(lián)系與交流的重要途徑。伴隨著社會(huì)信息技術(shù)的提高,計(jì)算機(jī)已被廣泛運(yùn)用到許多的領(lǐng)域,成為推動(dòng)社會(huì)發(fā)展的動(dòng)力,而在軟件技術(shù)的應(yīng)用中,軟件的開發(fā)技術(shù),尤其是應(yīng)用型軟件的開發(fā)已經(jīng)成為重中之重。
一、關(guān)于評(píng)教系統(tǒng)的概述
對(duì)績(jī)效考評(píng),管理學(xué)界沒(méi)有一個(gè)統(tǒng)一的定義,但管理學(xué)者們從不同的角度,不同的側(cè)重點(diǎn)對(duì)這一概念作了不同的描述。評(píng)教系統(tǒng)就是學(xué)生對(duì)教師的能力、工作狀況和適應(yīng)性,對(duì)職工的個(gè)性、資質(zhì)、習(xí)慣和態(tài)度,以及對(duì)組織的相對(duì)價(jià)值進(jìn)行有組織的、實(shí)事求是的評(píng)價(jià),包括評(píng)價(jià)的程序、規(guī)范、方法的總和。
二、系統(tǒng)的總體設(shè)計(jì)
(一)系統(tǒng)的功能。評(píng)教系統(tǒng)主要實(shí)現(xiàn)的功能有:教研室管理、教師管理、評(píng)分角色管理、學(xué)年學(xué)期管理、考核管理、考核角色管理、指標(biāo)管理、教員被評(píng)角色、教員評(píng)分角色、考核評(píng)分、一級(jí)指標(biāo)得分瀏覽、二級(jí)指標(biāo)得分瀏覽、三級(jí)指標(biāo)得分瀏覽功能。
(二)系統(tǒng)的架構(gòu)。主要采用三層架構(gòu)來(lái)設(shè)計(jì),三層架構(gòu)的結(jié)構(gòu)如下圖:
1.表示層。表示層提供給用戶一個(gè)視覺(jué)上的界面,通過(guò)界面層,用戶輸入數(shù)據(jù)、獲取數(shù)據(jù)。2.邏輯層。是表示層和數(shù)據(jù)層的橋梁,它響應(yīng)界面層的用戶請(qǐng)求,執(zhí)行任務(wù)并從數(shù)據(jù)層抓取數(shù)據(jù),并將必要的數(shù)據(jù)傳送給界面層。3.數(shù)據(jù)層。數(shù)據(jù)層定義、維護(hù)數(shù)據(jù)的完整性、安全性,它響應(yīng)邏輯層的請(qǐng)求,訪問(wèn)數(shù)據(jù)。這一層通常由大型的數(shù)據(jù)庫(kù)服務(wù)器實(shí)現(xiàn),如Oracle、Sybase、MS SQl Server等。
(三)教評(píng)系統(tǒng)功能模塊的實(shí)現(xiàn)。由于整個(gè)系統(tǒng)的系統(tǒng)功能十分相近,我們不一一展開敘述,此處我們以評(píng)分角色管理模塊為例來(lái)研究具體是如何實(shí)現(xiàn)的,其他模塊實(shí)現(xiàn)方法類似。
1.方法的定義。在評(píng)分角色管理模塊中有個(gè)頁(yè)面用來(lái)實(shí)現(xiàn)顯示評(píng)分體系內(nèi)所有的指標(biāo)的功能。這里在后臺(tái)實(shí)際上是調(diào)用了一個(gè)Get More Topic List(recount,gid)方法,該方法將返回值一個(gè)List的鏈接表類。按照系統(tǒng)的業(yè)務(wù)設(shè)計(jì)邏輯,本系統(tǒng)中,方法的調(diào)用要經(jīng)過(guò)三層間的逐層調(diào)用。最開始是在數(shù)據(jù)存儲(chǔ)層定義方法體,在事物層中定義方法接口,最后在表現(xiàn)層中調(diào)用。然而,表現(xiàn)層的每個(gè)方法調(diào)用,調(diào)用后再發(fā)送請(qǐng)求到事務(wù)接口層。事務(wù)接口層對(duì)該方法定義了接口,具體如下:
public ListGet More Topic List(int number,int gid)
{return dal.Get More Topic List(number,gid);}
此處return dal.Get More Topic List(number,gid)調(diào)用則是去實(shí)現(xiàn)接口的方法,完整的方法體則是數(shù)據(jù)層來(lái)實(shí)現(xiàn)的。數(shù)據(jù)層內(nèi)對(duì)相關(guān)的SQL語(yǔ)句進(jìn)行了表達(dá),并返回對(duì)應(yīng)的數(shù)據(jù),逐條轉(zhuǎn)換為之前定義的Group Topic Info類,然后形成鏈表,最后將鏈表返回。這一連串的跳轉(zhuǎn),充分展示了方法在這個(gè)層次框架中的運(yùn)行調(diào)用機(jī)制。
2.頁(yè)面構(gòu)造。后臺(tái)信息發(fā)送到前臺(tái)后,必須充分的展現(xiàn)出來(lái)。這里運(yùn)用到NVelocity模板語(yǔ)言。該語(yǔ)言是嵌入在HTML中的,能直接將后臺(tái)的變量賦值給前臺(tái),使前臺(tái)可以實(shí)現(xiàn)許多復(fù)雜的操作。我們以考評(píng)系統(tǒng)內(nèi)的評(píng)分角色管理的頁(yè)面為例,后臺(tái)得到了一個(gè)Group Topic Info的鏈表,Group Topic Info類型雖然在后臺(tái)定義過(guò),然而前臺(tái)還是無(wú)法識(shí)別,所以需要在后臺(tái)將Group Topic Info鏈表轉(zhuǎn)化為一個(gè)前臺(tái)能夠進(jìn)行展現(xiàn)的HTML的應(yīng)用的類別,必須兼容html語(yǔ)言。然后通過(guò)context.Put("infolist",infolist)將鏈表賦值給前臺(tái)的NVelocity中的鏈表。前臺(tái)接受到數(shù)據(jù)后,通過(guò)一個(gè)#foreach($infoin$infolist)循環(huán),將鏈表的值逐一賦值給展示系統(tǒng)的變量,通過(guò)泛型變量依依顯示出來(lái)。
四、結(jié)語(yǔ)
教評(píng)系統(tǒng)在教學(xué)管理中的重要地位日益突顯。當(dāng)然,一個(gè)科學(xué)合理的評(píng)教系統(tǒng)體系的設(shè)計(jì)還包括選用科學(xué)的設(shè)計(jì)方法,對(duì)指標(biāo)體系的更新完善等等多個(gè)方面,是一個(gè)系統(tǒng)的工程。但基于自身知識(shí)所限無(wú)法一一具體加以說(shuō)明,以上論述,是個(gè)人在學(xué)習(xí)實(shí)踐工作中的真實(shí)體驗(yàn),請(qǐng)各位讀者斧正。
參考文獻(xiàn):
[1]王嫻,謝弛,榮雪,范雯.SNS走向何方――SNS網(wǎng)站運(yùn)營(yíng)的現(xiàn)狀和未來(lái)趨勢(shì)研究[J].2008
[2]張祖曦.基于SNS社區(qū)的人際搜索設(shè)計(jì)與實(shí)現(xiàn)[J].2009
[3]Framework3.5開發(fā)技術(shù)詳解[M].人民郵電出版社,2009
[4]梁冰.JavaScript開發(fā)技術(shù)大全[M].北京:人民郵電出版社,2008
關(guān)鍵詞:PureMVC框架 角色 訪問(wèn)控制
中圖分類號(hào):TP393.09 文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1007-3973 (2010) 07-042-02
1引言
訪問(wèn)控制是指通過(guò)某種途徑,允許或限制訪問(wèn)能力及其范圍的一種方式。近年來(lái),一種新的基于角色的訪問(wèn)控制技術(shù)(role-based access control,RBAC)正逐漸成為信息安全領(lǐng)域內(nèi)的研究熱點(diǎn)。目前已提出并得到較廣泛認(rèn)可的模型是美國(guó)Sandhu 教授等人的RBAC96 模型。
RBAC 的基本思想是將角色作為用戶與權(quán)限聯(lián)系的中間橋梁,用戶通過(guò)被授予一定的角色而獲得相應(yīng)權(quán)限,從而大大簡(jiǎn)化權(quán)限管理。
本文針對(duì)一個(gè)合作共建系統(tǒng)的權(quán)限管理,基于PureMVC框架進(jìn)行了設(shè)計(jì)和實(shí)現(xiàn)。
2PureMVC框架
PureMVC是在基于模型、視圖和控制器MVC模式建立的一個(gè)輕量級(jí)的應(yīng)用框架,這種開源框架是免費(fèi)的,是一個(gè)定位于設(shè)計(jì)高性能RIA客戶端的基于模式的框架。
PureMVC是一個(gè)定位于高性能RIA客戶端的機(jī)遇模式的框架,PureMVC框架的核心是廣播式的通信機(jī)制,接收者只要注冊(cè)標(biāo)識(shí)與廣播消息的標(biāo)識(shí)一致,就會(huì)接收消息,由于這種通信機(jī)制比較通用,現(xiàn)在已經(jīng)被移植到大多數(shù)流行的開發(fā)平臺(tái),包括Flash/Flex、PHP、Java、C#等。
2.1PureMVC框架
PureMVC模式通常被分成經(jīng)典的低耦合三層:Model、View、Controller,這三部分由3個(gè)單例模式來(lái)管理,三者合稱為核心層或核心角色。
(1)整體結(jié)構(gòu)中Facade負(fù)責(zé)管理整個(gè)應(yīng)用,注冊(cè)Command并建立Notification映射。Facade是一個(gè)單例類,是MVC框架中最核心的功能類,Facade單例負(fù)責(zé)對(duì)3個(gè)核心層的初始化,并且能訪問(wèn)各層類的公共方法。其中Mediator、Controller和Proxy均可以發(fā)送通知,但Proxy不接受通知,不和Mediator進(jìn)行直接的交互。
(2)數(shù)據(jù)層Model指向Proxy的引用。Proxy代碼負(fù)責(zé)操作數(shù)據(jù)模型,與遠(yuǎn)程服務(wù)通信存取數(shù)據(jù),是真正處理數(shù)據(jù)的地方,視圖層展現(xiàn)或提交的數(shù)據(jù)都回到Proxy處理,處理后的結(jié)果通知視圖層的Mediator,然后Mediator決定是否更改用戶界面。
(3)視圖層View負(fù)責(zé)軟件展現(xiàn)給終端用戶的界面,視圖指向Mediator引用,由多個(gè)Mediator組成。Mediator通過(guò)Controller和Proxy進(jìn)行通訊,所有行為都是建立在Notification基礎(chǔ)上的,一個(gè)對(duì)象處理完自己的事務(wù)后,簡(jiǎn)單發(fā)送通知到外界就可以了,至于誰(shuí)去處理隨后的事情就交給注冊(cè)了這個(gè)通知的對(duì)象去處理。
Mediator管理視圖組件,負(fù)責(zé)和控制器的Command或者數(shù)據(jù)模型的Proxy交互,是操作顯示組件(View Components)的控制器,通過(guò)事件監(jiān)聽操作視圖組件,Mediator對(duì)于用戶在界面的操作,均發(fā)送事件通知其Mediator,由Mediator決定是否發(fā)送通知(Notification)給控制器去處理數(shù)據(jù)或者是獲得數(shù)據(jù)。而Mediator在接受了其他地方發(fā)來(lái)的通知后,也會(huì)管理界面是否做響應(yīng)的更新。
(4)控制層Controller包括命令類及其映射,負(fù)責(zé)處理業(yè)務(wù)邏輯、聯(lián)系數(shù)據(jù)層和視圖層,由多個(gè)Command組成。其中命令類是無(wú)狀態(tài)的,只有需要時(shí)才被創(chuàng)建。
2.2PureMVC框架特點(diǎn)
PureMVC的主要目標(biāo)是分離代碼為三個(gè)簡(jiǎn)單、實(shí)用、離散的層,即模型(Model)、視圖(View)和控制器(Controller),以減少由應(yīng)用層、類的作用等造成的程序混亂,平衡可維護(hù)性與可擴(kuò)展性之間的關(guān)系,對(duì)開發(fā)者隱藏復(fù)雜性,避免平臺(tái)依賴性。
使用PureMVC框架進(jìn)行開發(fā)具備下列好處:
(1)基于設(shè)計(jì)模式,支持已經(jīng)被時(shí)間所證明的設(shè)計(jì)模式,可以部署于任何具備支持面向?qū)ο蟮沫h(huán)境,模式簡(jiǎn)單易懂。
(2)框架是“即開即用”的,只需要很小的實(shí)現(xiàn)需求。
(3)松耦合架構(gòu),提供可復(fù)用的組件、模型數(shù)據(jù)對(duì)象和服務(wù),包含/訂閱風(fēng)格的通知,建立明確的分離客戶端三層編碼關(guān)系。
(4)面向接口的編程,框架支持子類或?qū)崿F(xiàn)接口的擴(kuò)展,對(duì)所有的框架類定義接口,所有的類基于可擴(kuò)展性思想,框架支持將來(lái)通過(guò)其他類庫(kù)以分組模式進(jìn)行擴(kuò)展,并且與核心包的模式互不依賴。
(5)完備的文檔。源代碼免費(fèi)開放,具有完備的源代碼文檔,概念和統(tǒng)一建模語(yǔ)言(UML)視圖。
2.3PureMVC框架的模式和結(jié)構(gòu)
2.3.1MVC模式
MVC模式實(shí)現(xiàn)了模型、視圖、控制的分離,其框架如圖1所示,這種模式使得代碼的管理更加有效,更加清晰,也會(huì)減少代碼的維護(hù)量。
圖1MVC模式框架圖
2.3.2PureMVC結(jié)構(gòu)
PureMVC是一個(gè)純粹的小巧的MVC框架,在PureMVC中,整個(gè)框架由3個(gè)單例模式來(lái)管理,除了3個(gè)核心層之外,另外還有一個(gè)單例模式類――Facade,它提供了與核心層通信的唯一接口,以簡(jiǎn)化開發(fā)的復(fù)雜度。圖2 所示為PureMVC的整體框架結(jié)構(gòu)。
圖2PureMVC 結(jié)構(gòu)圖
3角色訪問(wèn)控制的實(shí)現(xiàn)
本文是以多家合作開發(fā)的B/S模式的網(wǎng)站為例,采用Adobe公司的Flex開發(fā)環(huán)境實(shí)現(xiàn)了用戶角色訪問(wèn)控制功能,根據(jù)用戶的不同以及角色的差異進(jìn)行權(quán)限控制,主要包括以下幾部分:用戶管理,角色管理和權(quán)限管理。
(1)Facade類的創(chuàng)建。本例中實(shí)現(xiàn)了一個(gè)的單例模式類RoleFacade類,它繼承了Facade類應(yīng)用單例模式,負(fù)責(zé)初始化核心層(Model,View和Controller),注冊(cè)所有Model和View的Command類,并能訪問(wèn)其Public方法。
public class RoleFacade extends Facade
implements IFacade{
//獲取RoleFacade的實(shí)例
public static function getInstance():
RoleFacade;
//重載基類initializeController方法,初始化控件
override protected function initializeController( ) : void {
//調(diào)用子類構(gòu)造函數(shù)
super.initializeController();
//注冊(cè)控制器
registerCommand(AddRoleCmd);
……
}
}
(2)由于業(yè)務(wù)邏輯相對(duì)簡(jiǎn)單,本例中通過(guò)SimpleCommand實(shí)現(xiàn)了ICommand接口,通過(guò)execute方法接受一個(gè)Inotification實(shí)例作為參數(shù),在實(shí)際應(yīng)用中,重寫了Notification的引用。以刪除用戶為例:
DeleteUserCommand
extends SimpleCommand
implements ICommand {
override public function execute( notification:INotification ){
對(duì)Notification的引用
//刪除用戶、角色
userProxy.deleteItem( user );roleProxy.deleteItem( user );
//發(fā)送通知
sendNotification(RoleFacade.USER_DELETED );
}
}
(3)數(shù)據(jù)模型Proxy封裝了數(shù)據(jù)模型,管理對(duì)本地?cái)?shù)據(jù)的訪問(wèn),實(shí)現(xiàn)權(quán)限的管理。Proxy類暴露數(shù)據(jù)模型和實(shí)體類給應(yīng)用程序,通過(guò)sendNotification方法,使用一個(gè)IFacade接口的單例去廣播,使得程序可以被其它地方被復(fù)用或重構(gòu)。
Proxy類的protected屬性被初始化用于注冊(cè)IFacade實(shí)例,因此Mediator在主程序初始化Facade實(shí)例后被注冊(cè)。
本例中有兩個(gè)對(duì)應(yīng)的類,分別是用戶和角色。
public class RoleProxy extends Proxy implements IProxy
public class UserProxy extends Proxy implements IProxy
(4)視圖層Mediator保存了多個(gè)視圖組件的引用,通過(guò)其自身提供的API管理它們,因?yàn)榻?jīng)常和Proxy交互,所以在構(gòu)造方法中取得Proxy實(shí)例的引用并保存在Mediator的屬性中,這樣避免頻繁的獲取Proxy實(shí)例。
本例中存在兩個(gè)Mediator,分別是對(duì)應(yīng)角色的RolePanelMediator和對(duì)應(yīng)于用戶的UserFormMediator。
roleProxy = facade.retrieveProxy( RoleProxy.NAME ) as RoleProxy;
(5)主入口文件中構(gòu)建用戶界面結(jié)構(gòu),包括用戶列表,角色列表和權(quán)限列表,然后建一個(gè)UsedFacade類的對(duì)象實(shí)例進(jìn)行控制。
import lalo.ApplicationFacade;
private var facade:UsedFacade
= UsedFacade.getInstance();
4結(jié)語(yǔ)
框架給應(yīng)用帶來(lái)的好處是不言而喻的,PureMVC作為一個(gè)輕量級(jí)采用通知驅(qū)動(dòng)的框架,實(shí)現(xiàn)了松耦合結(jié)構(gòu)?;诮巧L問(wèn)控制原理,本文以一個(gè)合作B/S系統(tǒng)為例設(shè)計(jì)實(shí)現(xiàn)了對(duì)角色的訪問(wèn)控制,提高了系統(tǒng)安全性,實(shí)際應(yīng)用表明,該系統(tǒng)具有較好的可擴(kuò)展性和通用性。但是對(duì)于角色的控制還沒(méi)有與數(shù)據(jù)庫(kù)的訪問(wèn)控制相結(jié)合,下一步的工作將結(jié)合數(shù)據(jù)庫(kù)訪問(wèn)控制模型圍繞角色、權(quán)限、數(shù)據(jù)庫(kù)三級(jí)訪問(wèn)控制展開。
參考文獻(xiàn):
[1]RAVI S S, EDWARD J C, HAL L F. Role-based accesscontrol model[J]. IEEE Computer, 1996, 29(2): 38-47.
Java語(yǔ)言自從推出以來(lái)一直是最流行的編程語(yǔ)言,社會(huì)上越來(lái)越多的開發(fā)人員利用Java技術(shù)進(jìn)行軟件開發(fā),也出現(xiàn)了越來(lái)越多的Java框架,為了提高軟件開發(fā)的質(zhì)量和效率,降低軟件復(fù)雜度,需要選擇合理的框架搭建軟件架構(gòu),并且需要相應(yīng)的技術(shù)進(jìn)行項(xiàng)目的構(gòu)建和管理,本文研究適合中小企業(yè)軟件開發(fā)的輕量級(jí)的Java軟件架構(gòu),并采用流行的項(xiàng)目管理工具M(jìn)aven管理軟件開發(fā),以降低軟件開發(fā)的難度。
1 多種軟件架構(gòu)的比較
1)早期的Java企業(yè)級(jí)開發(fā)采用框架重量級(jí)EJB(Enterprise JavaBean)。EJB是定義了一個(gè)用于開發(fā)基于組件的企業(yè)多重應(yīng)用程序的Java EE標(biāo)準(zhǔn)。因?yàn)镋JB容器默認(rèn)為應(yīng)用提供了EJB規(guī)范中的所用功能,以它為架構(gòu)的應(yīng)用程序需要消耗大量資源,具有侵入性,所以是一種重量級(jí)框架。
比如,EJB啟動(dòng)的時(shí)候,需要消耗大量的資源,內(nèi)存,CPU等。其次還表現(xiàn)在EJB巨大而復(fù)雜的規(guī)格說(shuō)明以及代碼規(guī)范。現(xiàn)在的EJB3.0增加了許多新的規(guī)范,例如元數(shù)據(jù)支持,實(shí)體Bean模型訪問(wèn)Bean上下文的新方法和運(yùn)行時(shí)環(huán)境等,但是EJB仍然具有過(guò)于復(fù)雜的特性。
基于重量級(jí)框架EJB的軟件架構(gòu)沒(méi)有很好的靈活性來(lái)應(yīng)對(duì)需求的變化,缺乏實(shí)用性,所以隨著SOA和其它力量的興起,軟件開發(fā)也越來(lái)越多地選擇輕量級(jí)的部署平臺(tái)。
2)常見的輕量級(jí)組合框架采用Struts2、Spring和Hibernate設(shè)計(jì)。Struts2是一個(gè)主流的基于MVC模式的Web開發(fā)框架,該框架包括三部分:核心的控制器組件、業(yè)務(wù)控制器和用戶實(shí)現(xiàn)的業(yè)務(wù)邏輯組件。
其中,Struts2框架提供了核心控制器,用戶實(shí)現(xiàn)業(yè)務(wù)控制層和業(yè)務(wù)邏輯層,具體實(shí)現(xiàn)時(shí)業(yè)務(wù)邏輯層采用面向接口編程;Hibernate是一個(gè)基于Java的對(duì)象關(guān)系映射(ORM)開源框架,對(duì)底層的JDBC進(jìn)行了非常輕量級(jí)的封裝,開發(fā)人員通過(guò)它可以使用面向?qū)ο蟮木幊趟枷氩僮鲾?shù)據(jù)庫(kù)。
使用JDBC的應(yīng)用都可以用Hibernate替代,并且Hibernate可以取代重量級(jí)EJB在Java EE架構(gòu)中的應(yīng)用,完成數(shù)據(jù)持久化操作;Spring是為了降低企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的輕量級(jí)Java開源框架。
Spring框架的采用分層架構(gòu),分層架構(gòu)的優(yōu)點(diǎn)是使用者根據(jù)需求選擇使用其中的組件,并且可以提供集成的框架。Spring通過(guò)核心的控制反轉(zhuǎn)(IoC)和面向切面(AOP)功能,使用簡(jiǎn)單的JavaBean來(lái)完成以前由重量級(jí)EJB完成的應(yīng)用。
Spring的應(yīng)用不僅限于服務(wù)器端,任何的Java應(yīng)用都可以選擇需要的Spring功能模塊。所以,Spring是一個(gè)分層的一站式輕量級(jí)開源框架。
Struts2、Hibernate、Spring組合的輕量級(jí)架構(gòu)如圖1所示。
3)目前流行應(yīng)用Spring MVC完成Web開發(fā)。Spring的輕量級(jí)和低入侵性使得其應(yīng)用越來(lái)越多,由此發(fā)展了Web模塊,融合在Spring Web Flow里面,即Spring MVC。
Spring MVC是提供了構(gòu)建 Web 應(yīng)用程序的全功能MVC模塊。該功能和Spring其他功能一樣是一種可插入的MVC架構(gòu)[1]。Spring MVC輕量級(jí)框架側(cè)重于減小開發(fā)的復(fù)雜度,比較適用于開發(fā)中小型企業(yè)應(yīng)用。所以在使用Spring進(jìn)行Web開發(fā)時(shí),越來(lái)越多的使用SpringMVC框架取代集成其他MVC開發(fā)框架(如Struts2)。
2 輕量級(jí)軟件架構(gòu)的搭建
基于了Spring和Hibernate輕量級(jí)的特點(diǎn),采用Spring MVC和hibernate整合完成分層的輕量級(jí)軟件架構(gòu),應(yīng)用Hibernate的對(duì)象持久化功能進(jìn)行域模型層和DAO(Data Access Object)層的實(shí)現(xiàn),應(yīng)用Spring MVC定義控制層(Controller)和視圖層,應(yīng)用Spring的對(duì)象管理功能管理DAO層、服務(wù)層(Service)和控制層的對(duì)象,降低軟件組件間耦合性。
在進(jìn)行Spring、Spring MVC和Hibernate輕量級(jí)架構(gòu)搭建時(shí),為使應(yīng)用耦合度低不依賴其他容器,采用基于簡(jiǎn)單Java對(duì)象的方法,這可以提高軟件的開發(fā)調(diào)試效率。具體搭建該輕量級(jí)軟件架構(gòu)需要注意以下幾點(diǎn)。
1)導(dǎo)入Spring和Hibernate及其他功能(例如數(shù)據(jù)庫(kù)驅(qū)動(dòng))的支持Jar包。
2)Spring MVC的核心是DispatcherServlet,,這個(gè)Servlet充當(dāng)Spring MVC的前端控制器,必須在web.xml中進(jìn)行配置。
3)必須定義基于這個(gè)servlet名字的XML文件,DispatcherServlet在加載時(shí)會(huì)從該文件中加載Spring上下文。
4)定義相應(yīng)功能的處理類和返回視圖。
采用的輕量級(jí)框架Spring和Hibernate都是基于Java的開源框架,在開源社區(qū)中為這些框架提供了成熟的API和許多快速構(gòu)建工具以及可供參考的開源代碼,這更利于軟件的快速開發(fā)。
3 Maven的應(yīng)用
在進(jìn)行輕量級(jí)的軟件架構(gòu)開發(fā)項(xiàng)目的過(guò)程中,還必須有良好的項(xiàng)目管理工具。Maven是一款通過(guò)簡(jiǎn)短的描述信息來(lái)管理項(xiàng)目的構(gòu)建,報(bào)告和文檔的軟件項(xiàng)目管理工具,它的核心是基于項(xiàng)目對(duì)象模型(POM)。Maven包含了一個(gè)項(xiàng)目對(duì)象模型、一組標(biāo)準(zhǔn)集合、一個(gè)項(xiàng)目生命周期、一個(gè)依賴管理系統(tǒng)和用來(lái)運(yùn)行定義在生命周期階段中插件目標(biāo)的邏輯。
應(yīng)用Maven,可以用一個(gè)明確定義的項(xiàng)目對(duì)象模型來(lái)描述項(xiàng)目,然后Maven可以應(yīng)用橫切的邏輯,這些邏輯來(lái)自一組共享的(或者自定義的)插件。Maven可以讓開發(fā)人員快速地構(gòu)建一個(gè)項(xiàng)目,有效地解決包管理和項(xiàng)目問(wèn)題,并且可以與持續(xù)集成進(jìn)行無(wú)縫對(duì)接。對(duì)于大型的系統(tǒng),采用Maven 作為項(xiàng)目管理工具,可以有效地進(jìn)行分工協(xié)作[2]。
Maven的這種應(yīng)用無(wú)侵入性,本身就是輕量級(jí)軟件架構(gòu)的需要。
將Maven應(yīng)用于基于Spring MVC的輕量級(jí)軟件架構(gòu),可以有效的提高項(xiàng)目開發(fā)進(jìn)度,降低項(xiàng)目復(fù)雜度,主要方法為以下幾種。
1)為項(xiàng)目定義pom.xml文件,該文件中定義了項(xiàng)目對(duì)象模型,是Maven腳本的基礎(chǔ),這個(gè)模型定義了項(xiàng)目的各種屬性,腳本都是基于該模型工作;此外在對(duì)象模型中對(duì)所依賴的包有明確的定義,如定義使用哪個(gè)版本的包。
2)Maven是基于中央倉(cāng)庫(kù)的編譯,即把編譯所需要的資源放在一個(gè)中央倉(cāng)庫(kù)里,如jar,tld,pom,等。當(dāng)編譯的時(shí)候,Maven會(huì)自動(dòng)在倉(cāng)庫(kù)中找到相應(yīng)的包,如果本地倉(cāng)庫(kù)沒(méi)有,則從設(shè)定好的遠(yuǎn)程倉(cāng)庫(kù)中下載到本地。這一切都是自動(dòng)的,并且用maven編譯的項(xiàng)目在的時(shí)候只需要源碼,小得很,使得項(xiàng)目更加輕量級(jí)。
3)Maven還為項(xiàng)目提供了大量的附加腳本降低項(xiàng)目開發(fā)的復(fù)雜性,例如生成網(wǎng)站、生成文檔、源代碼參考手冊(cè)等,利用Maven只需運(yùn)行相應(yīng)腳本。
4 結(jié)論
良好的軟件架構(gòu)和項(xiàng)目管理工具是軟件開發(fā)成功的基礎(chǔ),不僅能夠降低開發(fā)難度,節(jié)約開發(fā)成本,還能夠極大的提高軟件的可擴(kuò)展性和可維護(hù)性?;赟pring、Spring MVC和Hibernate搭建的軟件架構(gòu)以控制器、模型和視圖(MVC)為基礎(chǔ),對(duì)底層JDBC進(jìn)行對(duì)象封裝,提供業(yè)務(wù)模型基礎(chǔ),并應(yīng)用分層和按需集成方式開發(fā)web應(yīng)用;Maven服務(wù)于基于Java平臺(tái)的項(xiàng)目構(gòu)建、依賴管理和項(xiàng)目信息管理,來(lái)降低系統(tǒng)各個(gè)模塊之間的耦合度,使得代碼的復(fù)用性大大提高,可以實(shí)現(xiàn)項(xiàng)目的并行開發(fā),進(jìn)一步提高系統(tǒng)開發(fā)的可擴(kuò)展性及穩(wěn)定性,降低軟件開發(fā)難度。
摘 要:本文介紹MVC與三層結(jié)構(gòu)技術(shù)的內(nèi)容和區(qū)別,包括MVC框架的結(jié)構(gòu)和三層結(jié)構(gòu)技術(shù)的內(nèi)容,并對(duì)兩者的主要應(yīng)用(包括B/S架構(gòu)下)進(jìn)行闡述;對(duì)兩者結(jié)合設(shè)計(jì)軟件的應(yīng)用和性能做了說(shuō)明和論述。因?yàn)镸VC與三層結(jié)構(gòu)技術(shù)在軟件開發(fā)(尤其在Web技術(shù)下的數(shù)據(jù)庫(kù)系統(tǒng)開發(fā))具有的重要作用和地位,對(duì)其研究具有重要的現(xiàn)實(shí)意義。
關(guān) 鍵 詞:MVC ;三層結(jié)構(gòu)技術(shù);軟件框架;B/S;Web
1.MVC與三層結(jié)構(gòu)技術(shù)簡(jiǎn)介
MVC是一種軟件,是一種軟件框架[1]。軟件框架是對(duì)通用功能操作進(jìn)行抽象的軟件,這些抽象的功能操作的代碼可以根據(jù)應(yīng)用程序的功能要求有選擇的改變,并復(fù)用框架代碼,進(jìn)而形成特定的應(yīng)用軟件。
就是把一些通用的功能,通過(guò)開發(fā)平臺(tái)以代碼和架構(gòu)的形式表示出來(lái),開發(fā)者通過(guò)框架提供的接口進(jìn)行功能開發(fā),可以復(fù)寫框架代碼,而不必從開始編寫。框架提供了一些軟件功能的默認(rèn)實(shí)現(xiàn),在特定的開發(fā)平臺(tái)下,就是說(shuō)開發(fā)平臺(tái)已經(jīng)代替開發(fā)者實(shí)現(xiàn)了一些通用功能并提供了相應(yīng)的代碼,開發(fā)者只需重寫或添加功能代碼。注意:框架內(nèi)部代碼不可重寫;應(yīng)用程序流程必須在框架內(nèi)部。
三層結(jié)構(gòu)技術(shù)[2]是一種設(shè)計(jì)架構(gòu)模式,是一種軟件的設(shè)計(jì)思想??梢园衍浖O(shè)計(jì)分為表示層、中間層和數(shù)據(jù)層,已利于軟件功能的設(shè)計(jì)和實(shí)現(xiàn),稱為三層結(jié)構(gòu)技術(shù)。
框架給出了應(yīng)用程序的體系結(jié)構(gòu),設(shè)計(jì)模式給出了具體設(shè)計(jì)的解決方案;設(shè)計(jì)模式可用不同語(yǔ)言和不同方式來(lái)實(shí)現(xiàn),而框架則是開發(fā)平臺(tái)給出的設(shè)計(jì)和代碼的混合體;設(shè)計(jì)模式與語(yǔ)言無(wú)關(guān)的,具體設(shè)計(jì)受制于開發(fā)平臺(tái)框架的具體實(shí)現(xiàn)環(huán)境。利用框架開發(fā)軟件應(yīng)體現(xiàn)設(shè)計(jì)模式的基本思想,軟件設(shè)計(jì)模式思想的實(shí)現(xiàn)要選擇合適的軟件框架并受制于框架。
2.MVC結(jié)構(gòu)
2.1組成
由Servlet(Controller)、JSP(View)、JavaBean(Model)三部分構(gòu)成。Model是負(fù)責(zé)保持狀態(tài)、數(shù)據(jù)的應(yīng)用組件,通常這個(gè)狀態(tài)持久于數(shù)據(jù)庫(kù)之中。View是負(fù)責(zé)用戶界面的組件(UI),通常這個(gè)UI是使用Model模型數(shù)據(jù)來(lái)創(chuàng)建的。Controller用來(lái)處理用戶交互,控制器行為(Action)用來(lái)完成用戶發(fā)過(guò)來(lái)的每一個(gè)請(qǐng)求,操作Model(模型)最終會(huì)選擇用哪個(gè)View(視圖)來(lái)顯示UI的組件。
2.2特點(diǎn)
視圖、控制和模型分離,近一步提高了復(fù)用程度,三者可以獨(dú)立變化,降低了耦合性并進(jìn)一步提高了模塊的復(fù)用性;合作效率得到充分發(fā)揮,開發(fā)成員的分工界面更加清晰;當(dāng)出現(xiàn)問(wèn)題時(shí)更容易鎖定問(wèn)題。
2.3結(jié)構(gòu)
3.三層結(jié)構(gòu)技術(shù)[3]
所謂三層體系結(jié)構(gòu),就基于Web的數(shù)據(jù)庫(kù)開發(fā)而言就是在客戶端與數(shù)據(jù)庫(kù)之間加入了一個(gè)中間層,也叫組件層。
而軟件設(shè)計(jì)的一般三層體系結(jié)構(gòu)[4]分為:
(1)表現(xiàn)層(UI):就是展現(xiàn)給用戶的界面,即用戶在使用一個(gè)系統(tǒng)的時(shí)候展現(xiàn)在操作員或用戶的所見與所得及其過(guò)程。
(2)業(yè)務(wù)邏輯層(BLL):針對(duì)具體問(wèn)題的操作,對(duì)數(shù)據(jù)庫(kù)系統(tǒng)而言也可以說(shuō)是對(duì)數(shù)據(jù)層的操作,對(duì)數(shù)據(jù)業(yè)務(wù)邏輯處理和一些事務(wù)辦理。
(3)數(shù)據(jù)訪問(wèn)層(DAL):該層所做事務(wù)是對(duì)數(shù)據(jù)庫(kù)直接操作,針對(duì)存儲(chǔ)數(shù)據(jù)進(jìn)行數(shù)據(jù)的增添、刪除、修改、更新、查找等功能實(shí)現(xiàn)。 [ ]
完善的三層結(jié)構(gòu)的要求是:修改表現(xiàn)層而不用修改邏輯層,修改邏輯層而不用修改數(shù)據(jù)層。這樣就為軟件設(shè)計(jì)提供了架構(gòu)設(shè)計(jì)思想,利于代碼的模塊設(shè)計(jì)和功能的設(shè)計(jì)實(shí)現(xiàn),修改和重組。
4.三層結(jié)構(gòu)在B/S上的應(yīng)用
在Browser/Server三層體系結(jié)構(gòu)下,應(yīng)用軟件三層結(jié)構(gòu)設(shè)計(jì)的軟件系統(tǒng)被分割為表示層(Presentation)、功能層(Business Logic)、數(shù)據(jù)層(Data Service)三個(gè)相對(duì)獨(dú)立的單元。
第一層:表示層,Web瀏覽器上的軟件設(shè)計(jì)。
表示層包含系統(tǒng)的顯示邏輯,位于客戶端。它的任務(wù)是由Web瀏覽器向網(wǎng)絡(luò)上的某一Web服務(wù)器提出服務(wù)請(qǐng)求,Web服務(wù)器對(duì)用戶身份進(jìn)行驗(yàn)證后用HTTP協(xié)議把所需的主頁(yè)傳送給客戶端,客戶機(jī)接受傳來(lái)的主頁(yè)文件,并把它顯示在Web瀏覽器上,相應(yīng)數(shù)據(jù)由此被獲得和顯示。
第二層:功能層,具有應(yīng)用程序擴(kuò)展功能的Web服務(wù)器上的軟件設(shè)計(jì),實(shí)現(xiàn)數(shù)據(jù)處理和事務(wù)處理。
功能層包含系統(tǒng)的事務(wù)處理邏輯,位于Web服務(wù)器端。它的任務(wù)是接受用戶的請(qǐng)求,首先需要執(zhí)行相應(yīng)的擴(kuò)展應(yīng)用程序與數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行連接,通過(guò)SQL等方式向數(shù)據(jù)庫(kù)服務(wù)器提出數(shù)據(jù)處理申請(qǐng),而后等數(shù)據(jù)庫(kù)服務(wù)器將數(shù)據(jù)處理和事務(wù)處理的結(jié)果提交給Web服務(wù)器,再由Web服務(wù)器傳送回客戶端。
第三層:數(shù)據(jù)層,數(shù)據(jù)庫(kù)服務(wù)器上的軟件設(shè)計(jì),主要是對(duì)數(shù)據(jù)庫(kù)直接進(jìn)行數(shù)據(jù)處理。
數(shù)據(jù)層含系統(tǒng)的數(shù)據(jù)處理邏輯,位于數(shù)據(jù)庫(kù)服務(wù)器端。其任務(wù)是接受Web服務(wù)器對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)操縱的請(qǐng)求,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)查詢、修改、更新等功能,把運(yùn)行結(jié)果和數(shù)據(jù)提交給Web服務(wù)器。
5.主要的MVC[5]
(1)Struts:Struts是Apache軟件基金下Takarta項(xiàng)目的一部分。Struts框架的主要架構(gòu)設(shè)計(jì)和開發(fā)者是Craig R.McClanahan。Struts 是Java Web MVC框架中不爭(zhēng)的王者。
(2)Spring:Spring實(shí)際上是Expert One-on-One J2EE Design and Development 一書中所闡述的設(shè)計(jì)思想的具體實(shí)現(xiàn)。
(3)Hibernate:Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。
(4).NET:.NET MVC是微軟官方提供的以MVC模式為基礎(chǔ)的.NET Web應(yīng)用程序 (Web Application)框架。
6.MVC與三層結(jié)構(gòu)技術(shù)應(yīng)用
傳統(tǒng)的軟件設(shè)計(jì)代碼繁瑣,代碼模塊間耦合性高,可重用性差,開發(fā)更簡(jiǎn)潔地設(shè)計(jì)一款代碼整潔,耦合性低,可重用性更高,可擴(kuò)展性更好的軟件,MVC與三層結(jié)構(gòu)技術(shù)被采用。
目前大多數(shù)信息化系統(tǒng)都是面向Internet開發(fā)與部署的,其優(yōu)點(diǎn)是用戶易于操作、不受操作平臺(tái)限制、不受地域性制約,因此在各行各業(yè)得到廣泛的應(yīng)用。而構(gòu)建這些系統(tǒng)的技術(shù)主要有J2EE、.NET,表現(xiàn)技術(shù)主要有JSP、ASP.NET、PHP以及AJAX,它們多以表現(xiàn)層、業(yè)務(wù)層、數(shù)據(jù)持久層層次結(jié)構(gòu)作為構(gòu)建思想。J2EE的優(yōu)點(diǎn)主要表現(xiàn)在開源、安全性高、跨平臺(tái)性強(qiáng)、可移植性好、跨語(yǔ)言程度高,缺點(diǎn)是配置復(fù)雜;.NET的優(yōu)點(diǎn)主要表現(xiàn)在集成性好、簡(jiǎn)化應(yīng)用、支持Web服務(wù)、易于學(xué)習(xí),缺點(diǎn)是操作平臺(tái)單一、局限性較強(qiáng)。本文采用.NET框架作為教學(xué)質(zhì)量評(píng)價(jià)系統(tǒng)的平臺(tái)支持技術(shù),并使用ASP.NET MVC技術(shù)作為系統(tǒng)的主要開發(fā)技術(shù);其根據(jù)MVC的特點(diǎn)分析教學(xué)質(zhì)量評(píng)價(jià)系統(tǒng),將MVC的模型-視圖-控制可分離的優(yōu)點(diǎn)應(yīng)用到教學(xué)質(zhì)量評(píng)價(jià)系統(tǒng)中,并用AJAX技術(shù)應(yīng)用到表現(xiàn)層實(shí)現(xiàn)頁(yè)面實(shí)時(shí)異步交換數(shù)據(jù),從而提高系統(tǒng)的可重用性、通用性和可擴(kuò)展性。
二、關(guān)鍵技術(shù)分析
.NET框架主要包括公共語(yǔ)言運(yùn)行庫(kù)和.NET框架類庫(kù),支持生成和運(yùn)行下一代應(yīng)用程序和 XML Web Services 的內(nèi)部Windows組件,用于提供應(yīng)用程序開發(fā)的基礎(chǔ)設(shè)施。而ASP.NET是一種基于Web開發(fā)的技術(shù),它支持的語(yǔ)言包括微軟所提供的所有語(yǔ)言,其中C#.NET最常用于開發(fā)基于Web的應(yīng)用程序。ASP.NET MVC 框架提供用于創(chuàng)建Web應(yīng)用程序的 ASP.NET Web窗體模式的替代模式;它是一個(gè)可測(cè)試性非常高的輕型演示框架,并集成了ASP.NET的功能;MVC框架在System.Web.Mvc程序集中定義。ASP.NET AJAX是JavaScript、CSS、DOM、XMLHttpRequest四種技術(shù)的集合體,并且AJAX 應(yīng)用程序使用 XMLHttpRequest 對(duì)象繞過(guò)瀏覽器并與 Web 服務(wù)器及任何托管 HTTP 端點(diǎn)建立直接通信,通過(guò)JavaScript實(shí)現(xiàn)頁(yè)面實(shí)時(shí)異步處理數(shù)據(jù);在System.Web.Mvc.Ajax程序集中進(jìn)行了定義。ADO.NET不是簡(jiǎn)單地對(duì)ADO擴(kuò)展,它提供了對(duì)關(guān)系數(shù)據(jù)、XML 和應(yīng)用程序數(shù)據(jù)的訪問(wèn),對(duì)Microsoft SQL Server和XML等數(shù)據(jù)源以及通過(guò)OLE DB和XML公開的數(shù)據(jù)源提供一致的訪問(wèn);并通過(guò)ADO.NET DataSet對(duì)象處理和緩存數(shù)據(jù)。
1.ASP.NET MVC
可以認(rèn)為ASP.NET MVC是ASP.NET和MVC框架的結(jié)合體,且互不包含。
(1)ASP.NET與MVC概述
ASP.NET是一種統(tǒng)一的Web開發(fā)模型,可用公共語(yǔ)言運(yùn)行庫(kù)(CLR)兼容的任何語(yǔ)言來(lái)編寫應(yīng)用程序的代碼,這些語(yǔ)言包括Microsoft Visual Basic、C#、JScript .NET 和 J#;主要提供了頁(yè)和控件框架、ASP.NET 編譯器、安全基礎(chǔ)結(jié)構(gòu)、狀態(tài)管理功能、應(yīng)用程序配置、運(yùn)行狀況監(jiān)視和性能功能、調(diào)試支持、XML Web services 框架、可擴(kuò)展的宿主環(huán)境、應(yīng)用程序生命周期管理和可擴(kuò)展的設(shè)計(jì)器環(huán)境等功能。其ASP.NET頁(yè)面周期如圖1所示。
MVC包括模型、視圖和控制三個(gè)組件,其中模型對(duì)象是實(shí)現(xiàn)應(yīng)用程序數(shù)據(jù)域邏輯的應(yīng)用程序部件,是檢索模型狀態(tài)并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中;并且在小型應(yīng)用程序中,模型通常是概念上的分離,而不是實(shí)際分離。視圖是顯示應(yīng)用程序用戶界面(UI)的組件??刂破魇翘幚碛脩艚换?、使用模型并最終選擇要呈現(xiàn)的視圖來(lái)顯示 UI 的組件;在 MVC 應(yīng)用程序中,視圖僅顯示信息;控制器則用于處理和響應(yīng)用戶輸入和交互,并廣泛支持 ASP.NET 路由。ASP.NET MVC結(jié)構(gòu)如圖2所示。
(2)ASP.NET MVC功能
主要包括以下功能,處理序列如圖3。
①應(yīng)用程序任務(wù)(輸入邏輯、業(yè)務(wù)邏輯和 UI 邏輯)的分離、可測(cè)試性和測(cè)試驅(qū)動(dòng)的開發(fā) (TDD)。MVC 框架中的所有核心協(xié)定都基于接口并且可使用 mock 對(duì)象進(jìn)行測(cè)試,mock 對(duì)象是模仿應(yīng)用程序中實(shí)際對(duì)象行為的模擬對(duì)象。
②可擴(kuò)展和可插入的框架。在開發(fā)時(shí),可以插入自己的視圖引擎、URL 路由策略、操作方法參數(shù)序列化以及其他組件;它還支持使用依賴項(xiàng)注入(DI)和控制反轉(zhuǎn)(IOC)容器模型。
③廣泛支持 ASP.NET 路由。ASP.NET 路由是一個(gè)功能強(qiáng)大的 URL 映射組件,它允許生成具有易于理解和可搜索的 URL 的應(yīng)用程序。URL 未必包含文件擴(kuò)展名,并且旨在支持非常適合搜索引擎優(yōu)化(SEO)和具象狀態(tài)傳輸(REST)尋址的 URL 命名模式。
④支持將現(xiàn)有 ASP.NET 頁(yè)面(.aspx文件)、用戶控件(.ascx文件)和母版頁(yè)(.master 文件)標(biāo)記文件中的標(biāo)記用作視圖模板,并支持現(xiàn)有 ASP.NET的功能。
(3)ASP.NET與ASP.NET MVC
具體比較如表1和圖4所示。
2.ASP.NET AJAX
ASP.NET AJAX 統(tǒng)一了編程接口和數(shù)據(jù)類型,并使用JavaScript Object Notation(JSON)層可確保到達(dá)客戶端的DTO制作從服務(wù)器發(fā)出的數(shù)據(jù)的鏡像。在客戶端使用ASP.NET AJAX與遠(yuǎn)程服務(wù)進(jìn)行交互,將實(shí)時(shí)數(shù)據(jù)返回到瀏覽器中,并提供了與服務(wù)器端服務(wù)同名的JavaScript 對(duì)象和大量靜態(tài)方法,如Update 方法最終會(huì)提取 JavaScript文檔類型定義(DTD)數(shù)組并將其傳遞到最終負(fù)責(zé)更新用戶界面的回調(diào)函數(shù)中;同時(shí),標(biāo)記生成器基于文檔對(duì)象模型(DOM)中一個(gè)或多個(gè) HTML 模板的引用以及下載的數(shù)據(jù)返回 HTML 字符串,最后回調(diào)在頁(yè)面的 DOM 中插入該字符串;并通過(guò)DOM將DataView控件中的數(shù)據(jù)呈現(xiàn)在頁(yè)面。如圖5是ASP.NET AJAX緩存和運(yùn)行機(jī)制。在定義客戶端主要以瀏覽器端模板模式(BST)運(yùn)行,它的核心是JavaScript MarkupBuilder 類。
3.ADO.NET
ADO.NET 通過(guò)數(shù)據(jù)處理將數(shù)據(jù)訪問(wèn)分解為多個(gè)可以單獨(dú)使用或一前一后使用的不連續(xù)組件。ADO.NET 包含用于連接到數(shù)據(jù)庫(kù)、執(zhí)行命令和檢索結(jié)果的.NET Framework 數(shù)據(jù)提供程序,如圖6所示。ADO.NET 類在System.Data.dllt中,如使用SQL Server的方法為using System.Data.SqlClient;并且與System.Xml.dll 中的 XML 類集成;具有斷開式數(shù)據(jù)結(jié)構(gòu),能夠與 XML 緊密集成,能夠組合來(lái)自多個(gè)不同數(shù)據(jù)源的數(shù)據(jù)的通用數(shù)據(jù)表示形式,以及與數(shù)據(jù)庫(kù)交互而優(yōu)化的功能。ADO.NET實(shí)體框架使開發(fā)人員可以編寫更少的數(shù)據(jù)訪問(wèn)代碼,減少維護(hù),將數(shù)據(jù)結(jié)構(gòu)抽象化為更易于開展業(yè)務(wù)的方式,并且有利于數(shù)據(jù)的持久性;通過(guò)EntityClient可與概念層的實(shí)體數(shù)據(jù)模型(EDM)交互,如圖7所示。
三、基于ASP.NET MVC的教學(xué)質(zhì)量評(píng)價(jià)系統(tǒng)分析設(shè)計(jì)
教學(xué)質(zhì)量評(píng)價(jià)系統(tǒng)主要以教師-學(xué)生(主體-客體)間的“教學(xué)用”的角度來(lái)分析需求,因此操作群體包括教師和學(xué)生,評(píng)價(jià)基礎(chǔ)是教師與學(xué)生間的“教學(xué)用”的關(guān)系。在實(shí)現(xiàn)系統(tǒng)之前已經(jīng)建立了評(píng)價(jià)教師和學(xué)生的指標(biāo)體系,這兩個(gè)指標(biāo)體系是圍繞“教學(xué)用”展開的。其中教師指標(biāo)主要從教學(xué)效果、教學(xué)方法、課堂氣氛、備課情況、課堂紀(jì)律、知識(shí)靈活程度、知識(shí)廣度、吸引力等角度建立的,學(xué)生的指標(biāo)主要從自覺(jué)情況、學(xué)習(xí)積極性、聽課狀態(tài)、與教師互動(dòng)頻率、學(xué)習(xí)成績(jī)、技能與比賽、自學(xué)能力、遵紀(jì)守法、到課率、參與活動(dòng)的態(tài)度等角度建立的。這就形成了教師給學(xué)生打分,學(xué)生給教師打分,但這與現(xiàn)階段各學(xué)校采用的評(píng)課是有區(qū)別的,主要表現(xiàn)在:(1)教師與學(xué)生的指標(biāo)是相互制約和聯(lián)系的;(2)注重主體與客體的關(guān)系;(3)強(qiáng)調(diào)“教學(xué)用”在評(píng)價(jià)中的作用,從而做到教-學(xué)-用鏈?zhǔn)疥P(guān)系;(4)將評(píng)價(jià)的結(jié)果及時(shí)反饋給領(lǐng)導(dǎo),以便領(lǐng)導(dǎo)有效調(diào)整管理策略;(5)提高了領(lǐng)導(dǎo)、教師、學(xué)生的督導(dǎo)機(jī)制;(6)實(shí)現(xiàn)了“教學(xué)用”間的跟蹤機(jī)制。因此,基于ASP.NET MVC評(píng)價(jià)系統(tǒng)的實(shí)現(xiàn)就以兩大指標(biāo)體系為系統(tǒng)主要需求展開分析設(shè)計(jì),且采用層次分析法(AHP)計(jì)算每一個(gè)指標(biāo)的權(quán)重,這樣降低了主觀因素,實(shí)現(xiàn)了科學(xué)評(píng)價(jià),本系統(tǒng)是通過(guò)AHP計(jì)算軟件先將權(quán)重結(jié)果代入到系統(tǒng)中,再計(jì)算教學(xué)質(zhì)量結(jié)果。
1.教學(xué)質(zhì)量評(píng)價(jià)系統(tǒng)分析設(shè)計(jì)
用表現(xiàn)層、業(yè)務(wù)層和數(shù)據(jù)持久層作為系統(tǒng)的構(gòu)建思想,并將AJAX和MVC融合到各層中;通過(guò)各指標(biāo)的評(píng)分作為教學(xué)質(zhì)量評(píng)價(jià)的基礎(chǔ),其計(jì)算方法為:
針對(duì)一個(gè)教師有i門課程,若每一門課程有mi個(gè)學(xué)生打分,每一門課程的權(quán)重分wi,分?jǐn)?shù)為Si,則該教師每一門課程和總得分分別計(jì)算如下:
針對(duì)一個(gè)學(xué)生選修了j門課程,相應(yīng)有Teaj個(gè)教師為他們打分,每一個(gè)教師打的分?jǐn)?shù)為Sj,則該學(xué)生平均分Ava為:
教學(xué)質(zhì)量評(píng)價(jià)功能和流程分別如圖8、圖9所示。
2.關(guān)鍵代碼
(1)創(chuàng)建控制器:
sing System;
using System.Web;
using System.Web.Mvc;
namespace TeacherMVC.Controllers
{
public class TeacherController : Controller//創(chuàng)建一個(gè)教師類
{
[ControllerAction]
public void Index()
{
...
}
}
}
(2)創(chuàng)建視圖:
namespace TeacherFromMVC.Views.Record//創(chuàng)建一個(gè)教師視圖
{
public partial class HiThere : ViewPage
{
...
}
}
...
[ControllerAction]
public void EditPage(string pageName)//實(shí)現(xiàn)視圖翻頁(yè)
{
Space space = new Space(Repository);
Page page = space.GetPage(pageName);
RenderView("editpage",
new PageViewData {
Name = pageName,
Page = page });
}
(3)創(chuàng)建模型:
public class TeacherGradeRepository
{
//創(chuàng)建模型
TeachermarksModelDataContext db = new TeachermarksModelDataContext();
// 請(qǐng)求方法
public IQueryable FindAllTeachermarks() { ... }
public IQueryable FindAllPublicBookmarks() { ... }
public IQueryable FindTeachermarksByUser(string teacher){ ... }
public IQueryable FindPublicTeachermarksByUser(string teacher) { ... }
public IQueryable FindTeachermarksByTag(string tag) { ... }
public Teachermark FindTeachermarkById(int id) { ... }
public IQueryable FindTeacher(){ ... }
public IQueryable FindTags() { ... }
public Tag FindTag(string tag) { ... }
// insert/delete methods
public void AddTeachermark(Teachermark bm) { ... }
...
// persistence
public void Save() { ... }
}
(4)創(chuàng)建路由:
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名
"{controller}/{action}/{id}",// URL參數(shù)
new { controller="Home", // 參數(shù)默認(rèn)值
action="Index", id="" }
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
(5)聲明AJAX的方法:
{{description}}
…
function pageLoad()
{
if (builder === null)
{
builder = new Samples.MarkupBuilder();
builder.loadHeader($get("header"));
builder.loadFooter($get("footer"));
builder.loadItemTemplate($get("item"));
}
}
…
關(guān)鍵詞:MVC架構(gòu);IOC架構(gòu);ORM架構(gòu);技術(shù)實(shí)現(xiàn)
中圖分類號(hào):TP301文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1672-7800(2012)003-0019-03
基金項(xiàng)目:東莞市高等院校科研機(jī)構(gòu)科技計(jì)劃項(xiàng)目(2011108101012)
作者簡(jiǎn)介:李淑飛(1974-),女,湖南永興人,碩士,東莞職業(yè)技術(shù)學(xué)院講師,研究方向?yàn)橛?jì)算機(jī)應(yīng)用技術(shù)。
0引言
近年來(lái),在J2EE世界,開源框架不斷涌現(xiàn),像Struts、Spring、Hibernate等經(jīng)典成熟的開源框架,在其框架上進(jìn)行二次開發(fā)將極大地減少軟件開發(fā)成本,提高軟件的生產(chǎn)效率,同時(shí)也規(guī)范了部分軟件開發(fā)層次,大大減輕了開發(fā)人員的負(fù)擔(dān)。由于開源框架都是免費(fèi)和開放源碼的,開發(fā)者如何有效地駕馭這些框架,如何將不同層上的框架整合在一起,把開發(fā)人員從繁雜的底層編碼中解脫出來(lái),使其更專注于應(yīng)用的業(yè)務(wù),都是值得探討的問(wèn)題。為此,筆者對(duì)開源框架核心思想的關(guān)鍵技術(shù)進(jìn)行了研究,并給出了關(guān)鍵技術(shù)的實(shí)現(xiàn)方法。
1開源框架的核心思想
在J2EE開源框架中, Struts、Spring、Hibernate等開源框架代表了J2EE應(yīng)用在結(jié)構(gòu)上的3個(gè)層次,即應(yīng)用系統(tǒng)前端、業(yè)務(wù)規(guī)則核心應(yīng)用、數(shù)據(jù)訪問(wèn)及存儲(chǔ)對(duì)象映射。Struts是在Web版應(yīng)用程序時(shí)產(chǎn)生的,即在應(yīng)用前端將視圖(View)、控制器(Controller)、數(shù)據(jù)模型(Model)分離開來(lái),其核心思想是MVC架構(gòu)。Spring是一個(gè)輕量級(jí)的開源框架,以控制反轉(zhuǎn)(IOC)原則和面向方面編程(AOP)思想為基礎(chǔ),提供管理對(duì)象服務(wù),其核心思想是控制反轉(zhuǎn)(IOC)或者說(shuō)是依賴注入(DI),其核心概念是Bean Factory,它能夠很方便地配置、裝配JavaBean和普通的Java 對(duì)象,通過(guò)IOC 容器和依賴注入技術(shù)無(wú)縫的將各個(gè)協(xié)同工作的業(yè)務(wù)邏輯對(duì)象整合在一起。Hibernate是Java應(yīng)用中對(duì)象與關(guān)系型數(shù)據(jù)庫(kù)的關(guān)系持久化層的解決方案,核心思想是ORM,負(fù)責(zé)Java對(duì)象和關(guān)系數(shù)據(jù)之間的映射,封裝了底層JDBC訪問(wèn)數(shù)據(jù)庫(kù)細(xì)節(jié)。
2開源框架的關(guān)鍵技術(shù)及其應(yīng)用模型
開源框架將Web應(yīng)用程序劃分成三層架構(gòu):表現(xiàn)層、業(yè)務(wù)層和數(shù)據(jù)層,各層的關(guān)鍵技術(shù)如下:
(1)表現(xiàn)層關(guān)鍵技術(shù)。在MVC前端部分,需遵循MVC架構(gòu),構(gòu)造出其數(shù)據(jù)模型(M)、視圖(V)、控制器(C)。模型(M)根據(jù)業(yè)務(wù)規(guī)則封裝數(shù)據(jù)后的應(yīng)用程序狀態(tài),視圖(V)用來(lái)組織表現(xiàn)模型(M)內(nèi)容,在MVC的前端簡(jiǎn)單模型中,視圖(V)通過(guò)外界輸入請(qǐng)求給控制器(C),控制器(C)根據(jù)視圖(V)的輸入內(nèi)容,將其轉(zhuǎn)換成程序相應(yīng)行為,去更新模型(M),再選擇相應(yīng)視圖(V)展現(xiàn)給用戶。
(2)業(yè)務(wù)層關(guān)鍵技術(shù)。該層關(guān)鍵技術(shù)是IOC業(yè)務(wù)關(guān)注點(diǎn)的IOC控制反轉(zhuǎn)、解耦及非侵入性,Spring 通過(guò)JavaBean 模型提供基于IoC 容器的BeanFactory 和基于AOP 框架的JavaBean 組件,不需要維護(hù)組件之間的依賴關(guān)系,只要在配置文件WebApplicationContext.xml 中設(shè)置屬性,Spring 容器將自動(dòng)依賴注入到相關(guān)的組件,完成業(yè)務(wù)方法層組件的配置與加載。在圖1中的IOC簡(jiǎn)單模型中,將業(yè)務(wù)關(guān)注點(diǎn)(組件)分離,可以達(dá)到將關(guān)注點(diǎn)解耦的目的,同時(shí)減少了業(yè)務(wù)關(guān)注點(diǎn)(組件)相互的侵入性和直接依賴。將關(guān)注點(diǎn)(組件)及關(guān)注點(diǎn)(組件)之間依賴關(guān)系的實(shí)現(xiàn)交給IOC容器完成(而不是交給應(yīng)用程序內(nèi)部),IOC容器在運(yùn)行期間將依賴關(guān)系動(dòng)態(tài)的注入關(guān)注點(diǎn)(組件),即IOC控制反轉(zhuǎn)。
(3)數(shù)據(jù)持久層關(guān)鍵技術(shù)。該層關(guān)鍵技術(shù)是ORM部分,需解決數(shù)據(jù)庫(kù)的無(wú)關(guān)性和實(shí)體對(duì)象的持久性。圖2中的ORM中數(shù)據(jù)存取層實(shí)現(xiàn)了數(shù)據(jù)庫(kù)訪問(wèn)無(wú)關(guān)性,通過(guò)封裝JDBC對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)細(xì)節(jié),實(shí)現(xiàn)了對(duì)主流數(shù)據(jù)庫(kù)的統(tǒng)一訪問(wèn)接口,這些接口是建立在圖2中JDBC封裝數(shù)據(jù)庫(kù)訪問(wèn)無(wú)關(guān)的基礎(chǔ)之上的。對(duì)象映射關(guān)系持久化是Java實(shí)體對(duì)象與關(guān)系數(shù)據(jù)庫(kù)的映射,通過(guò)持久化將數(shù)據(jù)庫(kù)中表的某條記錄映射成Java應(yīng)用中的某個(gè)實(shí)體對(duì)象,或者將Java應(yīng)用中的某個(gè)實(shí)體對(duì)象映射成數(shù)據(jù)庫(kù)中表的某條記錄,對(duì)象關(guān)系映射文件描述了映射關(guān)系,而持久化能讓開發(fā)者以面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫(kù)。DAO組件實(shí)現(xiàn)了對(duì)業(yè)務(wù)數(shù)據(jù)訪問(wèn)方法,并通過(guò)統(tǒng)一對(duì)外訪問(wèn)層向用戶提供統(tǒng)一的訪問(wèn)方法和服務(wù)。
3開源框架關(guān)鍵技術(shù)的實(shí)現(xiàn)
在Web應(yīng)用系統(tǒng)開發(fā)中,將MVC前端簡(jiǎn)單模型(表現(xiàn)層)、IOC簡(jiǎn)單模型(業(yè)務(wù)層)、ORM簡(jiǎn)單模型(數(shù)據(jù)持久層)、關(guān)系數(shù)據(jù)庫(kù)整合起來(lái),構(gòu)成開源框架的架構(gòu)層次模型。MVC框架中的控制器響應(yīng)來(lái)自客戶端的數(shù)據(jù),并組裝相應(yīng)數(shù)據(jù),然后請(qǐng)求或更新相應(yīng)的業(yè)務(wù)模型,該業(yè)務(wù)模型繼而查找IOC框架中的業(yè)務(wù)組件,并請(qǐng)求IOC上的業(yè)務(wù)服務(wù),業(yè)務(wù)服務(wù)調(diào)用ORM框架DAO類方法,從而使ORM與關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行交互。完成對(duì)數(shù)據(jù)的訪問(wèn)后,將響應(yīng)結(jié)果集合返回給IOC框架的業(yè)務(wù)服務(wù),業(yè)務(wù)服務(wù)響應(yīng)給MVC的控制器,控制器再根據(jù)業(yè)務(wù)模型,選擇合適的視圖裝載數(shù)據(jù),最終響應(yīng)給客戶端。
3.1MVC架構(gòu)的關(guān)鍵技術(shù)實(shí)現(xiàn)
開源框架的MVC框架中的Controller控制器用來(lái)接收瀏覽器的請(qǐng)求,更新Model模型狀態(tài),以及選擇合適的View視圖,是組織協(xié)調(diào)框架統(tǒng)一行動(dòng)的控制樞紐。Controller控制器是以servlet實(shí)現(xiàn)的命令設(shè)計(jì)模式,它是MVC的核心,mvcBean.xml文件(配置了模型及視圖的選擇)用來(lái)配置該命令模式,描述行為和流程。Controller控制器分為統(tǒng)一處理所有客戶端請(qǐng)求、統(tǒng)一處理所有跳轉(zhuǎn)和映射,統(tǒng)一處理所有客戶端請(qǐng)求由ControllerResult類實(shí)現(xiàn),統(tǒng)一處理所有跳轉(zhuǎn)由ControllerForword類實(shí)現(xiàn),而處理映射mvcBean.xml文件由InitConfig類實(shí)現(xiàn)。MVC框架實(shí)現(xiàn)流程見圖3。
3.2IOC架構(gòu)的關(guān)鍵技術(shù)實(shí)現(xiàn)
開源框架的IOC框架中的核心就是業(yè)務(wù)組件及管理,業(yè)務(wù)組件及業(yè)務(wù)對(duì)象之間的依賴關(guān)系用配置文件iocBean.xml來(lái)管理,也就是依賴注入機(jī)制或者說(shuō)是控制反轉(zhuǎn)(將關(guān)系交給IOC容器管理而不是應(yīng)用程序)。IOC容器用來(lái)管理配置文件中業(yè)務(wù)對(duì)象間的依賴關(guān)系,并在Web容器啟動(dòng)時(shí)或者應(yīng)用程序需要時(shí)注入。IOC容器是在Web容器中開辟了一塊屬于某個(gè)業(yè)務(wù)應(yīng)用的特別空間。在Web容器啟動(dòng)時(shí),通過(guò)啟動(dòng)配置監(jiān)聽器來(lái)加載IOC容器,讓IOC容器根據(jù)配置文件加載或初始化業(yè)務(wù)組件并維護(hù)業(yè)務(wù)對(duì)象間的依賴關(guān)系,使用IocContext類來(lái)為這些加載的業(yè)務(wù)組件提供上下文環(huán)境,ClassInstanceFactory類來(lái)生成業(yè)務(wù)對(duì)象,讓util類包來(lái)解析業(yè)務(wù)對(duì)象間的依賴關(guān)系。這樣就能通過(guò)Web容器上下文WebApplicationContext環(huán)境就能訪問(wèn)IOC容器上下文IocContext環(huán)境,進(jìn)而訪問(wèn)IOC容器下的能夠訪問(wèn)所有內(nèi)容,包括業(yè)務(wù)組件及業(yè)務(wù)對(duì)象間的依賴關(guān)系。
開源框架中的簡(jiǎn)單IOC框架部分核心思想的代碼實(shí)現(xiàn),包括IOC容器的初始化、依賴關(guān)系注入。在IOC容器的初始化代碼中,類WebContextListener實(shí)現(xiàn)了ServletContextListener接口,它會(huì)監(jiān)聽Servlet容器,當(dāng)Servlet容器啟動(dòng)時(shí)它會(huì)調(diào)用contextInitialized()方法進(jìn)行相關(guān)的初始化工作,applicationContext作為IOC容器通知上下文被唯一一次初始化,包括初始化配置文件iocBean.xml,而后通過(guò)applicationContext能夠獲取到IOC容器所有上下文信息,當(dāng)Servlet容器關(guān)閉的時(shí)候,它同樣會(huì)調(diào)用contextDestroyed()方法進(jìn)行相關(guān)的銷毀工作,代碼如下:
public class WebContextListener implements ServletContextListener {
ApplicationContext applicationContext;
public void contextInitialized(ServletContextEvent servletContextEvent) {
String contextConfigPath = servletContextEvent.getServletContext().getInitParameter("contextBeanPath");
if (contextConfigPath == null) {
applicationContext = new IocContext();
} else {
applicationContext = new IocContext(contextConfigPath);
}
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
if (applicationContext != null)
applicationContext = null;
}
}
在IOC容器加載業(yè)務(wù)服務(wù)組件部分的核心代碼,實(shí)現(xiàn)對(duì)配置文件iocBean.xml的初始化,并完成業(yè)務(wù)組件的加載。bean用來(lái)描述一個(gè)業(yè)務(wù)組件,而該業(yè)務(wù)組件有很多屬性propertys;使用一個(gè)beanPropertyMap的Map類型來(lái)描述該業(yè)務(wù)組件的多個(gè)屬性,Map中的String類型的key來(lái)標(biāo)識(shí)該業(yè)務(wù)組件的一個(gè)屬性,并用來(lái)區(qū)別于該業(yè)務(wù)組件其他的屬性,BeanProperty類型的value來(lái)存儲(chǔ)該屬性對(duì)象;BeanProperty類型的name用來(lái)描述該實(shí)例中使用的變量,ref描述該變量實(shí)現(xiàn)的類,其中name的值為IOC容器注入的業(yè)務(wù)名稱,而ref的值即為name的依賴關(guān)系,代碼如下:
List propertys = bean.selectNodes("property");
Map beanPropertyMap = new HashMap();
if (propertys != null && propertys.size() > 0) {
for (Element property : propertys) {
String name = property.attributeValue("name");
String ref = property.attributeValue("ref");
BeanProperty beanProperty = new BeanProperty();
beanProperty.setName(name);
beanProperty.setRef(ref);
beanPropertyMap.put(name, beanProperty);
}
}
3.3ORM架構(gòu)的關(guān)鍵技術(shù)實(shí)現(xiàn)
開源框架的ORM框架中的核心就是對(duì)象關(guān)系映射,同時(shí)包括以封裝好的JDBC數(shù)據(jù)庫(kù)訪問(wèn)無(wú)關(guān)性作為基礎(chǔ)的數(shù)據(jù)存取、事務(wù)管理。對(duì)象關(guān)系映射的主要文件有:映射類(*.java)、映射文件(*.xml)以及數(shù)據(jù)庫(kù)配置文件(*.xml)。映射類描述數(shù)據(jù)庫(kù)表的結(jié)構(gòu),表中的字段在類中被描述成屬性;映射文件描述數(shù)據(jù)庫(kù)表和映射類之間的關(guān)系,包括映射類和數(shù)據(jù)庫(kù)表的對(duì)應(yīng)關(guān)系、表字段和類屬性類型的對(duì)應(yīng)關(guān)系以及表字段和類屬性名稱的對(duì)應(yīng)關(guān)系等;數(shù)據(jù)庫(kù)配置文件描述數(shù)據(jù)庫(kù)連接時(shí)需要的連接信息,比如連接數(shù)據(jù)庫(kù)類型信息、登錄用戶名、登錄密碼以及連接字符串。
在ORM框架的關(guān)鍵技術(shù)實(shí)現(xiàn)中,DAOFactory用來(lái)根據(jù)不同的業(yè)務(wù)對(duì)象產(chǎn)生相關(guān)業(yè)務(wù)DAO實(shí)現(xiàn)類,AbstractDAO用來(lái)封裝DAO實(shí)現(xiàn)中的增刪改查等共同抽象業(yè)務(wù)行為,是DAO實(shí)現(xiàn)的父類;IDAOModule接口采用Hibernate技術(shù)來(lái)管理數(shù)據(jù)存取層和實(shí)現(xiàn)實(shí)體對(duì)象持久化,并被依賴注入到AbstractDAO;DAO實(shí)現(xiàn)類則實(shí)現(xiàn)了業(yè)務(wù)數(shù)據(jù)訪問(wèn)方法,這些方法會(huì)調(diào)用IDAOModule接口的實(shí)現(xiàn)類中的方法來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),以獲取相關(guān)業(yè)務(wù)數(shù)據(jù)。當(dāng)業(yè)務(wù)邏輯層調(diào)用ORM框架的數(shù)據(jù)訪問(wèn)層時(shí),根據(jù)業(yè)務(wù)邏輯DAOFactory選擇產(chǎn)生相應(yīng)的DAO實(shí)現(xiàn)類,DAO實(shí)現(xiàn)類會(huì)選擇相應(yīng)的IDAOModule接口實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)訪問(wèn)并返回相關(guān)業(yè)務(wù)數(shù)據(jù)。
4結(jié)束語(yǔ)
開源MVC框架簡(jiǎn)單化了Struts框架,不在視圖中支持?jǐn)U展自定義標(biāo)簽,IOC框架簡(jiǎn)單將這些業(yè)務(wù)服務(wù)組件在web容器啟動(dòng)IOC容器時(shí)或者在應(yīng)用程序需要時(shí)初次初始化加載到一個(gè)全局Map(IocContext類能訪問(wèn)到的)中,IOC容器只加載一次,簡(jiǎn)單的提供業(yè)務(wù)服務(wù)組件的訪問(wèn);ORM框架并不維護(hù)模型映射中的對(duì)象間關(guān)系、關(guān)系數(shù)據(jù)庫(kù)關(guān)系、映射中的策略,只是簡(jiǎn)單映射Java對(duì)象與關(guān)系數(shù)據(jù)模型,通過(guò)對(duì)表現(xiàn)層、業(yè)務(wù)層、數(shù)據(jù)層的整合、重構(gòu)、改進(jìn),降低重新開發(fā)框架的成本,更能在極短的時(shí)間內(nèi)完成大量重復(fù)而簡(jiǎn)單的工作任務(wù),提升工作效率,打造企業(yè)競(jìng)爭(zhēng)產(chǎn)品,提升企業(yè)品牌。
參考文獻(xiàn):
\[1\]CHUCK CAVANESS.Programming jakarta struts O'Reilly Media,2002(11).
\[2\]劉君強(qiáng),顧海全,王訊,等.基于開源框架的高質(zhì)量J2EE應(yīng)用架構(gòu)\[J\].計(jì)算機(jī)工程與設(shè)計(jì),2007(1).
\[3\]黃道斌,尹榮章,葉明全,等.基于開源框架的內(nèi)容管理系統(tǒng)\[J\].電腦知識(shí)與技術(shù),2010(4).
\[4\]夏昕,曹曉鋼,唐勇.深入淺出Hibernate\[M\].北京:電子工業(yè)出版社,2005.
\[5\]孫衛(wèi)琴.Tomcat與JavaWeb開發(fā)技術(shù)詳解\[M\].北京:電子工業(yè)出版社,2004.
\[6\]王福強(qiáng).Spring揭秘\[M\].北京:人民郵電出版社,2009.
Research and Implementation of Key Technologies of
The Core Idea of Open Source Framework