劉永立
(北京財貿職業學院信息物流系,北京101101)
構建基于Java平臺的網上考試系統*
劉永立
(北京財貿職業學院信息物流系,北京101101)
本文以“北京財貿職業學院網上考試系統”為藍本,重點論述了構建基于Java平臺的網上考試系統的必要性和關鍵技術;給出了系統需求分析報告、數據庫設計、功能模塊設計以及故障處理方法;提出了試題庫建設過程中應該注意的問題并給出了參考意見。
網上考試;隨機組卷;Java平臺
近幾年,各類院校信息化建設都取得了很大進展,其中基于計算機網絡平臺的考試模式改革取得了很多成果。本文將以“北京財貿職業學院網上考試系統”為藍本,重點討論網上考試系統構建的必要性、關鍵技術、系統需求分析、數據庫設計、功能模塊設計等。該系統應用于實際教學一年的時間,效果良好。系統歡迎界面如圖1所示。在以下論述中,“本系統”即指該網上考試系統。

圖1 “網上考試系統”歡迎界面
1.試題庫建設靈活、高效、及時
教師可隨時通過網絡平臺添加反映最新科技信息和時政信息的試題、修改舊試題、刪除過時的試題,確保試題庫中的試題最新、最全、最準確。特定情況下,可以在平時訓練中將部分試題向學生開放,以便增多學生練習的機會,尤其是對于一些需要取得證書的實訓課程,這種做法更是有效。而在傳統考試和測驗中,教師在考前才會提供給教務部門2~3套備選試題,試題陳舊,試題量少,學生缺乏練習的機會。
2.在節能環保的同時,減輕監考的壓力和教師判卷的負擔
網上考試不需要任何紙質試卷,學生可以通過瀏覽器隨時參加考試,大大節省了紙張,符合低碳經濟的要求;網上考試時,每人一臺機器,隨機抽取試題,互不干擾,試卷也互不相同,一場考試只要求1至2名監考教師即可(若隨堂考試,監考教師可由任課教師擔任),大大減輕監考的壓力;網上考試系統的自動評分功能比較完備,考試完畢后,教師可以立即得到學生的成績(一般系統會將考試成績導出為電子報表),大大減輕教師判卷的壓力。
3.能夠有效提高學生的成績
網上考試系統可以開啟練習模式,在練習模式下,系統長期對學生開放,對于一些需要反復練習和記憶才能掌握的問題,學生可以進行重復練習,從而確保學生有足夠多的訓練時間,有效提高學生的成績;另外,網上考試系統的特色之一就是“隨機抽取試題”,也就是“隨機組卷”,這一功能確保試卷和試題的唯一性,因此會大大減少作弊的可能性,學生的成績更加真實可信。
4.有助于實現數據共享、數據管理和無紙化辦公
與傳統考試相比,網上考試可以借助數據庫系統的強大數據管理和數據維護功能,實現課程數據、學生數據、成績數據的各部門共享,有利于學生和教師在學習和工作中及時查看相關數據,滿足學習和工作的需要。
1.確保試題庫中的題量滿足隨機抽題的要求
為了使得抽取的試題具有隨機性,系統在隨機組卷時通過隨機數產生試題編號,然后在試題庫中選中該編號的試題,將其加入到試卷中。因此,試題庫中包含足夠多的試題是確保隨機抽題能夠順利進行的前提。經過多次測算,筆者認為,當試題庫中試題總量達到試卷題量的5倍以上時可以基本滿足網上考試的要求。當然,試題庫的建設是一個長期的、循序漸進的過程,試題庫越完善,得到的隨機試卷越科學、合理。
2.任課教師應充分考慮各章節在課程中的權重
任課教師在編輯章節信息時需要考慮到每個章節在課程中的權重。舉例來說,課程A包含四章,分別是:A1、A2、A3、A4,各章的權重分別是:0.2,0.3,0.4,0.1。假設試卷中的題型分為:是非題、單選題、多選題,這三類題型在試卷中的題量分別是:20、30、20,也就是在每份隨機產生的試卷中是非題20道,單選題30道,多選題20道。那么課程A各章節在試卷中及在題庫中的題量如表1所示,括號中的數字是各題型在題庫中題量的最低要求。

表1 課程A各章節在試卷中以及在題庫中的題量分布
3.避免針對同一知識點多次出題
前面已經提到,系統隨機抽題時基于計算機產生的隨機數,因此,試題庫中任何一道試題都可能會被抽到。若在同一章節或同一題型中,針對某個知識點重復出題,可能造成隨機產生的試卷中,針對該知識點出現兩道或多道試題,這樣一來,試卷便失去了科學性和公平性。
網上考試系統的用戶分為三類:管理員、任課教師、學生。
1.管理員的日常操作
(1)數據庫數據的初始化:導入/編輯學生數據、導入/編輯任課教師數據、導入/編輯課程數據。學生數據、教師數據、課程數據的數據量都比較大,可以借助系統的導入功能完成批量數據的導入,當個別記錄出現問題時可以進行單條記錄的修改和刪除。
(2)考試模式設置:將指定課程設定為“考試”模式或“練習”模式。在“考試”模式下,學生只能有一次抽取試卷的機會,并且系統會倒計時,時間一到,系統會自動交卷。當然,學生也可以隨時主動交卷;在“練習”模式下,系統不會倒計時,也不會自動交卷,只能由學生主動交卷,給學生充足的思考時間和練習時間。另外,在“練習”模式下,學生可以多次抽取試卷,反復練習。
(3)密碼修改:管理員根據實際情況,可以定期修改管理員登錄密碼,確保系統安全。
(4)成績查詢/成績導出:查詢指定課程所有學生的成績,并將其導出為Excel報表格式。
2.任課教師的日常操作
(1)設計并編輯所任課程的試卷信息、章節信息、試題庫:任課教師根據課程的特點設計試卷信息,主要是題目類型(本系統第一版只包括如下三類題型:是非題、單選題、多選題)、每類題目在試卷中的題量、每類試題的分值、試題數目、考試時間等信息;任課教師根據實際情況設定課程中每個章節在試卷中所占的權重;任課教師應手動添加試題或將試題編輯為Excel表,然后導入到試題庫中。
(2)考試初始化:由于系統平時向學生開放,因此保存了學生在平時練習過程中的試卷信息和成績,在正式考試之前,任課教師需要將這些歷史記錄清空,為考試做好準備。
(3)考試模式設置:任課教師可以設定所任課程的模式。平時練習時,將系統設定為練習模式;正式考試前,將系統設定為考試模式。任課教師只能設定自己所擔任課程的考試模式,管理員可以設定任何一門課程的考試模式。
(4)查詢學生信息:正式考試前,任課教師需要檢查自己的學生信息是否完整,一旦發現某個學生的信息未被導入到數據庫中,應及時通知管理員,以便所有學生都能夠正常參加考試。
(5)隨機抽題:試卷信息和試題庫創建完畢后,為了檢驗試卷的合理性以及試題的準確性,任課教師可以在考前進行測試,隨機抽取試題,并進行組卷,發現問題后及時修改,確保試題庫和試卷信息的正確性。
(6)考試管理:正式考試過程中,學生只能進行一次抽取試卷的操作和一次交卷操作。但是也可能會遇到一些網絡問題,造成不能正常抽取試卷或試卷提交失敗。萬一遇到這種情況,任課教師可以針對考場的實際情況手動修改學生的試卷信息(主要是修改登錄次數),幫助學生獲取試卷并確保試卷正確提交。
(7)成績查詢:考試完畢后,任課教師可以查詢所任課程所有學生的成績,并將成績導出為Excel報表格式。
(8)密碼修改:為了確保系統安全,任課教師在首次登錄后,應該及時修改自己的登錄密碼,平時使用過程中,也應該定期修改密碼。
3.學生的日常操作
(1)隨機抽取試題:平時練習階段,學生可以隨時通過瀏覽器登錄到系統,進行任何一門課程的練習,練習成績不會被教師記入最終成績中;正式考試期間,學生在指定的教室,指定的時間登錄到系統,參加考試,隨機抽取試卷,此時系統會按照教師設定的時間倒計時。
(2)查詢成績:學生可以隨時登錄系統,查看自己任何一門課程的成績。
(3)修改登錄密碼:學生的初始密碼與學號相同,為確保數據安全,學生應該在首次登錄后,修改自己的登錄密碼。
總體來說,通過網上考試系統,任課教師負責設定試卷題目類型、每類題目的分值、題量,并負責導入/編輯題庫數據、查詢成績;學生可以隨機抽取試卷進行考試或練習,并能夠查看自己的成績;管理員負責管理教師數據、課程數據以及完成數據庫初始化工作。因此,該系統不但具備信息管理系統的特征,同時必須具備成績評定和隨機組卷的功能。網上考試系統的主要功能模塊如圖2所示。

圖2 網上考試系統的主要功能模塊
本系統是基于B/S結構的動態站點,主要由兩部分組成:客戶端(瀏覽器);服務器端(Web程序)。在服務器端需要Web服務器(Web程序的運行環境)、數據庫管理系統等軟件的支持,在客戶端只需要瀏覽器即可。
構建Web程序可從如下兩種技術中選擇,基于微軟IIS Web服務器的ASP/ASP.NET技術;基于Java平臺的JSP技術。本系統采用第二套方案,主要是考慮到Java平臺的開放程度較高,有豐富的插件,且構建成本較低。
1.開發工具的選擇
本系統基于Java平臺,需要按次序安裝以下軟件:jdk1.6,Netbeans6.1,GlassFishV2,MySQL Server5.0。Netbeans6.1作為Web程序的開發環境,不但內嵌了GlassFish Web服務器,而且利用該IDE可以非常方便地連接MySQL Server數據庫。為了便于操作數據庫,可以在安裝完MySQL Server5.0后,安裝Navicat8軟件,該軟件是一款不錯的MySQL Server的客戶端工具軟件。
2.框架和庫文件
構建基于Java平臺的JSP程序可以直接采用MVC模型進行構建,也可以采用某些軟件架構,如:Struts、JSF、RichFaces等,這些架構都是在MVC模型的基礎上進行開發的。
RichFaces是JBOSS公司開發的Web應用程序框架,其基礎框架是JSF,但在JSF基礎上進行了擴展,提供了更為豐富的JSF控件;它支持Ajax技術,使程序員能夠輕松地構建RIA(Rich Internet Applications)Web應用程序。
本系統基于RichFaces框架進行開發,需要在Netbeans6.1中添加RichFaces框架所需的相關JAR文件。另外,由于在數據導入和導出過程中需要操作Excel文件,所以還需要jxl開源組件。
系統所需的主要JAR文件如表2所示(所有文件都可從網上下載)。

表2 系統所需JAR文件列表
3.數據庫設計
首先通過Navicat8客戶端軟件在MySQL Server5.0數據庫管理系統中創建數據庫“exam”,然后在該數據庫中建立如表3中所示的數據表。
課程表course中的字段分別為:課程ID、課程名稱、是非題數目、是非題分值、單選題數目、單選題分值、多選題數目、多選題分值、考試時間、任課教師ID、考試模式(練習或正式考試);章節表chapter中的字段分別為:章節ID、章節名稱、所屬課程ID、該章在課程中所占權重;試題庫表question中的字段分別為:試題ID、試題類型、試題內容、選項A、選項B、選項C、選項D、正確答案、所屬章節ID;教師表teacher中的字段分別為:教師ID、教師姓名、登錄密碼、角色;學生數據表student中的字段分別為:學號、姓名、性別、登錄密碼、所屬班級;試卷表testpaper中的字段分別為:試卷ID、學號、課程ID、登錄次數(正式考試時,若不出現任何網絡故障和設備故障,每份試卷的登錄次數一般不能大于1,除非故障出現后,進行二次登錄,有可能造成登錄次數大于1)、成績、客戶端IP、客戶端網卡信息、是否成功交卷、考試用去的時間;試卷詳細信息表testpaper_item中的字段分別為:考題ID(在隨機試卷中的編號)、試題ID(在題庫中的編號)、考生的選擇、試卷ID、考題出現在試卷中的位序。

表3 系統所需數據表
需要特別注意的是,正式考試時,為了防止考生多次登錄到系統進行答題,在數據表testpape中設置一個字段“logincount”,用來記錄考生參加本門課程考試的次數。一旦考生成功獲取試卷,該標志位便被設置為“1”;另外設置一個字段“submitsuccess”,用來記錄該考生是否成功提交試卷。考生登錄系統后,系統若發現該考生已經成功提交過該門課程的試卷(submitsuccess字段為真),則不允許該考生重新抽取試卷;相反,若考生計算機出現故障,或由于網絡癱瘓等原因,造成考生重新登錄系統,則submitsuccess字段一定為假,此時系統將允許考生重新答題,但不會重新抽取試卷,仍然采用故障發生前的那套試卷,并且將登錄次數字段“logincount”累加。
4.隨機組卷的實現方法
隨機組卷的基本思路是:通過隨機數函數,產生一個隨機數列,然后以該隨機數列為基礎,在試題庫中抽取試題。當然,得到的隨機數列的每項都應該大于0且小于題庫中對應題型試題總量。另外,為確保同一試題在同一試卷中只出現一次,構建的隨機數列中各數據項應該互不相同。如何產生滿足要求的隨機數列,方法很多,也比較簡單,本文不做闡述,下面只給出隨機試卷生成過程中是非題的創建方法,重要代碼及說明如下所示(限于篇幅,代碼有刪節)。
public ArrayList createTestpaper_r_w_Random()
throws IOException,ClassNotFoundException{
//變量l是最終試卷中是非題的列表
ArrayList l=new ArrayList();
//外層for循環開始;變量array_Chapter中包含章節列表
for(int i=0;i //首先獲得第i章的所有是非題 ArrayList all=new ArrayList(); all=new ManageQuestion().getAllQuestion(" where chapterid="+"'"+ array_Chapter[i].getId()+"'"+"and type="+"'"+ "r_w"+"'"); //若沒有找到任何記錄,則結束本次循環 if(all.size()<=0){continue;} //定義變量mt,類MyTools中包含產生隨機數的方法myRandom() MyTools mt=new MyTools(); /*questionHash中保存抽取到的試題; 方法getNumberOfQuestions_r_w()返回試卷中第i章的是非題個數 */ int[]questionHash=new int[array_Chapter[i]. getNumberOfQuestions_r_w()]; //隨機獲取第i章的是非題,保存在變量questionHash中 questionHash=mt.myRandom(array_Chapter[i]. getNumberOfQuestions_r_w(),all.size()); //若questionHash為空,結束本次循環 if(questionHash==null||questionHash.length <=0){continue;} //將抽取到的試題添加到到變量l中 for(int j=0;j }//外層for循環結束 if(l!=null&&l.size()>0){ /*利用addQuestionID_Show()方法為所有抽取到的是非題添加試題編號,該試題編號將最終顯示在隨機試卷中 */ l=this.addQuestionID_Show(l); //若創建的是非題多于試卷的要求,則去掉多余的試題 while(l.size()>this.num_r_w){l.remove(l. size()-1);} }//if語句結束 return l; }//方法createTestpaper_r_w_Random()結束 5.故障處理方法 任何系統都不能做到無故障運行。網上考試系統在運行過程中,可能會出現如下問題:答題開始后,由于客戶端計算機故障、網絡故障等問題造成答題信息丟失,考生不得不重新抽取試卷。如此一來,不但影響考生的情緒,還將拖延考試時間,造成考試秩序混亂。為了防止此類情況發生,必須實現試卷信息及答題信息的及時存儲。 試卷信息的及時存儲,解決的辦法是在考生正式答題前將其抽取到的所有試題存入數據庫中,一旦出現問題,需要重新答題時,系統直接從數據庫中讀取試卷,避免重新抽題對考生心理的影響。 考生答題信息的及時存儲,解決的辦法是每當考生答完一道題,立即將該考生的答題信息暫存到數據庫,當然,這樣做會在一定程度上加重網絡負擔,但是相對來說比較安全可靠。另外一種替代辦法是將答題信息存入客戶端,這種辦法雖然可以減輕網絡負擔,但是一旦客戶計算機由于病毒等原因出現問題時,可能會造成更大的損失(在多媒體機房中,這種情況很常見),因此,本文并不推薦此種方法。 另外,為確保系統的穩定可靠,客戶端每隔5秒鐘向服務器發送一個探測數據包,一旦發現無法與服務器正常通訊,及時彈出警告信息,通知考生和監考人員,以便盡早發現問題,避免考生的無效工作。☉ [1]張全和.關于考試閱卷系統開發的必要性和可行性[C].重慶大學計算機基礎教學研討會論文集,2004.4. [2]全渝娟,范榮強.基于Web的遠距離考試系統[J].計算機應用與軟件,2003(7). [3]http://www.netbeans.org[DB/OL]. [4]http://www.javaeye.com/[DB/OL]. [5]http://www.mastertheboss.com[DB/OL]. [6]殷兆麟.Java語言程序設計[M].北京:高等教育出版社,2002:115-132. [7]劉永立,白地動.基于JAVA平臺的網上成績管理系統的設計與實現[J].中國教育信息化,2010(1). (編輯:金冉) book=46,ebook=124 TP311.52 B 1673-8454(2011)09-0046-05 項目:2009年北京教委人文課題,項目名稱:商業連鎖物流發展研究(sm200900001003)。