前言
隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,現(xiàn)在很多國外的大學(xué)和社會(huì)其他部門都已經(jīng)開設(shè)了遠(yuǎn)程教育,,通過計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)異地教育和培訓(xùn)?,F(xiàn)在,計(jì)算機(jī)硬件技術(shù)的發(fā)展已經(jīng)達(dá)到了相當(dāng)高的水平,。但是,遠(yuǎn)程教育軟件的開發(fā)目前還處于起步階段,,隨著這項(xiàng)技術(shù)的不斷深入發(fā)展,,就要求有更好、更完善的軟件系統(tǒng)應(yīng)用到遠(yuǎn)程教育當(dāng)中去,,這就給軟件設(shè)計(jì)人員提出了更高的設(shè)計(jì)要求,。
遠(yuǎn)程教育包括很多環(huán)節(jié),例如教學(xué)系統(tǒng),、答疑系統(tǒng)和考試系統(tǒng)等等,。其中很重要的一個(gè)環(huán)節(jié)就是在線考試系統(tǒng),同時(shí)它也是最難實(shí)現(xiàn)的環(huán)節(jié),。在我國,,雖然遠(yuǎn)程教育已經(jīng)蓬勃地發(fā)展起來,但是目前學(xué)校與社會(huì)上的各種考試大都采用傳統(tǒng)的考試方式,,在此方式下,,組織一次考試至少要經(jīng)過五個(gè)步驟,即人工出題,、考生考試,、人工閱卷、成績(jī)?cè)u(píng)估和試卷分析,。顯然,,隨著考試類型的不斷增加及考試要求的不斷提高,教師的工作量將會(huì)越來越大,,并且其工作將是一件十分煩瑣和非常容易出錯(cuò)的事情,,可以說傳統(tǒng)的考試方式已經(jīng)不能適應(yīng)現(xiàn)****試的需要。隨著計(jì)算機(jī)應(yīng)用的迅猛發(fā)展,網(wǎng)絡(luò)應(yīng)用不斷擴(kuò)大,,如遠(yuǎn)程教育和虛擬大學(xué)的出現(xiàn)等等,,且這些應(yīng)用正逐步深入到千家萬戶。人們迫切要求利用這些技術(shù)來進(jìn)行在線考試,,以減輕教師的工作負(fù)擔(dān)及提高工作效率,,與此同時(shí)也提高了考試的質(zhì)量,從而使考試更趨于公證,、客觀,,更加激發(fā)學(xué)生的學(xué)習(xí)興趣。例如目前許多國際著名的計(jì)算機(jī)公司所舉辦的各種認(rèn)證考試絕大部分采用這種方式,。
在線考試是現(xiàn)階段研究開發(fā)的一個(gè)熱點(diǎn),。它是建立在國際互聯(lián)網(wǎng)上的應(yīng)用系統(tǒng),客戶端的配置可以極為簡(jiǎn)單,,使考試不受地域的局限,。一個(gè)完備的在線考試系統(tǒng)可以使用戶在網(wǎng)上學(xué)習(xí)過后及時(shí)檢驗(yàn)自己的學(xué)習(xí)效果,已發(fā)現(xiàn)自己的不足,,使得學(xué)習(xí)效率得到很大提高,。在線考試系統(tǒng)中題目的生成、試卷的提交,、成績(jī)的批閱等都可以在網(wǎng)絡(luò)上自動(dòng)完成,。只要形成一套成熟的題庫就可以實(shí)現(xiàn)考試的自動(dòng)化。這樣一來,,教師所要做的只是精心設(shè)計(jì)題目,、維護(hù)題庫,而不是組織考試,,從而大大減輕了教師的負(fù)擔(dān),,這表明其經(jīng)濟(jì)性是相當(dāng)可觀的。為了適應(yīng)新形勢(shì)的發(fā)展,,我進(jìn)行了這一系統(tǒng)的初步設(shè)計(jì)工作,,也可以說是做一個(gè)初步的探索,希望它能夠在各類考試中發(fā)揮高效,、便捷的作用,把老師從繁重的工作中解脫出來,!
目前,網(wǎng)絡(luò)應(yīng)用軟件運(yùn)行的模式主要有二類:Client/server模式,,Browser/Web模式,。前者主要的缺點(diǎn)是維護(hù)、升級(jí)較麻煩,,后者是近幾年伴隨Internet迅速發(fā)展起來的一種技術(shù),,它與客戶/服務(wù)器方式類似,,客戶端是一個(gè)標(biāo)準(zhǔn)的瀏覽器,服務(wù)器端是Web Server ,,而Web Server與數(shù)據(jù)庫和應(yīng)用服務(wù)器的緊密結(jié)合,,使得這種模式的應(yīng)用范圍不斷擴(kuò)大,它已不僅僅用于網(wǎng)上查詢,,有很多部門的業(yè)務(wù)系統(tǒng),、企業(yè)的MIS系統(tǒng)紛紛采用這種模式,它的主要優(yōu)點(diǎn)是便于擴(kuò)充應(yīng)用,、升級(jí)維護(hù)簡(jiǎn)便,。
另外,考試系統(tǒng)的軟件也必將不斷的更新,;同時(shí)軟件產(chǎn)品本身就要經(jīng)過一個(gè)不斷自我完善的過程,。
基于上述考慮,用Browser/Web模式來設(shè)計(jì)考試系統(tǒng)比較合適,,服務(wù)器端我們采用Access數(shù)據(jù)庫系統(tǒng)和ASP組件來構(gòu)成考試的應(yīng)用服務(wù)系統(tǒng),;客戶端采用瀏覽器來完成考試全過程,同時(shí)可進(jìn)行遠(yuǎn)程系統(tǒng)維護(hù)和管理,。
利用網(wǎng)絡(luò)和數(shù)據(jù)庫技術(shù),,結(jié)合目前硬件價(jià)格普遍下跌與寬帶網(wǎng)大力建設(shè)的有利優(yōu)勢(shì),應(yīng)用Active Server Page技術(shù),,我開發(fā)了基于B/S模式多用戶在線考試系統(tǒng)這一程序。它運(yùn)用方便,、操作簡(jiǎn)單,,效率很高(同時(shí),它要求計(jì)算機(jī)配置也很高,,尤其是服務(wù)器端)?,F(xiàn)階段雖只實(shí)現(xiàn)了試卷的客觀題部分,但已具有用戶注冊(cè),、多用戶同時(shí)在線考試,、動(dòng)態(tài)隨機(jī)出題、時(shí)間控制,、自動(dòng)判卷,,試題錄入、修改題庫,、用戶管理,、科目管理、管理員管理,、分?jǐn)?shù)管理等重要功能,,也就是說實(shí)現(xiàn)了真正的無紙化考試,,滿足任何授權(quán)的考生隨時(shí)隨地考試并迅速獲得成績(jī),同時(shí)也大大減輕了教師出題,、出題和判卷等繁重的工作量,。
第一章 系統(tǒng)設(shè)計(jì)相關(guān)原理
該在線考試系統(tǒng)主要采用ASP、HTML,、Access數(shù)據(jù)庫,、VBScript、SQL等技術(shù)和工具,,整體設(shè)計(jì)遵循軟件工程的方法,,經(jīng)過需求分析、總體設(shè)計(jì),、文檔和代碼的編制,、模塊測(cè)試和系統(tǒng)實(shí)現(xiàn)幾個(gè)階段。下面就對(duì)這幾種技術(shù)和方法做一個(gè)概述,。
1.1 ASP技術(shù)介紹
Microsoft Active Server Pages 即我們所稱的ASP,,其實(shí)是一套微軟開發(fā)的服務(wù)器端腳本環(huán)境。Active Server Page 是創(chuàng)建動(dòng)態(tài)網(wǎng)頁的一個(gè)很好的工具,,它起一種編程語言的作用,,可以利用它編寫動(dòng)態(tài)產(chǎn)生HTML的程序代碼。因此,,只要用戶瀏覽Web站點(diǎn)并請(qǐng)求一個(gè)ASP 頁,,Web服務(wù)器就可以處理相應(yīng)的ASP代碼,生成HTML代碼,,然后將它傳遞到用戶瀏覽器并顯示出網(wǎng)頁,。ASP內(nèi)含于IIS3.0和4.0之中,通過 ASP我們可以結(jié)合HTML網(wǎng)頁、ASP指令和ActiveX元件建立動(dòng)態(tài),、交互且高效的WEB服務(wù)器應(yīng)用程序,。有了ASP就不必?fù)?dān)心客戶的瀏覽器是否能運(yùn)行所編寫的代碼,因?yàn)樗械某绦蚨紝⒃诜?wù)器端執(zhí)行,,包括所有嵌在普通HTML中的腳本程序,。當(dāng)程序執(zhí)行完畢后,服務(wù)器僅將執(zhí)行的結(jié)果返回給客戶瀏覽器,,這樣也就減輕了客戶端瀏覽器的負(fù)擔(dān),,大大提高了交互的速度。以下羅列了ASP所獨(dú)具的一些特點(diǎn):
1.使用VBScript ,、JScript等簡(jiǎn)單易懂的腳本語言,,結(jié)合HTML代碼,即可快速地完成網(wǎng)站的應(yīng)用程序,。
2.無須編譯,,容易編寫,,可在服務(wù)器端直接執(zhí)行。
3.使用普通的文本編輯器,,如Windows的記事本,,即可進(jìn)行編輯設(shè)計(jì)。
4.與瀏覽器無關(guān),用戶端只要使用可執(zhí)行HTML碼的瀏覽器,,即可瀏覽ASP所設(shè)計(jì)的網(wǎng)頁內(nèi)容,。ASP所使用的腳本語言(VBScript 、Jscript)均在WEB服務(wù)器端執(zhí)行,,用戶端的瀏覽器不需要能夠執(zhí)行這些腳本語言,。
5.ASP 能與任何ActiveX scripting語言相容。除了可使用VBScript或JScript語言來設(shè)計(jì)外,,還通過plug-in的方式,,使用由第三方所提供的其他腳本語言,譬如REXX,、Perl,、Tcl等。腳本引擎是處理腳本程序的COM(Component Object Model)物件,。
6.ASP的源程序,,不會(huì)被傳到客戶瀏覽器,因而可以避免所寫的源程序被他人剽竊,,也提高了程序的安全性,。
7.可使用服務(wù)器端的腳本來產(chǎn)生客戶端的腳本。
8.物件導(dǎo)向(Object-oriented),。
9.ActiveX Server Components(ActiveX服務(wù)器元件)具有無限可擴(kuò)充性,。可以使用Visual Basic ,、Java 、Visual C++ ,、COBOL等編程語言來編寫你所需要的ActiveX Server Component,。
10.另外,ASP技術(shù)的處理速度相當(dāng)快,,并且其安全性也很高,。ASP最重要的優(yōu)點(diǎn)是能夠建立對(duì)諸如時(shí)間、地點(diǎn),、用戶標(biāo)志,、以前的選擇和活動(dòng)等因素敏感的頁面。換句話說,,可針對(duì)每個(gè)用戶的個(gè)別需求,,用ASP定制網(wǎng)頁,,能夠滿足用戶的各種需求。
總之,,ASP包含三方面含義:
1.Active:ASP 使用了微軟的ActiveX技術(shù),。ActiveX(COM)技術(shù)是現(xiàn)在Microsoft軟件的重要基礎(chǔ)。它采用封裝對(duì)象,,程序調(diào)用對(duì)象的技術(shù),,簡(jiǎn)化編程,加強(qiáng)程序間合作,。ASP本身封裝了一些基本組件和常用組件,,有很多公司也開發(fā)了很多實(shí)用組件。只要你可以在服務(wù)器上安裝這些組件,,通過訪問組件,,你就可以快速、簡(jiǎn)易地建立自己的WEB應(yīng)用,。
2.Server:ASP運(yùn)行在服務(wù)器端,。這樣就不必?fù)?dān)心瀏覽器是否支持ASP所使用的編程語言。ASP 的編程語言可以是VBSCRIPT和JSCRIPT,。VBSCRIPT是VB的一個(gè)簡(jiǎn)集,,會(huì)VB的人可以很方便的快速上手。然而Netscape瀏覽器不支持客戶端的VBSCRIPT,,所以最好不要在客戶端使用VBSCRIPT,。而在服務(wù)器端,則無需考慮瀏覽器的支持問題,。Netscape瀏覽器也可以正常顯示ASP頁面,。
3.Pages:ASP返回標(biāo)準(zhǔn)的HTML頁面,可以正常地在常用的瀏覽器中顯示,。瀏覽者查看頁面源文件時(shí),,看到的是ASP生成的HTML代碼,而不是ASP程序代碼,。這樣就可以防止別人抄襲程序,。
由此可以看出,ASP是在IIS下開發(fā)WEB應(yīng)用的一種簡(jiǎn)單,、方便的編程工具,。在了解了VBSCRIPT的基本語法后,只需要清楚各個(gè)組件的用途,、屬性,、方法,就可以輕松編寫出自己的ASP系統(tǒng),。
運(yùn)行 ASP 所需的環(huán)境如下:
☆Microsoft Internet Information Server version 3.0/4.0 on Windows NT Server
☆Microsoft Peer Web Services Version 3.0 on Windows NT Workstation
☆Microsoft Personal Web Server on Windows 95/98
與一般的程序不同,,ASP程序無須編譯,。ASP程序的控制部份,是使用VBScript,、JScript等腳本語言來設(shè)計(jì)的,,當(dāng)執(zhí)行ASP程序時(shí),腳本程序?qū)⒁徽酌畎l(fā)送給腳本解釋器(即腳本引擎),,由腳本解釋器進(jìn)行翻譯并將其轉(zhuǎn)換成服務(wù)器所能執(zhí)行的命令,。當(dāng)然,同其他編程語言一樣,,ASP程序的編寫也遵循一定的規(guī)則,,如果你想使用你所喜愛的腳本語言編寫ASP程序,那么你的服務(wù)器上必須要有能解釋這種腳本語言的腳本解釋器,。當(dāng)你安裝ASP時(shí),,系統(tǒng)提供了兩種腳本語言:VBSrcipt和JScript,而VBScript則被作為系統(tǒng)默認(rèn)的腳本語言,。
ASP程序其實(shí)是以擴(kuò)展名為.asp的純文本形式存在于WEB服務(wù)器上的,,可以用任何文本編輯器打開它,ASP程序中可以包含純文本,、HTML標(biāo)記以及腳本命令,。只需將.asp程序放在Web服務(wù)器的虛擬目錄下(該目錄必須要有可執(zhí)行權(quán)限),就可以通過WWW的方式訪問ASP程序了,。要學(xué)好ASP程序的設(shè)計(jì),,必須掌握腳本的編寫,那么究竟什么是腳本呢,?其實(shí)腳本是由一系列的腳本命令所組成的,,如同一般的程序,腳本可以將一個(gè)值賦給一個(gè)變量,,可以命令Web服務(wù)器發(fā)送一個(gè)值到客戶瀏覽器,,還可以將一系列命令定義成一個(gè)過程。要編寫腳本,,你必須要熟悉至少一門腳本語言,,如VBScript。腳本語言是一種介于HTML和諸如JAVA,、Visual Basic、C++等編程語言之間的一種特殊的語言,,盡管它更接近后者,,但它卻不具有編程語言復(fù)雜、嚴(yán)謹(jǐn)?shù)恼Z法和規(guī)則,。如前所述ASP所提供的腳本運(yùn)行環(huán)境可支持多種腳本語言,,譬如:JScript,、REXX、PERL等等,,這無疑給ASP程序設(shè)計(jì)者提供了廣泛的發(fā)揮余地,。ASP的出現(xiàn)使得廣大Web設(shè)計(jì)者不必在為客戶瀏覽器是否支持而擔(dān)心,實(shí)際上就算在同一個(gè).asp文件中使用不同的腳本語言,,都無須為此擔(dān)憂,,因?yàn)樗械囊磺卸紝⒃诜?wù)器端進(jìn)行,客戶瀏覽器得到的只是一個(gè)程序執(zhí)行的結(jié)果,,而你也只需在文件中聲明使用不同的腳本語言即可,。
ASP的對(duì)象和組件:
1.ASP有7個(gè)固有對(duì)象
這7個(gè)固有對(duì)象分別是Request、Response,、Server,、Application、Session,、ASPError和ObjectContext,。
Request對(duì)象用來處理用戶做出的請(qǐng)求,就是處理用戶要求瀏覽器查看特定的網(wǎng)頁或Web應(yīng)用時(shí)做出的請(qǐng)求,。此請(qǐng)求可以HTML的形式輸入或僅以URL的形式作出,。Response對(duì)象用來處理從Web服務(wù)器向用戶發(fā)送信息并對(duì)此信息進(jìn)行控制。
Serve對(duì)象用來代表服務(wù)器自身,。因此它提供幾個(gè)與Web服務(wù)器可能要完成的任務(wù)相關(guān)的常用功能,,諸如建立新對(duì)象和設(shè)置腳本的超時(shí)特性等。還有通過將不合法字符轉(zhuǎn)化為合法字符,,把字符串轉(zhuǎn)換為URL和HTML正確的使用格式的方法,。
Application對(duì)象用來代表應(yīng)用,可用它來管理諸如應(yīng)用目錄這一類的東西,。
Session對(duì)象用來代表用戶會(huì)話,,并存儲(chǔ)該會(huì)話的信息??衫肧ession對(duì)象來管理如Web服務(wù)器在用戶“請(qǐng)求”之間等待的時(shí)間等,。
ObjectContext對(duì)象用來管理事務(wù)處理。它目前已經(jīng)集成到Windows2000操作系統(tǒng)中了,。它包含了所有ASP其他對(duì)象,,可通過ObjectContext引用ASP的每個(gè)對(duì)象。
ASPError對(duì)象包含ASP腳本或asp.dll本身產(chǎn)生的任何錯(cuò)誤的詳細(xì)內(nèi)容,。
2.Microsoft Data Access Component
MDAC 作為操作系統(tǒng)的組成部分的組件,,與ASP一起提供。此組件中包含一組稱為ActiveX Data Object(ADO)的對(duì)象,他們對(duì)于查看不同平臺(tái)上的各種數(shù)據(jù)(數(shù)據(jù)庫,、表單,、文本文件)是必不可少的。ADO主要有3個(gè)對(duì)象,,分別是 Connection,、Command和Recordset。
Connection對(duì)象就是使ADO與數(shù)據(jù)庫之間建立一個(gè)通道,,也就是實(shí)現(xiàn)與數(shù)據(jù)庫的連接,。
Command對(duì)象就是對(duì)數(shù)據(jù)庫進(jìn)行發(fā)號(hào)施令,比如建立新的索引,,執(zhí)行查詢等,,它可以通過標(biāo)準(zhǔn)的SQL數(shù)據(jù)庫操作語言得以實(shí)現(xiàn)。
Recordset對(duì)象是一個(gè)數(shù)據(jù)記錄集,,它包含了我們檢索出來的記錄數(shù)據(jù),,通過它可以直接對(duì)數(shù)據(jù)庫進(jìn)行修改。
3.活動(dòng)服務(wù)器組件
活動(dòng)服務(wù)器組件是與ASP一起免費(fèi)帶來的組件或DLL,,他們有著廣泛的用途,。主要包括AD Rotator、Browser Capabilities,、Content Link,、Content Rotator、Counters,、logging Utility,、MyInfo、Page Counter,、permission Checker,、tools等組件。由于本次設(shè)計(jì)用到的不多,在此就不詳細(xì)介紹了
4.ASP腳本對(duì)象
他們分別是Dictionary,、FileSystemObject和TextStream.由于本設(shè)計(jì)用到的也不多,在此就不詳細(xì)介紹了,。
1.2 SQL語句介紹
SQL 全稱是“結(jié)構(gòu)化查詢語言(Structured Query Language)”,最早的是IBM的圣約瑟研究實(shí)驗(yàn)室為其關(guān)系數(shù)據(jù)庫管理系統(tǒng)SYSTEM R開發(fā)的一種查詢語言,,它的前身是SQUARE語言,。SQL語言結(jié)構(gòu)簡(jiǎn)潔,功能強(qiáng)大,,簡(jiǎn)單易學(xué),,所以自從IBM公司1981年推出以來,SQL語言,,得到了廣泛的應(yīng)用,。如今無論是像Oracle ,Sybase,Informix,SQL server這些大型的數(shù)據(jù)庫管理系統(tǒng),,還是像Visual Foxporo,PowerBuilder這些微機(jī)上常用的數(shù)據(jù)庫開發(fā)系統(tǒng),都支持SQL語言作為查詢語言,。
Structured Query Language包含4個(gè)部分:
☆數(shù)據(jù)查詢語言DQL-Data Query Language SELECT
☆據(jù)操縱語言DQL-Data Manipulation Language INSERT, UPDATE, DELETE
☆數(shù)據(jù)定義語言DQL-Data Definition Language CREATE, ALTER, DROP
☆數(shù)據(jù)控制語言DQL-Data Control Language COMMIT WORK, ROLLBACK WORK
1.2.1 SQL的優(yōu)點(diǎn)
SQL廣泛地被采用正說明了它的優(yōu)點(diǎn)。它使全部用戶,,包括應(yīng)用程序員,、DBA管理員和終端用戶受益非淺。
1.非過程化語言
SQL 是一個(gè)非過程化的語言,,因?yàn)樗淮翁幚硪粋€(gè)記錄,,對(duì)數(shù)據(jù)提供自動(dòng)導(dǎo)航。SQL允許用戶在高層的數(shù)據(jù)結(jié)構(gòu)上工作,,而不對(duì)單個(gè)記錄進(jìn)行操作,,可操作記錄集。所有SQL 語句接受集合作為輸入,,返回集合作為輸出,。SQL的集合特性允許一條SQL語句的結(jié)果作為另一條SQL語句的輸入。 SQL不要求用戶指定對(duì)數(shù)據(jù)的存放方法,。這種特性使用戶更易集中精力于要得到的結(jié)果,。所有SQL語句使用查詢優(yōu)化器,它是RDBMS的一部分,,由它決定對(duì)指定數(shù)據(jù)存取的最快速度的手段,。查詢優(yōu)化器知道存在什么索引,哪兒使用合適,,而用戶從不需要知道表是否有索引,,表有什么類型的索引。
2.統(tǒng)一的語言
SQL可用于所有用戶的DB活動(dòng)模型,,包括系統(tǒng)管理員,、數(shù)據(jù)庫管理員、 應(yīng)用程序員,、決策支持系統(tǒng)人員及許多其它類型的終端用戶,。基本的SQL 命令只需很少時(shí)間就能學(xué)會(huì),,最高級(jí)的命令在幾天內(nèi)便可掌握,。 SQL為許多任務(wù)提供了命令,包括:
☆查詢數(shù)據(jù)
☆在表中插入,、修改和刪除記錄
☆建立,、修改和刪除數(shù)據(jù)對(duì)象
控制對(duì)數(shù)據(jù)和數(shù)據(jù)對(duì)象的存取
☆保證數(shù)據(jù)庫一致性和完整性
以前的數(shù)據(jù)庫管理系統(tǒng)為上述各類操作提供單獨(dú)的語言,而SQL將全部任務(wù)統(tǒng)一在一種語言中,。
3.是所有關(guān)系數(shù)據(jù)庫的公共語言
由于所有主要的關(guān)系數(shù)據(jù)庫管理系統(tǒng)都支持SQL語言,,用戶可將使用SQL的技能從一個(gè)RDBMS轉(zhuǎn)到另一個(gè)。所有用SQL編寫的程序都是可以移植的。SQL 是PostgreSQL(和大多數(shù)其它關(guān)系型數(shù)據(jù)庫)用做查詢語言的語言,。它是可以移植的,,并且容易學(xué)習(xí)使用。但是所有SQL語句都必須由數(shù)據(jù)庫服務(wù)器獨(dú)立地執(zhí)行,。這就意味著客戶端應(yīng)用必須把每條查詢發(fā)送到數(shù)據(jù)庫服務(wù)器,,等待它處理這個(gè)查詢,接收結(jié)果,,做一些運(yùn)算,,然后給服務(wù)器發(fā)送另外一條查詢。所有這些東西都會(huì)產(chǎn)生進(jìn)程間通訊,,并且如果客戶端在另外一臺(tái)機(jī)器上甚至還會(huì)導(dǎo)致網(wǎng)絡(luò)開銷,。如果使用了 PL/pgSQL,那么可以把一塊運(yùn)算和一系列查詢?cè)跀?shù)據(jù)庫服務(wù)器里面組成一個(gè)塊,,這樣就擁有了過程語言的力量并且簡(jiǎn)化SQL的使用,,因而節(jié)約了大量的時(shí)間,因?yàn)橛貌恢冻隹蛻舳?服務(wù)器通訊的過熱,。通過使用PL/pgSQL,,應(yīng)用可以獲得可觀的性能提升。
1.2.2 SQL的使用
1.ASP與Access數(shù)據(jù)庫連接:
<%@language=VBscript%>
<%
dimconn,mdbfile
mdbfile=server.mappath("數(shù)據(jù)庫名稱.mdb")
setconn=server.createobject("adodb.connection")
conn.open"driver={microsoftaccessdriver
(*.mdb)};uid=admin;pwd=數(shù)據(jù)庫密碼;dbq="&mdbfile
%>
2.ASP與SQL數(shù)據(jù)庫連接:
<%@language=VBscript%>
<%
dimconn
set conn=server.createobject("ADODB.connection")
conn.open"PROVIDER=SQLOLEDB;DATA
SOURCE=SQL服務(wù)器名稱或IP地址;UID=sa;PWD=數(shù)據(jù)庫密碼;DATABASE=數(shù)據(jù)庫名稱
%>
建立記錄集對(duì)象:
setrs=server.createobject("adodb.recordset")
rs.openSQL語句,conn,3,2
3.SQL常用命令使用方法:
(1)數(shù)據(jù)記錄篩選:
sql="select*from數(shù)據(jù)表where字段名=字段值orderby字段名[desc]"
sql="select*from數(shù)據(jù)表where字段名like'%字段值%'orderby字段名[desc]"
sql="selecttop10*from數(shù)據(jù)表where字段名orderby字段名[desc]"
sql="select*from數(shù)據(jù)表where字段名in('值1','值2','值 3')"
sql="select*from數(shù)據(jù)表where字段名between值1and值2"
(2)更新數(shù)據(jù)記錄:
sql="update數(shù)據(jù)表set字段名=字段值where條件表達(dá)式"
sql="update數(shù)據(jù)表set字段1=值1,字段2=值2……字段n=值nwhere條件表達(dá)式
(3)刪除數(shù)據(jù)記錄:
sql="deletefrom數(shù)據(jù)表where條件表達(dá)式"
sql="deletefrom數(shù)據(jù)表"(將數(shù)據(jù)表所有記錄刪除)
(4)添加數(shù)據(jù)記錄:
sql="insertinto數(shù)據(jù)表(字段1,字段2,字段3…)values(值1,值2,值3…)"
sql="insertinto目標(biāo)數(shù)據(jù)表select*from源數(shù)據(jù)表"(把源數(shù)據(jù)表的記錄添加到目標(biāo)數(shù)據(jù)表)
(5)數(shù)據(jù)記錄統(tǒng)計(jì)函數(shù):
AVG(字段名)得出一個(gè)表格欄平均值
COUNT(*¦字段名)對(duì)數(shù)據(jù)行數(shù)的統(tǒng)計(jì)或?qū)δ骋粰谟兄档臄?shù)據(jù)行數(shù)統(tǒng)計(jì)
MAX(字段名)取得一個(gè)表格欄最大的值
MIN(字段名)取得一個(gè)表格欄最小的值
SUM(字段名)把數(shù)據(jù)欄的值相加
引用以上函數(shù)的方法:
sql="selectsum(字段名)as別名from數(shù)據(jù)表where條件表達(dá)式"
setrs=conn.excute(sql)
用rs("別名")獲取統(tǒng)的計(jì)值,,其它函數(shù)運(yùn)用同上,。
(5)數(shù)據(jù)表的建立和刪除:
CREATETABLE數(shù)據(jù)表名稱(字段1類型1(長(zhǎng)度),字段2類型2(長(zhǎng)度)……)
DROPTABLE數(shù)據(jù)表名稱(永久性刪除一個(gè)數(shù)據(jù)表)
4.記錄集對(duì)象的方法:
rs.movenext將記錄指針從當(dāng)前的位置向下移一行
rs.moveprevious將記錄指針從當(dāng)前的位置向上移一行
rs.movefirst將記錄指針移到數(shù)據(jù)表第一行
rs.movelast將記錄指針移到數(shù)據(jù)表最后一行
rs.absoluteposition=N將記錄指針移到數(shù)據(jù)表第N行
rs.absolutepage=N將記錄指針移到第N頁的第一行
rs.pagesize=N設(shè)置每頁為N條記錄
rs.pagecount根據(jù)pagesize的設(shè)置返回總頁數(shù)
rs.recordcount返回記錄總數(shù)
rs.bof返回記錄指針是否超出數(shù)據(jù)表首端,true表示是,,false為否
rs.eof返回記錄指針是否超出數(shù)據(jù)表末端,,true表示是,false為否
rs.delete刪除當(dāng)前記錄,,但記錄指針不會(huì)向下移動(dòng)
rs.addnew添加記錄到數(shù)據(jù)表末端
rs.update更新數(shù)據(jù)表記錄
1.3 VBScript介紹
Microsoft Visual Basic Scripting Edition是程序開發(fā)語言Visual Basic家族的最新成員,,它將靈活的Script應(yīng)用于更廣泛的領(lǐng)域,包括Microsoft Internet Explorer中的 Web 客戶機(jī) Script 和 Microsoft Internet Information Server 中的 Web 服務(wù)器 Script,。
VBScript 使用ActiveX™ Script與宿主應(yīng)用程序?qū)υ?。使用ActiveX Script,瀏覽器和其他宿主應(yīng)用程序不再需要每個(gè)Script部件的特殊集成代碼,。ActiveX Script使宿主可以編譯Script,、獲取和調(diào)用入口點(diǎn)及管理開發(fā)者可用的命名空間。通過ActiveX Script,,語言廠商可以建立標(biāo)準(zhǔn)Script運(yùn)行時(shí)語言,。Microsoft將提供VBScript的運(yùn)行時(shí)支持。Microsoft正在與多個(gè) Internet組一起定義ActiveX Script標(biāo)準(zhǔn)以使Script引擎可以互換,。ActiveX Script可用在Microsoft® Internet Explorer和Microsoft® Internet Information Server中,。
VBScript只有一種數(shù)據(jù)類型,,稱為Variant。Variant 是一種特殊的數(shù)據(jù)類型,,根據(jù)使用的方式,,它可以包含不同類別的信息。因?yàn)閂ariant是VBScript中唯一的數(shù)據(jù)類型,,所以它也VBScript 中所有函數(shù)的返回值的數(shù)據(jù)類型,。最簡(jiǎn)單的Variant可以包含數(shù)字或字符串信息。Variant用于數(shù)字上下文中時(shí)作為數(shù)字處理,,用于字符串上下文中時(shí)作為字符串處理。這就是說,,如果使用看起來象是數(shù)字的數(shù)據(jù),,則VBScript會(huì)假定其為數(shù)字并以適用于數(shù)字的方式處理。與此類似,,如果使用的數(shù)據(jù)只可能是字符串,,則VBScript將按字符串處理。當(dāng)然,,也可以將數(shù)字包含在引號(hào)("")中使其成為字符串,。除簡(jiǎn)單數(shù)字或字符串以外,Variant可以進(jìn)一步區(qū)分?jǐn)?shù)值信息的特定含義,。例如使用數(shù)值信息表示日期或時(shí)間,。此類數(shù)據(jù)在與其他日期或時(shí)間數(shù)據(jù)一起使用時(shí),結(jié)果也總是表示為日期或時(shí)間,。當(dāng)然,,從 Boolean值到浮點(diǎn)數(shù),數(shù)值信息是多種多樣的,。Variant包含的數(shù)值信息類型稱為子類型,。大多數(shù)情況下,可將所需的數(shù)據(jù)放進(jìn)Variant中,,而 Variant也會(huì)按照最適用于其包含的數(shù)據(jù)的方式進(jìn)行操作,。聲明變量的一種方式是使用Dim語句、Public語句和Private語句在Script 中顯式聲明變量,。
另一種方式是通過直接在Script中使用變量名這一簡(jiǎn)單方式隱式聲明變量,。這通常不是一個(gè)好習(xí)慣,因?yàn)檫@樣有時(shí)會(huì)由于變量名被拼錯(cuò)而導(dǎo)致在運(yùn)行Script時(shí)出現(xiàn)意外的結(jié)果,。因此,,最好使用Option Explicit語句顯式聲明所有變量。
1.過程
在VBScript中,,過程被分為兩類:Sub過程和Function過程,。
(1)Sub過程
Sub過程是包含在Sub和End Sub語句之間的一組VBScript語句,,執(zhí)行操作但不返回值。Sub過程可以使用參數(shù)(由調(diào)用過程傳遞的常數(shù),、變量或表達(dá)式),。
(2)Function過程
Function 過程是包含在Function和End Function語句之間的一組VBScript語句。Function過程與Sub過程類似,,但是Function過程可以返回值,。Function過程可以使用參數(shù)(由調(diào)用過程傳遞的常數(shù)、變量或表達(dá)式),。如果Function過程無任何參數(shù),,則Function語句必須包含空括號(hào)()。 Function過程通過函數(shù)名返回一個(gè)值,,這個(gè)值是在過程的語句中賦給函數(shù)名的,。Function 返回值的數(shù)據(jù)類型總是Variant。
2.VBScript中可使用下列循環(huán)語句:
☆Do...Loop:當(dāng)(或直到)條件為True時(shí)循環(huán),。
需求分析
要實(shí)現(xiàn)一個(gè)軟件系統(tǒng),,首先應(yīng)該進(jìn)行需求分析,這樣才能令設(shè)計(jì)出的軟件滿足用戶的各項(xiàng)功能,。下面就對(duì)在線考試系統(tǒng)的設(shè)計(jì)進(jìn)行需求分析,。
2.1 系統(tǒng)需要解決的主要問題
首先,因?yàn)榭荚囀敲嫦蛱囟ǖ哪承?duì)象的,,所以考試者進(jìn)入系統(tǒng)應(yīng)該進(jìn)行身份驗(yàn)證,。考試者進(jìn)入考試系統(tǒng)后,,應(yīng)該能根據(jù)自己的需要選擇考試科目,,所以該系統(tǒng)還應(yīng)具有考試科目選擇的功能。在線考試于一般的單機(jī)考試是不同的,。鑒于考試環(huán)境一般為機(jī)房,,考試者之間的距離很近,為了在線考試做到規(guī)范,,對(duì)于每個(gè)應(yīng)試者來說,,試卷的試題和題量都應(yīng)是相同的,但試題并不相同,。在線考試基于網(wǎng)絡(luò)環(huán)境,,試卷應(yīng)該從服務(wù)器的數(shù)據(jù)庫隨機(jī)抽取試題后動(dòng)態(tài)生成的。另外,,系統(tǒng)還應(yīng)該對(duì)考試時(shí)間進(jìn)行控制,,時(shí)間到了會(huì)要求考試者交卷??荚囌哌x擇答案提交后,,應(yīng)該由計(jì)算機(jī)自動(dòng)判卷,,得到成績(jī)后顯示出來??荚囃戤吅?,可以返回登錄界面或繼續(xù)考試。此外,,應(yīng)該能夠方便,、快捷的對(duì)在線考試系統(tǒng)管理,此外,,用戶還應(yīng)能進(jìn)行遠(yuǎn)程注冊(cè),。
2.2 系統(tǒng)應(yīng)該具備的基本功能
☆用戶注冊(cè):用戶可以進(jìn)行注冊(cè),,然后登錄,。
☆用戶信息的管理:管理員可以增刪用戶
☆試題模型設(shè)置:設(shè)置各科目試題的每種題型的數(shù)量和分值,。
☆試題庫管理:分科目,對(duì)單選,、多選兩種題型試題庫的管理,使試題的增刪,、編輯更為簡(jiǎn)便,。
☆試卷生成:可以指定試卷的各題型的數(shù)量,從試題庫里隨機(jī)抽取試題生成一份原始試卷,。
☆在線考試:系統(tǒng)嚴(yán)格控制整個(gè)考試過程,,實(shí)行時(shí)間的監(jiān)控與權(quán)限的控制,考生需要在限定的考試時(shí)間內(nèi)交卷,。
☆計(jì)算機(jī)自動(dòng)閱卷:本系統(tǒng)只考慮客觀題,,要求計(jì)算機(jī)能自動(dòng)閱卷,然后馬上顯示出考生分?jǐn)?shù),。
☆成績(jī)查閱:考生考完以后,,管理員應(yīng)該能對(duì)所有紀(jì)錄進(jìn)行查詢,并應(yīng)該可以刪除指定紀(jì)錄,。
除了實(shí)現(xiàn)上述功能以外,,在線考試系統(tǒng)還應(yīng)該具有友好、簡(jiǎn)潔的界面,,安全性要高,,穩(wěn)定性要強(qiáng),能夠滿足100人以上同時(shí)及進(jìn)行在線考試,。
系統(tǒng)總體設(shè)計(jì)
3.1基本簡(jiǎn)介
該系統(tǒng)是專門用于用戶注冊(cè),、登錄、參加在線考試以及管理員進(jìn)行試題錄入,、修改,、刪除,、成績(jī)查詢、管理用戶的ASP應(yīng)用程序,。它應(yīng)該具有開放性,、方便性和靈活性。管理員不僅可以輕松地向題庫添加,、修改和查詢?cè)囶},,而且還可以自動(dòng)新增科目并建立相應(yīng)的數(shù)據(jù);它還允許用戶根據(jù)自己的需求,,選取考試科目,。考生進(jìn)行有效的身份驗(yàn)證登錄后,,選擇考試科目,,并要求在規(guī)定的時(shí)間內(nèi)進(jìn)行答題,當(dāng)達(dá)到規(guī)定的時(shí)間后,,系統(tǒng)將自動(dòng)予以提示,。一旦考生做完交卷后便能立即看到自己的考試成績(jī),并且其分?jǐn)?shù)將被記入庫中以供審核和查閱,;另外,,還可完全由計(jì)算機(jī)自動(dòng)靈活、隨機(jī)的抽取試題庫中的各類試題組成各種形式的試卷,,其內(nèi)容會(huì)隨著庫中試題的改變而改變,,而且,不同的考生生成的試題是不同的,。
用戶可以是學(xué)校等單位的教師及學(xué)生和企事業(yè)單位的培訓(xùn)部門(因企事業(yè)單位每年要對(duì)員工進(jìn)行素質(zhì),、安全教育與技能等方面的培訓(xùn)及考試等)。
3.2 運(yùn)行環(huán)境與系統(tǒng)結(jié)構(gòu)
為了保證系統(tǒng)運(yùn)行的效率和可靠性,,系統(tǒng)服務(wù)器端應(yīng)具有較高的軟硬件配置,,客戶端的要求不是很高。此應(yīng)用程序可廣泛運(yùn)行于國際互聯(lián)網(wǎng)即Internet,,也可適用于內(nèi)部的局域網(wǎng),。其運(yùn)行要求如下:
☆軟件環(huán)境:
客戶端: Windows95/98,Internet Explorer(IE)等
服務(wù)器端:Windows NT/Windows2000,,Internet Information Server (IIS)4.0及其以上版本,,IE等;或者Windows98,,Personal Web Server(PWS),,IE等。
數(shù)據(jù)庫:采用access,,運(yùn)行于服務(wù)器端,。
☆硬件環(huán)境:
服務(wù)器 CPU:PIII 500以上 ,內(nèi)存:256M以上
客戶機(jī) CPU:P200MMX以上,,內(nèi)存:32M以上
3.2 系統(tǒng)結(jié)構(gòu)圖
根據(jù)需求分析,在線考試系統(tǒng)的結(jié)構(gòu)圖如下:
圖3-1 在線考試系統(tǒng)結(jié)構(gòu)圖
3.3 詳細(xì)設(shè)計(jì)
詳細(xì)設(shè)計(jì)是整個(gè)設(shè)計(jì)過程中,,最重要的步驟之一,。下面就分如下幾個(gè)部分對(duì)系統(tǒng)進(jìn)行詳細(xì)設(shè)計(jì):(1)試題設(shè)計(jì)(2)數(shù)據(jù)庫中表的設(shè)計(jì)(3)用戶、管理員權(quán)限(4)功能模塊詳細(xì)設(shè)計(jì)(5)在線考試系統(tǒng)考試模塊框圖
3.3.1試題設(shè)計(jì)
鑒于主觀題的主觀性,,目前無法實(shí)現(xiàn)系統(tǒng)自動(dòng)判卷,,所以本系統(tǒng)只作客觀題部分。一般情況下,,單選題往往在四個(gè)供選的答案A,、B、C,、D中選擇唯一正確的答案,;多選題是在供選答案中有多個(gè)選擇;而判斷題實(shí)質(zhì)上就相當(dāng)于有兩個(gè)選項(xiàng)的單選題,。因而,,本系統(tǒng)中所涉及的單選題和多選題跟過去的大體相同,由于時(shí)間的關(guān)系,,判斷題部分沒有做,。并且假設(shè)多選題一般情況下也是最多提供四個(gè)備選答案,標(biāo)準(zhǔn)答案至少有一個(gè),。故各題型的樣題設(shè)計(jì)如下:
單選題:password的意思是: A、密碼 B,、經(jīng)過 C,、單詞
D、通路
正確答案為A
多選題:下面的表達(dá)式為真的有:A,、1>2 B、7%5=2
C,、sin(30)=1/2 D,、Cint(7/5)=1
正確答案為B,、C,、D
3.3.2數(shù)據(jù)庫中表的設(shè)計(jì)
1.question表結(jié)構(gòu)
通常,每一類型的試題都應(yīng)有一個(gè)表結(jié)構(gòu),。但考慮到目前系統(tǒng)存貯空間可以很大,也為了更加方便,。我們采用把全部試題集中在一起的方案來建立數(shù)據(jù)表,,每道客觀題均有四個(gè)備選答案項(xiàng),每個(gè)試題均具有題型,、所屬科目等數(shù)據(jù)段表示其屬性,。字段名一般是相應(yīng)的英文單詞,。這樣,查詢起來較方便,,會(huì)節(jié)約時(shí)間,也不致于造成數(shù)據(jù)十分雜亂等,。詳細(xì)設(shè)計(jì)如下表所示:
表3-1 question 表
字段名稱 類型 說明
Haveselect 數(shù)字 常整型
ID 自動(dòng)編號(hào) 常整型,遞增,,主鍵
Question 文本 字段大小200
A 文本 字段大小50
B 文本 字段大小50
C 文本 字段大小50
D 文本 字段大小50
Answer 文本 字段大小50
Type 文本 字段大小50
subjectname 文本 字段大小50
各字段說明:
(1)haveselect字段代表在隨機(jī)選題時(shí)是否已經(jīng)被某用戶選過,,類型為數(shù)字,。
(2)ID是問題的id號(hào),,用來唯一標(biāo)志該問題,,把它設(shè)為主鍵,類型為自動(dòng)編號(hào),。
Question字段為問題內(nèi)容,,類型為文本,。
(4)A字段代表選項(xiàng)A的內(nèi)容
(5)B字段代表選項(xiàng)B的內(nèi)容
(6)C字段代表選項(xiàng)C的內(nèi)容
(7)D字段代表選項(xiàng)D的內(nèi)容
(8)Answer字段表示答案選項(xiàng)
(9)Type字段表示試題類型
(10)subjectname字段代表試題所屬科目名稱
2.subject表結(jié)構(gòu)
表3-2 subject表
字段名稱 類型 說明
Multiper 數(shù)字 常整型
Singleper 數(shù)字 常整型
multinumber 數(shù)字 常整型
singlenumber 數(shù)字 常整型
subjectname 文本 字段大小50
Testtime 數(shù)字 常整型
Id 自動(dòng)編號(hào) 常整型,,遞增,,主鍵
各字段說明:
(1)multiper字段代表在某考試科目的考試題中每個(gè)多選題的分值。
(2)singleper字段代表在某考試科目的考試題中每個(gè)單選題的分值,。
(3)multinumber字段為某科的多選題題量,。
(4)singlenumber字段為某科的多選題題量,。
(5)subjectname字段代表科目名稱,。
(6)testtime字段代表某科的考試總時(shí)間。
(7)id字段代表科目的id號(hào),。
3.score表結(jié)構(gòu)
表3-3 score表
字段名稱 類型 說明
Studentname 文本 字段大小50
Subjectname 文本 字段大小50
Score 數(shù)字 常整型
Id 自動(dòng)編號(hào) 常整型,,遞增,主鍵
Endtime 日期/時(shí)間
各字段說明:
(1)studentname字段代表在某次考試記錄中學(xué)生的名字,。
(2)subjectname字段代表在某次考試紀(jì)錄中考試科目名,。
(3)score字段為某次考試紀(jì)錄中考試分?jǐn)?shù)。
(4)id字段為某次考試紀(jì)錄的標(biāo)志號(hào),。
(5)endtime字段代表考試的結(jié)束時(shí)間,。
4.student表結(jié)構(gòu)
表3-4 student表
字段名稱 類型 說明
Studentname 文本 字段大小50
Studentpassword 文本 字段大小50
Id 自動(dòng)編號(hào) 常整型,,遞增,主鍵
各字段說明:
(1)studentname字段代表學(xué)生的名字,。
(2)studentpassword字段代表密碼,。
(3)id字段為學(xué)生的標(biāo)志號(hào)。
5.admin表結(jié)構(gòu)
表3-5 admin表
字段名稱 類型 說明
Name 文本 字段大小50
Password 文本 字段大小50
Id 自動(dòng)編號(hào) 常整型,,遞增,,主鍵
各字段說明:
(1)name字段代表管理員的名字,。
(2)password字段代表密碼。
(3)id字段為管理員的標(biāo)志號(hào)。
3.3.3 用戶,、管理員權(quán)限
☆管理員:在此系統(tǒng)中可以由若干個(gè)管理員,,即系統(tǒng)管理員。他們具有一般用戶所沒有的權(quán)限,,即具有管理用戶,、試題以及試卷等內(nèi)容的權(quán)力,。它不需注冊(cè),,在數(shù)據(jù)庫有一個(gè)表來存放相關(guān)信息,,可由以存在的管理員添加或刪除管理員,。
☆一般用戶:主要是指學(xué)校的學(xué)生和企事業(yè)單位的培訓(xùn)對(duì)象等。
3.3.4 功能模塊詳細(xì)設(shè)計(jì)
下面,,對(duì)各個(gè)功能模塊分別進(jìn)行詳細(xì)討論,,具體情況見系統(tǒng)源程序。
3.3.4.1 管理模塊
管理員可以向題庫中添加各種類型且符合要求的試題,,也可以對(duì)它們進(jìn)行修改和刪除,。同時(shí),管理員也能對(duì)科目,、用戶,、考試記錄等數(shù)據(jù)進(jìn)行管理。
1. 試題管理
(1)試題錄入
首先,,用戶選擇試題所屬科目,。若菜單中沒有該科目,則可以新增一個(gè),。返回,、刷新一次頁面,即可看到新增的科目名稱,。而且,,在本系統(tǒng)中其它需要選擇科目的地方也會(huì)自動(dòng)更新。其次,,每道試題有類型,、試題內(nèi)容與選項(xiàng)和答案等欄目。管理員輸入完以后,,即可看到預(yù)覽效果,。如果輸入不合法,或者該科題庫中已有該試題編號(hào)和內(nèi)容等,,則系統(tǒng)給出相應(yīng)的提示或警告,,以待更正。
(2)試題修改
管理員還可以對(duì)試題進(jìn)行修改,。不過,,對(duì)于各表中的主鍵不用修改,避免了造成系統(tǒng)中的數(shù)據(jù)混亂,,或者覆蓋其它有用數(shù)據(jù)的現(xiàn)象,。如果用戶執(zhí)行了非法操作,,則必須重新操作。
(3)試題刪除
管理員可以刪除不再需要的試題,。
2. 科目管理
(1)添加科目
其基本信息有科目名稱、題型,、題量和考試總時(shí)間等,,對(duì)于用戶輸入的不符合系統(tǒng)要求的數(shù)據(jù),系統(tǒng)仍舊給出提示或警告,。
(2)科目刪除
管理員可以刪除不再需要的科目,。
3.用戶管理
管理員可以通過管理界面添加或刪除用戶。
4.管理管理員
管理員可以通過管理界面添加新管理員或刪除原有管理員,。
5.考試記錄管理
系統(tǒng)中的管理員可以查詢考試記錄,,也可以刪除考試紀(jì)錄。
3.3.4.2在線考試模塊
進(jìn)入在線考場(chǎng)是本系統(tǒng)最重要的部分之一,。因?yàn)橐粋€(gè)系統(tǒng)如果涉及到現(xiàn)實(shí)的話,,就必須考慮得十分周到、完善,??忌卿浐螅灰x擇考試科目以后,,就可以調(diào)出試卷進(jìn)行在線考試,。為了實(shí)現(xiàn)動(dòng)態(tài)隨機(jī)不重復(fù)的抽取試題,需要在選題過程中每選出一題,,就要在試題庫中作相應(yīng)的標(biāo)志,,以便下次不會(huì)重復(fù)取出此題。試卷出來后要對(duì)試題庫中的標(biāo)志位復(fù)原,。這樣就會(huì)使每個(gè)考生的試卷都不同,。考生的其答題信息通過單,、復(fù)選按鈕選擇答案來反映,。考試結(jié)束采取自主交卷和到了規(guī)定的時(shí)間自動(dòng)題示有機(jī)結(jié)合的方式辦法予以實(shí)現(xiàn),。
3.3.4.2用戶注冊(cè)模塊
該模塊的功能是實(shí)現(xiàn)用戶遠(yuǎn)程注冊(cè),。用戶輸入想要注冊(cè)的用戶名和密碼,提交之后由系統(tǒng)判斷該用戶是否已經(jīng)存在,,如果存在,,就給出相應(yīng)信息,如果不存在,,就把用戶輸入的用戶名和密碼寫到數(shù)據(jù)庫中,,完成注冊(cè),。
3.3.5 在線考試系統(tǒng)考試模塊框圖 圖3-2 在線考試系統(tǒng)考試模塊框圖
系統(tǒng)實(shí)現(xiàn)
在進(jìn)行了整體設(shè)計(jì)以后,就開始進(jìn)行詳細(xì)的設(shè)計(jì)及編碼工作,。也就是設(shè)計(jì)文件和把他們有機(jī)地組織在一起實(shí)現(xiàn)所有功能,。
4.1 系統(tǒng)流程圖設(shè)計(jì)
根據(jù)系統(tǒng)總體設(shè)計(jì),首先系統(tǒng)要有一個(gè)登錄界面,,用戶可以從該界面登錄參加考試,。管理員也應(yīng)該有一個(gè)進(jìn)入管理登錄界面的通道。此外,,這個(gè)界面上還應(yīng)該有一個(gè)用戶注冊(cè)的通道,。
在考生正確輸入用戶名和密碼以后,接著應(yīng)該進(jìn)入考試科目選擇界面,。在該界面上,,考生選擇參加考試的科目,這個(gè)人機(jī)交互的過程是必不可少的,。
考生確定考試科目以后,,進(jìn)入開始考試界面,由計(jì)算機(jī)隨機(jī)提取試題,,顯示出來組成試卷,,并開始進(jìn)行計(jì)時(shí)??忌俅芜M(jìn)行考試,,答完試題后交卷,進(jìn)入下一個(gè)界面。
考生提交答卷后,,由計(jì)算機(jī)進(jìn)行處理--判卷,,得出考試分?jǐn)?shù),顯示出來,,并把該生考試記錄存入數(shù)據(jù)庫,。在這個(gè)界面上應(yīng)該可以返回繼續(xù)進(jìn)行考試或回到登錄界面。
以上是系統(tǒng)進(jìn)行考試功能的部分,,要對(duì)系統(tǒng)進(jìn)行管理,,如試題管理、科目管理,、用戶管理等就需要設(shè)計(jì)一些管理界面,。下面就來逐步進(jìn)行設(shè)計(jì)。
要進(jìn)行管理首先要有管理員登陸驗(yàn)證,,這里另外設(shè)計(jì)了一個(gè)界面,,使它與用戶登錄區(qū)別開來。這個(gè)界面與用戶登錄界面表面上很相似,但是他們是從不同的表中提取數(shù)據(jù)進(jìn)行驗(yàn)證的,,以便于系統(tǒng)擴(kuò)充和增加安全性,。
管理員登錄以后,應(yīng)該有一個(gè)管理項(xiàng)目選擇界面,,其中包括管理用戶選項(xiàng),、管理管理員選項(xiàng)、管理考試科目選項(xiàng),、管理考試紀(jì)錄選項(xiàng)以及管理各科試題選項(xiàng),。
管理用戶的界面可以實(shí)現(xiàn)用戶的增加、和刪除的功能,,管理員在此可以對(duì)用戶進(jìn)行管理。
管理管理員的界面,,功能和管理用戶的差不多,,實(shí)現(xiàn)對(duì)管理員的增加和刪除功能。
管理考試科目界面用來增加或刪除考試的科目,以方便對(duì)各科試題的管理和查詢,。
管理考試紀(jì)錄界面可以對(duì)考生的每次考試進(jìn)行紀(jì)錄,管理員科可以對(duì)考生成績(jī),、考試科目、時(shí)間及考試各相關(guān)紀(jì)錄進(jìn)行查詢和刪除,。
最后是試題庫管理界面,,它根據(jù)各科進(jìn)行分類。通過這個(gè)界面管理員可以對(duì)題庫中的某科試題進(jìn)行增加,、修改或刪除,。這樣就十分方便靈活的對(duì)試題庫進(jìn)行管理。
下圖就是系統(tǒng)流程圖:
圖4-1 系統(tǒng)流程圖
4.2 各文件功能介紹及詳解
1.<conn.asp>
該文件實(shí)現(xiàn)的是連接數(shù)據(jù)庫和斷開連接的功能,。
文件中主要是定義了兩個(gè)過程conn_init()和endConnection(),。第一個(gè)是連接數(shù)據(jù)庫,第二個(gè)是實(shí)現(xiàn)斷開連接,。其中conn_init()過程中的連接是通過下面語句實(shí)現(xiàn)的:
connstr= "DBQ=" + server.mappath("data.mdb") + ";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
set conn=server.createobject("ADODB.CONNECTION")
conn.open connstr
connstr確定了數(shù)據(jù)文件的路徑和數(shù)據(jù)庫驅(qū)動(dòng)程序,。
Conn的含義是定義了一個(gè)變量用,來存放數(shù)據(jù)庫連接所創(chuàng)建的對(duì)象,。
conn.open connstr則真正實(shí)現(xiàn)了數(shù)據(jù)庫的連接,。
該文件主要被包含在其他文件中實(shí)現(xiàn)數(shù)據(jù)庫的連接和斷開功能。
2.<default.asp>
該文件的功能是系統(tǒng)登陸的入口,,在此可以實(shí)現(xiàn)用戶注冊(cè)入口,,管理員管理入口以及用戶進(jìn)入考試系統(tǒng)登陸界面的功能。
該文件的功能使這樣實(shí)現(xiàn)的:表單提交給文件本身,。再由HTML上面的ASP程序?qū)μ峤恍畔⑦M(jìn)行處理,。
最上面的<%@ Language=VBScript %>表示腳本語言是VBScript。
<!--#include file="conn.asp"-->表示包含conn.asp文件,。以下的程序進(jìn)行了選擇判斷,,如果提交的表單中的submit值為“登錄”,,就繼續(xù)判斷看student表中是否存在與該用戶輸入的用戶名和密碼相同的記錄,如果存在就轉(zhuǎn)到selectsubject.asp頁進(jìn)行考試科目選擇,。不存在就返回“對(duì)不起,,請(qǐng)輸入正確的用戶名和密碼。”如果submit值為“注冊(cè)”,,就轉(zhuǎn)到register.asp頁進(jìn)行用戶注冊(cè),。如果submit的值為“管理”就轉(zhuǎn)到admin文件夾中的login.asp頁。重點(diǎn)程序如下:
set rs = server.createobject("adodb.recordset")
rs是一個(gè)變量,,用來存放一個(gè)recordset對(duì)象,。
sql="select * from student where studentname='" & Request.Form("studentname") & "' and studentpassword='" & Request.Form("studentpassword") & "'"
變量sql代表一個(gè)SQL語句,功能是從表student中選出用戶名和密碼與考生提交的用戶名和密碼都相同的記錄,。
rs.open sql,conn,1,1
該語句的功能是執(zhí)行sql語句并把記錄集結(jié)果存儲(chǔ)在變量rs中,。
rs.close的作用是關(guān)閉紀(jì)錄。
session("studentname")=request.form("studentname")
該句的意思是把表單提交的變量studentname的值賦給一個(gè)session對(duì)象studentname,。這個(gè)對(duì)象用來存儲(chǔ)用戶名,,它在該用戶對(duì)每個(gè)頁面的訪問中有效。
set rs=nothing含義是清空rs變量,。
call endConnection()是調(diào)用conn.asp中的過程,,用來關(guān)閉于數(shù)據(jù)庫的連接。
3.<register.asp>
該文件實(shí)現(xiàn)了用戶注冊(cè)的功能,,用戶只要填寫想要注冊(cè)的用戶名及密碼,,文件首先查看用戶名是否已經(jīng)存在,如果存在就提示該用戶名已經(jīng)存在,,否則就將用戶輸入的信息添加到數(shù)據(jù)庫中的student表內(nèi),。然后用戶就可以使用自己注冊(cè)的用戶名和密碼登錄在線考試系統(tǒng)進(jìn)行在線考試。
在文件中,,表單提交給register.Asp自身進(jìn)行處理,,如果submit值為“注冊(cè)”首先進(jìn)行判斷看用戶名或密碼是否為空。如果為空就顯示“錯(cuò)誤!用戶名或密碼不能為空!”的信息,。如果不為空,,進(jìn)行下一步判斷,看student表中是否已經(jīng)存在用戶想要注冊(cè)的用戶名,,如果存在,,就顯示信息“錯(cuò)誤!該用學(xué)生存在!”,如果不存在就將要注冊(cè)的用戶名和密碼寫入student表,。代碼如下:
sql="insert into student(studentname,studentpassword) values('" & cstr(trim(request("studentname"))) & "','" & cstr(trim(request("studentpassword"))) & "')"
conn.execute sql
最后,,用一個(gè)Vbscrip語言編寫的消息框顯示注冊(cè)成功信息。
4.<selectsubject.asp>
該文件是實(shí)現(xiàn)用戶登錄在線考試系統(tǒng)后進(jìn)行考試科目選擇的功能,選擇科目后進(jìn)入考試界面,。
該文件首先是將subject表中所有的紀(jì)錄都以單選項(xiàng)的方式選出來,,如果沒有紀(jì)錄,則顯示“對(duì)不起,暫時(shí)沒有任何考試科目,。”用戶按提交后,,表單仍然提交給文件自身。處理程序首先判斷用戶是否選擇了一個(gè)考試科目,,如果沒有選擇顯示“你沒有選擇考試科目,,請(qǐng)選擇考試科目!”如果選擇了某個(gè)考試科目,,先把該科目賦值給一個(gè)session變量selectsubjectname,,然后從subject表中選出該科的相關(guān)信息,并也都設(shè)成session變量,。 Singlenumber表示單選試題數(shù)量,,multinumber表示多選試題數(shù)量,singleper表示單選試題分值,,multiper表示多選試題分值,,testtime表示考試總時(shí)間,。接著進(jìn)入考試界面,。
5.<test.asp>
該文件就是考試界面,實(shí)現(xiàn)真正的動(dòng)態(tài)隨機(jī)選題,,并對(duì)每個(gè)考生的考試時(shí)間進(jìn)行監(jiān)控,,到結(jié)束時(shí)間后自動(dòng)給出提示。
該文件的總體構(gòu)架是使用了if else 語句進(jìn)行了一個(gè)選擇,,剛進(jìn)入該頁面submit1得值肯定不等于“開始考試”,,所以先顯示出“開始考試”的按鈕。按下以后,,首先把當(dāng)前時(shí)間以分種為單位存儲(chǔ)在session的變量starttime中,。然后進(jìn)入隨機(jī)抽取試題部分,單選題和多選題的抽取很相似,,只不過一個(gè)是單選按鈕,,一個(gè)是多選按鈕罷了。這里只解釋單選題的部分,。
strid1=""是定義了一個(gè)字符串變量,,并先賦值為空。
Randomize是產(chǎn)生隨機(jī)種子,,在使用rnd()函數(shù)之前一定要先用Randomize產(chǎn)生隨機(jī)種子才能實(shí)現(xiàn)其產(chǎn)生0~1之間隨機(jī)數(shù)的功能,。
for i=1 to session("singlenumber")直到next是選擇singlenumber(代表某科目的單選題數(shù)量)個(gè)單選題。
下面的代碼實(shí)現(xiàn)了從數(shù)據(jù)庫中隨機(jī)不重復(fù)的選題:
set rs=server.createobject("adodb.recordset")
sql="select * from question where subjectname='"&session("selectsubjectname") & "'and type='單選題' and haveselect=0 "
rs.open sql,conn,3,2
count=rs.recordcount
temp=fix(count*rnd(10))
rs.move temp
rs("haveselect")=1
rs.update
strid1=strid1 & rs("ID") & ","
其中haveselect標(biāo)志某題是否已經(jīng)被選過。
Count變量用來存放所有未被選過的單選題的總數(shù),。
temp變量用來存放0~Count之間的隨機(jī)整數(shù)值,。
rs.move temp是將當(dāng)前記錄移到第temp條紀(jì)錄。
rs("haveselect")=1是將當(dāng)前選出的紀(jì)錄的標(biāo)志位設(shè)為1,,然后用rs.update把數(shù)據(jù)庫中的相應(yīng)標(biāo)志位改為1,。
strid1=strid1 & rs("ID") & ","是將所有選出的試題的id號(hào)用逗號(hào)分割后存儲(chǔ)在strid1一個(gè)變量中,以方便的把所有選出的試題的id號(hào)傳到result.Asp文件中,,這也是本設(shè)計(jì)的一個(gè)獨(dú)特的地方,。需要說明的是strid1變量的最后是一個(gè)逗號(hào),在下一個(gè)文件中會(huì)詳細(xì)說明如何進(jìn)行處理,。
set rs=server.createobject("adodb.recordset")
sql="select * from question where haveselect=1 "
rs.open sql,conn,3,2
rs.movefirst
do while not rs.eof
rs("haveselect")=0
rs.update
rs.movenext
loop
上面一段程序是在選完題之后將所有已經(jīng)設(shè)成1的haveselect改寫成0,,這樣自己下次或別人就仍可以選擇所有的試題。
最后一段程序是用來計(jì)時(shí)的,,考試時(shí)間到了之后自動(dòng)給出提示,。
6.<result.asp>
考生提交答卷以后,該文件就把考生的答案同question表中的正確答案進(jìn)行比較,,最后得出考生的得分,。
首先是變量賦值,取得session對(duì)象的一些變量值,,以方便使用,。endtime=now()是去的考試結(jié)束時(shí)間。
selectstr1=request.form("hidQuestID1")和
selectstr2=request.form("hidQuestID2")是獲取存放被選單選和多選試題的id號(hào)的兩個(gè)字符串,。
len1=len(selectstr1)和
len2=len(selectstr2)是取得兩個(gè)字符串的長(zhǎng)度,。
str1=left(selectstr1,len1-1)
str2=left(selectstr2,len2-1)是把兩個(gè)字符串的結(jié)尾(也就是逗號(hào))取掉。
dim id1,id2
id1=split(str1,",")
id2=split(str2,",")是用split()函數(shù)將存有id號(hào)的字符串拆開并存放到數(shù)組當(dāng)中,,以便調(diào)用,。
以上就實(shí)現(xiàn)了所有被選中的試題的id號(hào)的傳遞。
下面這段程序就實(shí)現(xiàn)了單選試題的答案于正確答案的比較,,并得出單選題應(yīng)得分?jǐn)?shù),。
for i=1 to singlenumber
result=request.form("no"&id1(i-1))
if not isempty(result) then
sql="select * from question where id="& clng(id1(i-1))
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,3,2
if result=rs("answer") then
score=score+cint(singleper)
end if
rs.close
set rs=nothing
else
end if
next
多選題與單選題程序基本相同,這里就不贅述了,。
接著就是將考試結(jié)果紀(jì)錄存入score表中,,并對(duì)考生顯示出考試成績(jī)。
上面是在線考試系統(tǒng)考試部分的程序及其解釋,,該部分是系統(tǒng)最主要的部分,,所以解釋得比較詳細(xì)。管理部分很多文件功能都很相似,,這里就只挑功能最全又比較重要的文件作以解釋,。(這些文件都放在admin文件夾下)
7.<primary.asp>
該文件實(shí)現(xiàn)的功能是管理員選擇進(jìn)行管理的項(xiàng)目,,也就是管理主界面。
8.<mgstudent.asp>
該文件實(shí)現(xiàn)對(duì)用戶進(jìn)行管理(刪除或添加)的功能,。
<mgadmin.asp>
該文件實(shí)現(xiàn)對(duì)管理員進(jìn)行管理(刪除或添加)的功能,。
10.<mgsubject.asp>
該文件的功能是實(shí)現(xiàn)對(duì)考試科目及相關(guān)參數(shù)(如考試時(shí)間、單選及多選題量)進(jìn)行管理,。
11.<mgscore.asp>
該文件的功能是對(duì)考試記錄進(jìn)行查詢或刪除,。
12.<mgquestion.asp>
<mgquestion.asp>和<addquestion.asp>兩個(gè)文件和起來實(shí)現(xiàn)對(duì)試題庫進(jìn)行刪除修改和添加的功能。
subjectname=trim(request("subjectname"))是將上一個(gè)界面?zhèn)鱽淼目颇棵Q賦值給subjectname變量,。
set rs=server.createobject("adodb.recordset")
rs.open "select * from question where subjectname='" & cstr(trim(request("subjectname")))&"' order by id desc ",conn,1,1
上面這段代碼是從question表中將所有其科目名與所選科目相同的問題都選出來,。
<a href='mgquestion.asp?type=<%=trim(rs("type"))%>
&subjectname=& lt;%=trim(rs("subjectname"))%>&action=edit&id=& lt;%=trim(rs("id"))%>&page=<%=request("page")%>'>編輯< /a> <a href='javascript:SureDel(<%=rs("id")%>)'>刪除</a>
上面這段代碼的的作用是將刪除的參數(shù)傳給文件自身或?qū)⒕庉嫷膮?shù)傳給SureDel(id,subjectname)函數(shù)。
如果實(shí)執(zhí)行刪除操作就轉(zhuǎn)到SureDel(id,subjectname),,提示是否真的要?jiǎng)h除,,如果選擇確定就執(zhí)行如下代碼:
sql="delete from question where id=" &request("id")
conn.execute sql
執(zhí)行刪除該問題的操作,將question表中的相應(yīng)記錄刪除,。否則,,如果選擇取消就不執(zhí)行刪除操作。
如果執(zhí)行編輯同樣將參數(shù)傳給文件自身,,先執(zhí)行下面代碼將isedit的值設(shè)為真:
if request("action")="edit" then
isedit=true
end if
文件最下面是編輯試題或添加試題部分,,表單提交給addquestion進(jìn)行處理。
13.<addquestion.asp>
首先將表單傳過來的各個(gè)參數(shù)值賦給不同的變量,,以便于使用,。然后判斷question,subjectname,answer和leixing四個(gè)變量是否為空,如果為空顯示錯(cuò)誤信息,。不為空就進(jìn)行判斷,,看是修改問題還是添加問題,,分別進(jìn)行相應(yīng)處理(修改question表中的記錄或向其中添加記錄),,然后返回到mgquestion.asp頁面。
4.3調(diào)試過程中遇到的主要問題和解決辦法
在系統(tǒng)調(diào)試的過程中主要遇到三個(gè)比較困難的問題:
第一個(gè)就是如何實(shí)現(xiàn)在隨機(jī)選題的同時(shí)保證不重復(fù),,本設(shè)計(jì)最后使用了在question表中設(shè)置了一個(gè)haveselect字段來標(biāo)志選過的紀(jì)錄的辦法來解決,。
第二個(gè)就是如何將test.asp中所有試題的id號(hào)傳到result.asp頁中。因?yàn)樵囶}數(shù)是變值,,用一般的使用變量方式實(shí)行不通的,。本設(shè)計(jì)采用了將 id號(hào)以逗號(hào)分隔存在字符串變量中,然后到result.asp頁面用split()函數(shù)拆開存放到數(shù)組中的辦法進(jìn)行解決,。
第三個(gè)就是問題在編輯之后就無法再選出來了,,最后發(fā)現(xiàn)是因?yàn)榫庉嬛罂颇棵那懊鏁?huì)有空格,所以會(huì)無法選出,。解決的辦法是使用trim()函數(shù)將空格去掉,。
4.4 系統(tǒng)測(cè)試及實(shí)現(xiàn)后主要界面
本系統(tǒng)經(jīng)先進(jìn)行各模塊測(cè)試,,經(jīng)過修改和調(diào)整通過以后,進(jìn)行總體測(cè)試,。測(cè)試結(jié)果各項(xiàng)功能均已經(jīng)或基本達(dá)到設(shè)計(jì)要求,。
下面就將各主要文件實(shí)現(xiàn)的界面一一列出:
1.<default.asp>
圖4-2 用戶登錄界面圖
2.<selectsubject.asp>
圖4-3 考試科目選擇界面圖
3.<test.asp>
圖4-4 考試界面圖
4.<result.asp>
圖4-5 考試結(jié)果界面圖
5.<login.asp>
圖4-6 管理員登錄界面圖
6. <primary.asp>
圖4-7 管理界面圖
7.<mgsubject.asp>
圖4-8 管理科目界面圖
8.<mgscore.asp>
圖4-9 管理記錄界面圖
9.<mgquestion.asp>
圖4-10 管理試題界面圖