基于java的在线考试系统设计(含源文件)
歡迎添加微信互相交流學習哦!
項目源碼:https://gitee.com/oklongmm/biye
摘 要?? ?
本系統是一個基于java的在線考試系統。它的用戶由學生、教師和系統管理員組成。學生登陸系統可以進行在線測試和成績查詢。當學生登陸時,系統會隨機地為學生選取試題組成考卷。當學生提交考卷后,系統會自動批改客觀題,并將試卷提供給教師查看和提醒教師對試卷主觀題進行修改。待教師修改完試卷后,系統會自動生成考生成績和分數段統計信息。學生可以查詢自己的成績信息和試卷,以便更好地了解自己的學習情況。教師也可以通過分數段統計信息更好地了解學生的學生情況。后臺管理員可以對考題,考試設置信息,用戶信息進行維護。學生,教師,管理員都可以對個人信息進行維護。
本系統采用B/S模式設計,一切操作均在瀏覽器上進行。系統所用到的技術有HTML,CSS,javascript,jsp/servlet等。數據庫選用SQLServer2005,web服務器選用TomCat。前臺設計主要在DreamWeaver上設計完成的,后臺開發主要在Eclipse上完成的。
本文首先對本次沒計的背景、設計的意義、設計的可行性等作了一個簡單的介紹。其次介紹了此次設計的設計過程,包括需求分析,總體設計,數據庫設計,詳細設計等內容。最后介紹了系統的功能測試過程和結果分析。
關鍵詞:在線考試 隨機抽題 SQLServer ?JSP/servlet ?
??
ABSTRACT
This system is a online examination system and it is bases on java.The user of this system make up by student,teacher and administrator. Students can test online and query the results of test. When the students submitted the test papers, the system automatically corrects the objective questions,then send this test paper to the teacher and remind the teacher to correct the subjective questions.When the teacher corrected the questions,the system will automatically generate test scores and the statistical information of score section. Students can query the results of test and the test papers so that they can better understand their own learning. The teacher can also ?better understand the learning of stuent through the statistical information of score section. Administrators can maintain the question and maintain the test set and manage the users information.Stuent,teacher and administrator can maintain the Own information.
The system uses the B / S model , so that all the operations were carried out in the browser. Technologies used in the system include HTML, CSS, javascript, jsp/servlet and so on. The database of this system is SQLServer2005 and ?the web service is Tomcat. The Front mainly design in DreamWeaver and the backstage mainly design in Eclipse.
This paper ,firstly, make a brief of the background, the meaning and the feasibility of this design. Then describes the design process of ?system,include needs analysis, design summary, database design and detailed design.Last describes the system functional testing process and results analysis.
Keyword:ExamOnline;Random question;SQLServer ;JSP/servlet ?
目錄
摘 要?? ?I
ABSTRACT?? ?II
1 緒論?? ?1
1.1問題的提出?? ?1
1.2系統開發目標?? ?1
1.3開發工具的選擇?? ?1
1.4開發本系統的意義?? ?1
2 系統分析?? ?3
2.1背景分析?? ?3
2.2可行性分析?? ?3
2.2.1技術可行性分析?? ?3
2.2.2經濟可行性?? ?3
2.2.3方案可行性?? ?4
3 系統設計?? ?5
3.1 需求分析?? ?5
3.2總體設計?? ?6
3.2.1系統數據流圖?? ?6
3.2.2 系統的功能模塊圖?? ?7
3.2.3 系統功能模塊?? ?7
3.3 數據庫設計?? ?10
3.3.1數據字典?? ?10
3.3.2 實體關系圖?? ?12
3.3.3數據庫的連接?? ?13
3.4 詳細設計?? ?15
3.4.1公共類設計?? ?15
3.4.2在線考試模塊設計?? ?18
3.4.3成績查詢模塊設計?? ?22
3.4.4查看/修改考生試卷模塊設計?? ?23
3.4.5分數段統計模塊設計?? ?26
3.4.6試題維護模塊設計?? ?26
3.4.7考試設置信息維護模塊設計?? ?29
3.4.8用戶管理模塊設計?? ?32
3.4.9個人信息維護模塊設計?? ?33
4 系統測試?? ?35
4.1 系統運行環境?? ?35
4.2 測試目的?? ?35
4.3 各功能模塊測試?? ?35
4.3.1在線考試模塊測試?? ?36
4.3.2查看/修改試卷測試?? ?37
4.3.3分數段統計測試?? ?38
4.3.4成績查詢測試?? ?39
4.3.5個人信息維護測試?? ?40
4.3.6 考題管理?? ?41
4.3.7考試設置管理測試?? ?44
4.3.8用戶管理測試?? ?45
5 ?結論?? ?44
致謝?? ?45
參考文獻?? ?46
?
1 緒論
1.1問題的提出
計算機網絡技術的飛速發展以及計算機技術的發展及計算機的日益普及,現在很多國內外的大學和社會其他部門都已經開設了遠程教育,通過計算機網絡實現異地教育和培訓,從而為在線考試系統發展提供了堅實的基礎。現在,計算機硬件技術的發展已經達到了相當高的水平。但是,在我國遠程教育軟件的開發目前還處于起步階段,隨著這項技術的不斷深入發展,就要求有更好、更完善的軟件系統應用到遠程教育當中去,這就給軟件設計人員提出了更高的設計要求。 ??
在二十一世紀的新時代,隨著計算機技術的發展及計算機的日益普及,基于在線考試與無紙化辦公一樣已成為大勢所趨。在線考試系統也越來越成為學校的好幫手,它的優勢不但體現在人力上也體現在物力上,在線考試系統的采用自動評閱、計分、成績存檔功能將有效地避免資源的浪費,有利于環保,減少人員,提高效率。
1.2系統開發目標
該系統是一個基于B/S模式的Web在線考試系統。它能夠從題庫中隨機抽取試題生成考試試卷,從而有效地避免了考試作弊,相互抄襲的避端。 當考試完成后系統能自動地為客觀題評分。教師登陸時系統可以還原學生考試試卷,待教師對主觀題評完分后系統可以計算出學生總分,并生成各分數段情況信息,供給老師參考,以便能夠了解學生的學習情況。
1.3開發工具的選擇
本系統開發語言為JAVA,從各IDE的性能和價格考慮所使用的開發工具主要是Eclipse+MyEclipse,前臺頁面主要用DreamWeaver來設計。由于本系統數據量和負載量都比較大,從經濟和效率上考慮本系統選用SQLServer2005數據庫。 Web服務器選Apache開元組織提供的TomCat,因為TomCat是一個免費的開元軟件是SUN公司推薦的web服務器。
1.4開發本系統的意義
從電子文檔、多媒體的應用,到利用Internet做嘗試,網絡已經滲入到教育體系的各個環節.網上考試系統作為這場變革中必不可少的環節之一,受到越來越多的關注.網上考試系統不僅和傳統考試方式一樣要權衡公平性,而且還具有一些新特點.
1)從管理的角度看,在線考試系統可以幫助教師完成一個考試從題目設計,考試安排,考試實施,考卷批改到分數統計總結的所有工作,系統實現了無紙化管理,提高了管理的效率;所有的考試數據和其他數據庫需要一種主流的方式進行存儲和管理,例如使用數據庫技術,題庫對于每個出題者都只是顯示了部分視圖,很好地實現了教考分離.
2)在不改變傳統考試基本步驟的條件下,只要有考試客戶端可以連接到考試應用服務器,任何考生在任何地方進行身份確認,都能完成考試.題目有一定的穩定性和隨機性.穩定性可以保證每一次考試對每一個考生是公平的,隨機性可以避免作弊的發生.
3)考試結果反饋及時準確.考試的結果在教師修改考完之后就可以知道,同時提供一個機會讓考生知道自己哪里做錯了,并給出反饋信息說明理由.考生的考試結果可以被保存下來,供教師進行分析統計和察看。?
2 系統分析
2.1背景分析
網絡化教育代表了教育改革的一個發展方向,已經成為現代教育的一個特征,并對教育的發展形成新的推動力。隨著Internet/Intranet的迅速發展和廣泛普及,建立在其上的遠程教育成為現代教育技術未來發展方向之一,考試測試作為遠程教育的一個子系統也成為一個重要的研究領域。現代遠程教育作為一種新的教學手段已經開始進入我們的生活,正在給傳統教育模式帶來新的變革,并對教育的發展形成新的推動力。
相比傳統的考試方式,在線考試系統的主要好處是一方面可以動態地管理各種考試信息,只要準備好足夠大的題庫,從該題庫中抽取一定數量的考題生成考試試卷,從而有效地避免了考試作弊,相互抄襲的避端;另一方面,考試時間靈活, 可以在規定的時間段內的任意時間參加考試;另外計算機化的考試的最大特點是閱卷快,系統可以在考試結束時當場給考生成績,計算機閱卷給了考生最大的公平感。
2.2可行性分析
2.2.1技術可行性分析
系統開發將要用到JSP/Servlet、JavaBean、SQLServer數據庫技術。另外,硬件只需要一臺pc機,裝上軟件Eclipse,DreamWeaver等開發工具 ,利用SQLserver作為后臺的數據庫,利用Tomcat作為Web服務器,所以在這方面來說是可行的。已經掌握了開發考試系統方法和開發工具,并且在調查過程中,已經了解和熟悉了在線考試系統的業務流程。綜上所述本系統開發從技術上是可行的
2.2.2經濟可行性
從經濟效益來分析,軟件的開發成本不大,而其它的投入也只是電腦。電腦的普及也帶來了低成本投入。由于系統運行的基礎環境均已具備,無需重新開發建設,所以系統開發、運行所需的費用是比較低的。而系統的效益很高可以提高管理效率實現計算機化、系統化、規范化操作,效率大于投入,可行性很高。
2.2.3方案可行性
根據系統的分析,本系統充分從適用性出發,全面為不同的使用用戶考慮。使系統的許多功能與規則都可根據用戶的習慣進行定制,包括軟件界面、操作方式、錄入方式等。本系統的設計充分從使用用戶和教務教學任務考慮。?
3 系統設計
3.1 需求分析
本考試系統用戶主要分為三類:學生,教師,管理員。
1.學生需求
學生登陸系統主要進行兩類操作:在線考試,成績查詢與個人信息管理.
(1)在線考試
系統能自動給考生選題,考題必須是隨機分配的,以保證考試的公平性。學生在考試過程中頁面將提供考試時間倒計時功能,使考生隨時了解考試剩余時間。在考試時間到時,系統將自動地將學生考試試卷提交,將提醒考生離開考場。當考試試卷提交時,系統自動為選擇題、判斷題等客觀題評分,主觀題由教師評分。
(2)成績查詢與個人信息維護
學生可以登陸系統查詢各科成績,其中成績信息包括每種題型的得分,如單選題,簡答題等。別外學生還可以查詢自己的考卷,了解自己的考試情況。
除此之外,學生登陸系統可以查看和修改個人的基本信息,如修改密碼等。
2.教師需求
教師登陸系統主要有三類操作:查看和修改學生試卷,查看各分數段統計,個人信息的維護
(1)查看/修改學生試卷
系統會將學生試卷從數據庫中讀出供給老師查看和修改,系統已經對選擇題和判斷題評了分,所以這些信息對于教師是只讀的。而對于主觀題,系統將參考答案讀出供給老師參考,再將考生答案讀出供給教師評分。
(2)查看分數統計
教師修改好試卷之后,系統將成績匯總,生成各分數段統計信息,并提供給老師查看,以便教師能了解學生的學習情況。
(3)個人信息維護
教師登陸系統之后也可以對個人信息進行查看和修改。
3.管理員
系統管理員登陸系統后主要進行四類操作:考題維護,考試信息維護,用戶維護和個人信息維護
(1)考題的維護
管理員可以往題中添加考題,修改錯誤試題和刪除無用試題。
(2)考試信息的維護
考試信息的維護主要是對于考試設置信息進行維護,這些信息主要是考試總時間,試題數量,各試題分值的分布等。
(3)用戶維護
系統管理員可以對用戶信息(包括學生信息,教師信息等)進行增,刪,改查操作。
(4)個人信息維護
管理員也可以對自己的基本信息的維護
3.2總體設計
3.2.1系統數據流圖
據分析系統數據流圖如圖3.1所示
?圖3.1系統數據流圖
3.2.2 系統的功能模塊圖
根據3.1所述需求,設計出系統功能模塊如圖3.2所示
?圖3.2系統的功能模塊圖
3.2.3 系統功能模塊
1、 在線考試
在線考試的流程如下:
首先系統按照一定的算法為登陸的考生隨機選取一定的試題生成考試試卷,考生在系統生成好試卷后進行答題操作。答題必須在規定的時間內進行,此時間是由管理員事先設置好的,如在規定的時間內沒有完成答題,系統將強制提交學生考試試卷進。考生在試卷提交后系統自動地為客觀題進行評分,本系統的客觀題主要是單選題,多選題和判斷題。其數據流圖如3.3所示。
?圖3.3第2層在線考試數據流圖
2、成績查詢
? ?考生根據用戶編號查詢考試成績信息。成績信息包括單選題得分,多選題得分等詳細信息。頁面提供對相應科目試卷的鏈接,使得學生還可以查詢自己的考卷,了解自己的考試情況。
3、 查看/修改考生試卷
? ?系統首先將考生的試卷讀出,再提提醒老師對主觀題進評分,等老師對主觀題進行評分后系統生成考生的成績信息,其數據流圖如圖3.4所示。
? ??
圖3.4第2層修改學生試卷數據流圖
4、分數段統計
? ? 當教師對考卷的主觀題評定后,系統能自動生成分數段統計信息供給老師查看。此功能有助于老師了解學生的學生情況,以便更好的教學。
5、試題維護
試題維護是后臺管理員的重要功能,它包括對試題的添加,修改,刪除操作。為了使界面更友好,管理員在試題維護時系統會先將考試試題讀出,再提供給管理中員操作。其數據流圖如圖3.5所示
?
圖3.5 第2層考題維護數據流圖
6、考試設置信息維護
考試設置信息維護是管理員對考試設置信息維護,它包括對考試設置信息的添加,修改,刪除。這些考試信息包括考試時間,各題的數量和分值等。其數據流圖如圖3.6所示。
?
圖3.6 第2層考試設置信息維護數據流圖
7、用戶管理
? ?用戶管理是管理員對系統用戶信息的管理。這些用戶包括學生和教師。用戶管理操作包括添加用戶,更新用戶和刪除用戶。管理用戶時,系統會先將用戶信息讀出供給管理員參考,再提供給管理員操作。其數據流圖如圖3.7所示。
?
圖3.7 第2層用戶管理數據流圖
8、個人信息維護
學生,教師,管理員都可以對個人信息進行維護。維護操作包括對個人基本信息進行修改,修改密碼等。系統能提供極為友好的界面方便用戶操作。
3.3 數據庫設計
3.3.1數據字典
通過對系統功能的分析可知,本系統主要包括如下的數據庫信息:
(1)用戶表,該表保存了系統用戶的基本信息,屬性有用戶編號、用戶名稱、用戶類型、用戶性別。其中用戶編號為主碼,它是用戶信息的唯一標識。表結構如表3.1所示。
(2)考生標記表,該表用于保存考生是否已經考試的標識信息,屬性有用戶編號、課程名稱、標識信息。其中用戶編號和課課程名稱共同作為主碼。表結構如表3.2所示。
(3)考題表,該表用于保存考題的基本信息,屬性有考題編號,課程名稱,考題類型,題目級參考答案等。其中考題編號為主碼。表結構如表3.3所示。
(4)試卷設置表,該表用于記錄相應課程的考試設置的相關信息,屬性有課程名稱,單選題、多選題、判斷題、簡答題、編程題數量和分值,考試時間等。其中課程名稱為主碼。表結構如表3.4所示。
(5)試卷表,該表用于保存考生的試卷信息,屬性有考生編號,課程名稱,考題類型,考生答案和得分等。其中考生編號和課程名稱共同作為主碼。表結構如表3.5所示。
(6)成績表,該表用于保存考生的考試成績信息,屬性有考生編號,課程名稱,各考題得分,總得分。其中考生編號和課程名稱共同作為主碼。表結構如表3.6所示。
系統表結構如下:
表3.1用戶表(UserInfo)
字段?? ?類型?? ?允許為空?? ?說明?? ?備注
Uid?? ?Varchar(10)?? ?否?? ?用戶編號?? ?pk
name?? ?Varchar(50)?? ?否?? ?用戶姓名?? ?
utype?? ?int?? ?否?? ?用戶類型?? ?1為學生,2為教師,3為管理員
password?? ?Varchar(10)?? ?否?? ?密碼?? ?
sex?? ?Varchar(2)?? ?是?? ?性別?? ?
表3.2用戶標記表(userflag)
字段?? ?類型?? ?允許為空?? ?說明?? ?備注
Uid?? ?Varchar(10)?? ?否?? ?用戶編號?? ?pk
Course?? ?Varchar(20)?? ?否?? ?課程名稱?? ?pk
flag?? ?int?? ?否?? ?用戶標記?? ?0試卷未提交 1試卷已提交
表3.3考題表(Question)
字段?? ?類型?? ?允許為空?? ?說明?? ?備注
Qid?? ?int?? ?否?? ?考題編號?? ?pk 自增長
qtype?? ?int?? ?否?? ?考題類型?? ?1單選題 2多選題 3判斷題 4簡答題 5編程題
course?? ?Varchar(20)?? ?否?? ?課程名稱?? ?
ques?? ?Text?? ?否?? ?題目?? ?
keyA?? ?Varchar(50)?? ?是?? ?選項A?? ?
keyB?? ?Varchar(50)?? ?是?? ?選項B?? ?
keyC?? ?Varchar(50)?? ?是?? ?選項C?? ?
keyD?? ?Varchar(50)?? ?是?? ?選項D?? ?
answer?? ?text?? ?否?? ?參考答案?? ?
表5.4考試設置表(TestSet)
字段?? ?類型?? ?允許為空?? ?說明?? ?備注
course?? ?Varchar(20)?? ?否?? ?科目?? ?pk
sinc?? ?int?? ?否?? ?單選題數?? ?
persin?? ?int?? ?否?? ?每個單選題的分值?? ?
mulc?? ?Int?? ?否?? ?多選題數?? ?
permul?? ?int?? ?否?? ?每個多選題的分值?? ?
judge?? ?Int?? ?否?? ?判斷題數?? ?
perju?? ?Int?? ?否?? ?每個判斷題的分值?? ?
jd?? ?Int?? ?否?? ?簡答題數?? ?
perjd?? ?Int?? ?否?? ?每個簡答題的分值?? ?
program?? ?Int?? ?否?? ?編程題數?? ?
perpro?? ?Int?? ?否?? ?每個編程題的分值?? ?
totaltime?? ?Int?? ?否?? ?考試時間?? ?
表5.5試卷表(test)
字段?? ?類型?? ?允許為空?? ?說明?? ?備注
Uid?? ?Varchar(10)?? ?否?? ?用戶編號?? ?pk
Qid?? ?int?? ?否?? ?考題編號?? ?pk ? 題庫中的題號
Course?? ?Varchar(20)?? ?否?? ?課程名稱?? ?
Qtype?? ?int?? ?否?? ?考題類型?? ?1單選題 2多選題 3判斷題 4簡答題 5編程題
answer?? ?Text?? ?是?? ?考生答案?? ?
Tnumber?? ?int?? ?否?? ?題目編號?? ?試卷中的第幾題
score?? ?float?? ?是?? ?得分?? ?
表5.6成績表(test)
字段?? ?類型?? ?允許為空?? ?說明?? ?備注
Uid?? ?Varchar(10)?? ?否?? ?用戶編號?? ?pk
Course?? ?Varchar(20)?? ?否?? ?課程名稱?? ?pk
score?? ?float?? ?否?? ?總得分?? ?
single?? ?float?? ?否?? ?單選題得分?? ?
multiply?? ?float?? ?否?? ?多選題得分?? ?
judge?? ?float?? ?否?? ?判斷題得分?? ?
jd?? ?float?? ?否?? ?簡答題得分?? ?
program?? ?float?? ?否?? ?編程題得分?? ?
3.3.2 實體關系圖
? ? 據分析系統實體關系圖如圖3.8所示:
?圖3.8 系統E-R圖
系統各實體關系如下:
用戶:用戶標記 1:N
考試設置:用戶標記 1:N
考題:考試設置 N:1
考題:試卷 1:N
用戶:試卷 1:N
試卷:成績 N:1
用戶:成績 1:N
3.3.3數據庫的連接
在本系統中我們使用JDBC-ODBC橋連接,要進行數據庫連接首先要配置數據源。按3.3.1和3.3.2的設計,設計好數據庫ExamOnlie,再建一個名為ExamOnline的數據源。系統連接數據庫的流程圖如圖3.9所示:
?
圖3.9系統連接數據庫流程圖
建立數據庫連接和關閉數據庫連接操作方法代碼及說明如下,這些方法位于DBAccess類中,當作工具類來用
static{//靜態代碼塊,在類被實例化時被調用,且只被調用一次
? ? ?? ? ? try{
? ? ?? ??? ? ? ?Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//注冊驅動
? ? ? ?? ? ?}catch(ClassNotFoundException e)
? ? ? ? ?? ? ?{
? ? ?? ??? ? ? throw new ExceptionInInitializerError(e);
? ? ?? ? ? ? ?}
}
//得到連接
? ? public Connection getConnection()
? ? {
? ? ?? ??? ?
? ? ?? ?try{?
? ? ?? ??? ?connectionconn = DriverManager.getConnection("jdbc:odbc:ExamOnline"); ?//獲得數據庫連接
? ? ?? ? ? }catch(Exception e)
? ? ? {
? ? ? ?e.printStackTrace();
? ? ? ?out.print(e.toString());
? ? ? }
? ? ?? ? return conn;
? ? }
//關閉數據庫連接
public void CloseDB(Connection conn,Statement sm,ResultSet rs)
? ? {
? ? ?? ?try {
? ? ?? ??? ? if(rs!=null)
? ? ?? ??? ? {
? ? ?? ??? ??? ?rs.close();
? ? ?? ??? ? }
?? ??? ?}catch (Exception e)?
?? ??? ?{
?? ??? ? ?e.printStackTrace();
?? ??? ? ?out.print("數據庫關閉失敗!");
?? ??? ?}finally
?? ??? ?{
?? ??? ??? ?try{
?? ??? ??? ??? ?if(sm!=null)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?sm.close();
?? ??? ??? ??? ?}
?? ??? ??? ?}catch(Exception e)
?? ??? ??? ?{
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ??? ?out.print("數據庫關閉失敗!");
?? ??? ??? ?}finally
?? ??? ??? ?{
?? ??? ??? ??? ?try{
?? ??? ??? ??? ??? ?if(conn!=null)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?conn.close();
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ?}catch(Exception e)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ??? ??? ?out.print("數據庫關閉失敗!");
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
}
3.4 詳細設計
3.4.1公共類設計
1.Domain類設計
由于數據庫使用的類系統模型,而java數據為對象模型,使得其模型不匹配。為了方便關系模型和對象模型間的轉換,建應的Domain類,即數據庫中每個表對應一個類,表中類屬性對應表的各屬性,再為各個屬性設計一個讀方法(get)和一個寫方法(set)如用戶類:
public class User {
?? ?private String id="";
?? ?private String name="";
?? ?private int type=1;
?? ?private String password="";
?? ?private String sex = "";
?? ?public String getSex();
?? ?public void setSex(String sex) ;
?? ?public String getPassword();
?? ?public void setPassword(String password);
?? ?public String getId();
?? ?public void setId(String id);
?? ?public String getName();
?? ?public void setName(String name);
?? ?public int getType();
?? ?public void setType(int type);
}
表和類的對應關系如下:
用戶表(UserInfo)——用戶類(User)
用戶標記表(userflag)——用戶標記類(UserFlag)
考題表(Question)——考題類(Question)
試卷表(test)——試卷類(Test)
試卷設置表(test_set)——試卷設置類(Test)
成績表(record)——成績類(Record)
試卷考題類(TestQuestion)——試卷表和考題表聯合查詢視圖
2.公具類設計
根據系統設計需求,設計如下工具類:
數據庫連接工具類,主要提供連接數據操作等相關方法
public class DBAccess {?
//得到數據庫連接
public Connection getConnection()
//并閉數據庫連接
? ? public void CloseDB(Connection conn,Statement sm,ResultSet rs)
? ?}
用戶操作相關類,主要提供對用戶表操作的相關類
public class UserUtil {
//根據用戶編號得到用戶信息
?? ?public User getUser(String Uid)?
//驗證登陸信息,根據用戶名、密碼和用戶類型
?? ?public boolean checkUser(String userName,String password,int type)?? ?//修改用戶信息
public boolean motifyUser(User user)?
?? ?//添加用戶信息
?? ?public boolean insertUser(User user)?
? ? //修改密碼
?? ?public boolean motifyPassword(String Uid,String password)?
?? ?//得到指定頁的用戶
public ArrayList getAllUser(int pageSize,int current)
//得到用戶數量
?? ?public int getCount()
? ? //刪除用戶信息
?? ?public boolean deleteUser(String Uid)?
}
用戶標記工具類,主要提供對用戶標記表的相關操作方法
public class UserFlagUtil {
? //得到交卷信息
? public int getFlag(String Uid,String course)?
? //設置交卷信息
public boolean setFlag(String Uid,String course) ?
}
考題工具類,主要提供對考題表的相關操作方法
Public class QuestionUtil{
? ?///得到選擇題的方法
?? ?public ArrayList getQuestion(String course,int count,int type)?? ?
//得到數據庫中題目數量
public int getCount(int type,String course)
//得到數據庫中題目數量
?? ?public int getCount()
? ? //通過考題編號得到考題
public Question getQuestionById(int Qid)
//得到指定頁的試題目信息
public ArrayList getAllQuestion(int pageSize,int current) ??
//添加試題信息
public boolean insertQuestioin(Question ques)?
//修改試題信息
public boolean updateQuestion(Question ques)?
//刪除試題信息
public boolean deleteTest(int Qid)
//獲取科目
? ? public ArrayList getCourse()
}
試卷工具類,主要提供對試卷表的相關操作方法
public class TestUtil {
? ? //添加試卷信息
?? ?public boolean insertTest(ArrayList al)
? ? //考生的名字和學號
?? ?public ArrayList getStudent(String course)
? ? //獲得試卷庫中相應題型的題
?? ?public ArrayList getTest(String Uid,String course,int type)
? ? //修改試卷庫中相應試題的分數
?? ?public boolean updateTest(String Uid,int Qid,float score)?? ?
}
考試設置工具類,主要提供對考試設置表的相關操作方法
public class TestSetUtil {
? ? //根據課程名稱得到考試設置信息
?? ?public TestSet getTestSet(String course)?
?? ?//計算考題總分
?? ?public int getTotalScore(TestSet ts)?
? ? //獲得總記錄
?? ?public int getCount()
? ? //得到指定頁的考試信息
?? ?public ArrayList getAllTestSet(int pageSize,int current)
? ? //添加或修改考試設置,flag=0為添加,flag=1為修改
?? ?public boolean insertOrUpdate(TestSet ts,int flag)?? ?
? ?//刪除考試設置信息
public boolean deleteTest(String course)?
}
成績工具類,主要提供對成績表的相關操作方法
public class RecordUtil {
?? ?public DBAccess db = new DBAccess();
?? ?//獲取考生指定課程的得分信息
? ?public Record getRecord(String Uid,String course)?
? ?//判斷學生成績是否存在
? ?public boolean getUser(String Uid,String course)?
? ?//獲取及格人數
? ?public int getPass(String course)?
? ?//獲取該課程總考試人數
? ?public int getCount(String course)?
? ?//獲分數段人數
? ?public int getCountByScore(String course,int score)?
? ?//得到學生的全部成績
? ?public ArrayList getAll(String Uid) }
}
試卷考題工具類,主要提供對試卷表考題表聯合查詢視圖的相關操作方法
public class TestQuestionUtil {
? ? ?//獲得試卷庫中相應題型的題
?? ?public ArrayList getTest(String Uid,String course,int type)
}
3.4.2在線考試模塊設計
在線考試流程為:首先系統將考試信息和考生個人信息提供給考生,并要求考生核對個人信息。在考試開始時系統按照一定的算法為登陸的考生隨機選取一定的試題生成考試試卷,考生在系統生成好試卷后進行答題操作。答題必須在規定的時間內進行,此時間是由管理員事先設置好的,如在規定的時間內沒有完成答題,系統將強制提交學生考試試卷進。考生在試卷提交后系統自動地為客觀題進行評分,并將試卷保存,供給老師查看或修改。在線考試流程圖如圖3.10所示。
隨機抽題算法:產生一個隨機整數,這個數在0和相應題型總考題數之間。從這個隨機數開始抽取取試題,抽取數量為試卷設置中相應題型的個數(此數小于總題數),若取到最后一道還不滿足取題數量,再從第一題開始選取,其抽題流程如圖3.11如示。
?
圖3.10 在線考試流程
?
圖3.11 選題流程
關鍵代碼及說明
隨機選題操作方法主要代碼及說明,此方法位于QuestUtil中。些方法輸入參數為課程名稱course,需要題數count,試題類型type;輸出為一個包含抽取的試題信息的集合ArrayList:
public ArrayList getQuestion(String course,int count,int type)
{
ArrayList al = new ArrayList();
//得到課程名稱為course,考題類型為type的考題總數
int totalCount = this.getCount(type,course);
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
//隨機產生一個0-總題數之間的隨機整數
int temp = (int)(Math.random()*totalCount); try{
?? ?conn = new DBAccess.getConnection();
?? ?for(int i = 0;i<count;i++)//取題
?? ?{
?? ? ?int tempCount = (temp+i)%totalCount;
? //sql語句
?? ? ?String sql = "select top 1 * from Question where qtype="+type+" and course='"+course+"' and Qid not in(select top "+tempCount+" Qid from Question where qtype="+type+" and course='"+course+"')";
?? ? ? ps = conn.prepareStatement(sql);
?? ? ? rs = ps.executeQuery();
?? ? ? Question ques = new Question();
?? ? ? if(rs.next())
?? ? ? {
? ? ? ? ? ?//保存試題
?? ??? ? ques.setId(rs.getInt(1));
?? ??? ? ques.setType(1);
?? ??? ? ques.setQues(rs.getString(4));
?? ??? ? ques.setKeyA(rs.getString(5));
?? ??? ? ques.setKeyB(rs.getString(6));
?? ??? ? ques.setKeyC(rs.getString(7));
?? ??? ? ques.setKeyD(rs.getString(8));
?? ??? ? ques.setAnswer(rs.getString(9));
?? ??? ? al.add(ques);
?? ??? ?}
?? ? ?}
?? ?}catch(Exception e)
{
?? ??? ?e.printStackTrace();//打印出異常信息
?? ??? ?}finally
?? ??? ?{
?? ??? ??? ?db.CloseDB(conn, ps, rs);//關閉數據庫連接
?? ??? ??? ?return al;
?? ??? ?}
?? ?}
生成試卷關鍵代碼及說明(以生成單選題為例)
<%
? ? ? String course = (String)session.getAttribute("course");
//從session中得到課程名稱
String Uid = (String)session.getAttribute("Uid");
//從session中得到用戶編號
String name = (String)session.getAttribute("name");
//得到試卷設置工具實例
TestSetUtil testUtil = new TestSetUtil();
//得到試卷設置實例
TestSet ts = testUtil.getTestSet(course.trim());
? ? ? ArrayList al=null;
? QuestionUtil questionUtil = new QuestionUtil();
? ? ? Question qs = new Question();
%>
? ? <div class="singleChoice">
? ? ? ? <strong>一、單選題</strong> (共<%=ts.getSinChCount()%>題,每題<%=ts.getPerSinScore()%>分)
? ? ? ? <%
? ? ? ? ? //得到考題
? ? ? ? ? al = questionUtil.getQuestion(course,ts.getSinChCount(),1);
? ? ? ? ? for(int i=0;i<al.size();i++)
? ? ? ? ? {
? ? ? ? ? ? qs = (Question)al.get(i);
? ? ? ? ?%>
? ? ? ? ? <divname="stuChoice<%=i%>">
<%=i+1%>.<%=qs.getQues().trim()%>
</div>
? ? ? ? ? <input type="radio" name="choice<%=i%>Value" value="A"/>
A.<%=qs.getKeyA()==null?"":qs.getKeyA().trim()%><br/>
? ? ? ? ? <input type="radio" name="choice<%=i%>Value" value="B"/>
B.<%=qs.getKeyB()==null?"":qs.getKeyB().trim()%><br/>
? ? ? ? ? <input type="radio" name="choice<%=i%>Value" value="C"/>
C.<%=qs.getKeyC()==null?"":qs.getKeyC().trim()%><br/>
? ? ? ? ? <input type="radio" name="choice<%=i%>Value" value="D"/>
D.<%=qs.getKeyD()==null?"":qs.getKeyD().trim()%><br/>
? ? ? ? ? <input type="hidden"value="<%=qs.getId()%>"name="choiceId<%=i%>"/>
? ? ? ? ? <input type="hidden" value="<%=qs.getAnswer()==null?"":qs.getAnswer().trim()%>" name="choiceAnswer<%=i%>"/>
? ? ? ? ? ?<%}%>
? ? ? </div>
試卷保存關鍵代碼及說明(以單選題的保存為例)
TestSetUtil testUtil = new TestSetUtil();
? ? ? ? TestSet ts = testUtil.getTestSet(course);
? ? ? ? TestUtil tu = new TestUtil();
? ? ? ? ArrayList al = new ArrayList();
? ? ? ? //取單選題
?? ??? ?for(int i=0;i<ts.getSinChCount();i++)
?? ??? ?{
?? ??? ??? ?Test test = new Test();
? ? ? ? ? ? ?//從隱藏表單元素中取題庫中題號
?? ??? ??? ?int qid = Integer.parseInt(request.getParameter("choiceId"+i));
? ? ? ? ?//取考生答案
?? ??? ??? ?String stuAnswer = request.getParameter("choice"+i+"Value");
?? ??? ?stuAnswer = stuAnswer==null?"":stuAnswer;
?? ??? ??? ?int tnumber = i;//題號
?? ??? ??? ?int type = 1;//題的類型?
? ? ? ? ? ? ?//取正確答案
?? ??? ?String answer = request.getParameter("choiceAnswer"+i);?? ??? ??? ? ? ?//計算考生得分
int score=
(answer.equalsIgnoreCase(stuAnswer))?ts.getPerSinScore():0;?? ??? ?test.setQid(qid);
?? ??? ??? ?test.setUid(uid);
?? ??? ??? ?test.setCourse(course);
?? ??? ??? ?test.setScore(score);
?? ??? ??? ?test.setStuAnswer(stuAnswer);
?? ??? ??? ?test.setType(type);
?? ??? ??? ?test.setTnumber(tnumber);
?? ??? ??? ?al.add(test);
?? ?}
? ?boolean success = tu.insertTest(al);
3.4.3成績查詢模塊設計
考生根據用戶編號查詢考試成績信息,查詢到的成績是考生的所有課程的成績。成績信息包括單選題得分,多選題得分等詳細信息。
得到學生成績的函數getAll()定義如下,它位于RecordUtil類中,輸入參數為考生編號Uid,輸入為封裝了學生所有成績信息的一個集全元素ArrayList:
? ?public ArrayList getAll(String Uid)?
? ?{
?? ? ? ArrayList al = new ArrayList();
?? ? ? Connection conn = new DBAccess().getConnection();
?? ? ? PreparedStatement ps = null;
?? ? ? ResultSet rs = null;
?? ? ? try
?? ? ? {
?? ??? ? ? String sql = "select * from record where Uid=?";
?? ??? ? ? ps = conn.prepareStatement(sql);
?? ??? ? ? ps.setString(1, Uid);
?? ??? ? ? rs = ps.executeQuery();
?? ??? ? ? while(rs.next())
?? ??? ? ? {
?? ??? ??? ? ? Record record = new Record();
?? ??? ??? ? ? record.setUid(rs.getString(1));
?? ??? ??? ? ? record.setCourse(rs.getString(2));
?? ??? ??? ? ? record.setScore(rs.getFloat(3));
?? ??? ??? ? ? record.setSingle(rs.getFloat(4));
?? ??? ??? ? ? record.setMultiply(rs.getFloat(5));
?? ??? ??? ? ? record.setJudge(rs.getFloat(6));
?? ??? ??? ? ? record.setJd(rs.getFloat(7));
?? ??? ??? ? ? record.setProgram(rs.getFloat(8));
?? ??? ??? ? ? al.add(record);
?? ??? ? ? }
?? ??? ? ??
?? ? ? }catch(Exception e)
?? ? ? {
?? ??? ? ? e.printStackTrace();
?? ? ? }finally
?? ? ? {
?? ??? ? ? new DBAccess().CloseDB(conn, ps, rs);
?? ??? ? ? return al;
?? ? ? }?
? ?}
3.4.4查看/修改考生試卷模塊設計
教師登陸后,可以對考生試卷進行查看和修改。系統首先將考生的試卷讀出,教師可能看到系統對試卷主觀題的評定。系統會提提醒老師對主觀題進評分,等老師對主觀題進行評分,系統會將保存對學生試卷的評定,而后生成考生的成績信息。查看/修改考生試卷的流程圖如圖3.12所示
?
圖3.12查看/修改學生試卷流程
教師提交評定的關鍵代碼設計及說明如下:
? ? ? ?//獲取學生學號
?? ? ? ?String Uid = request.getParameter("Uid");?? ?
? ?//獲取session中的課程名稱
?? ?String course = (String)session.getAttribute("course");
?? ??? ?TestUtil tu = new TestUtil();
?? ??? ?TestSetUtil tsu = new TestSetUtil();
?? ??? ?Record record = new Record();
?? ??? ?RecordUtil ru = new RecordUtil();
? ? ? ? //獲取試卷設置信息
?? ??? ?TestSet ts = tsu.getTestSet(course);?
?? ??? ?float singleTotal = 0;//單選題總分
?? ??? ?float multiplyTotal = 0;//多選題總分
?? ??? ?float judgeTotal = 0;//判斷題總分
?? ??? ?float jdTotal = 0;//簡答題總分
?? ??? ?float programTotal=0;//編程題總分
?? ??? ?float total=0;
?? ??? ?for(int i=0;i<ts.getSinChCount();i++)//獲取單選題分數
?? ??? ?{
?? ??? ??? ?float score = Float.parseFloat(request.getParameter("choice"+i));
?? ??? ??? ?singleTotal+=score;
?? ??? ?}
?? ??? ?for(int i=0;i<ts.getMulChCount();i++)//獲取多選題分數
?? ??? ?{
?? ??? ??? ?float score = Float.parseFloat(request.getParameter("mulChoice"+i));
?? ??? ??? ?multiplyTotal+=score;
?? ??? ?}
?? ??? ?for(int i=0;i<ts.getJudgeCount();i++)//獲取判斷題分數
?? ??? ?{
?? ??? ??? ?float score = Float.parseFloat(request.getParameter("judge"+i));
?? ??? ??? ?judgeTotal+=score;
?? ??? ?}
?? ??? ?for(int i=0;i<ts.getJdCount();i++)//獲取簡答題分數
?? ??? ?{
?? ??? ??? ?float score = Float.parseFloat(request.getParameter("jd"+i));
?? ??? ??? ?jdTotal+=score;
?? ??? ??? ?int Qid = Integer.parseInt(request.getParameter("jdId"+i));
?? ??? ??? ?tu.updateTest(Uid, Qid, score);//修改試卷庫中相應簡答題的分數
?? ??? ??? ?
?? ??? ?}
?? ??? ?for(int i=0;i<ts.getProgramCount();i++)//獲取編程題分數
?? ??? ?{
?? ??? ??? ?float score = Float.parseFloat(request.getParameter("pro"+i));
?? ??? ??? ?programTotal+=score;
?? ??? ??? ?int Qid = Integer.parseInt(request.getParameter("proId"+i));
?? ??? ??? ?tu.updateTest(Uid, Qid, score);
?? ??? ??? ?
?? ??? ?}
?? ??? ?total = singleTotal+multiplyTotal+judgeTotal+jdTotal+programTotal;
?? ??? ?record.setUid(Uid);
?? ??? ?record.setCourse(course);
?? ??? ?record.setScore(total);
?? ??? ?record.setSingle(singleTotal);
?? ??? ?record.setMultiply(multiplyTotal);
?? ??? ?record.setJudge(judgeTotal);
?? ??? ?record.setJd(jdTotal);
?? ??? ?record.setProgram(programTotal);
?? ??? ?//System.out.print(record.getUid()+record.getCourse());
?? ??? ?if(ru.updateRecord(record))
?? ??? ?{
?? ?response.sendRedirect(request.getContextPath()
+"/teacher/success.html");
?? ??? ?}else
?? ??? ?{
?? ??? ??? ?response.sendRedirect(request.getContextPath()
+"/teacher/fail.html");
?? ??? ?}
3.4.5分數段統計模塊設計
當教師對考卷的主觀題評定后,系統能自動生成分數段統計信息供給老師查看。統計分數段包括及格率、60-69分、70-79、80-89和90分以上,在統計數量的同時并計算出占數考人數量的比例。
其統計功能的關鍵代碼及說明如下:
?//獲取要統計的分數段
? ? ? String scoreString = request.getParameter("score").trim();
? ? ? //獲取要統計的課程名稱
String course = (String)session.getAttribute("course");
? ? ? RecordUtil ru = new RecordUtil();
? ? ? //得到考生總數
? ? ? int count = ru.getCount(course);
? ? ? int pass = 0;//要統計的分數段人數
? ? ? if("pass".equals(scoreString))//如果統計的是及格率
? ? ? {?
? ? ? ?pass = ru.getPass(course);
? ? ? }else
? ? ? {
? ? ? ?int score = Integer.parseInt(scoreString);?
? ? ? ?pass = ru.getCountByScore(course,score);
? ? ? }
? ? ? ?//計算比例,由于要用count作為除數,所以必須排出count為0的情況
? ?String percent =?
count==0?"0.0%":((float)pass)/((float)count)*100+"%";
3.4.6試題維護模塊設計
試題維護是后臺管理員的重要功能,它包括對試題的添加,修改,刪除操作。在進行此操作時系統會先將考試試題讀出,再提供給管理中員操作。試題維護流程圖如圖3.13所示。
? ?圖3.13考題維護流程
關鍵代碼如下:
添加考題關鍵代碼及說明如下:
?? ?//獲取課程名稱,由于課程名稱可能包含有漢字,所以要對其進行編碼,這里我們用gbk進行編碼
String kemu = request.getParameter("kemu").trim();
?? ?String ch_course = "course"+kemu;
?? ?String course =?
new String(request.getParameter(ch_course).getBytes("iso8859-1"),"gbk");
?//獲取題目類型
?? ? int type = Integer.parseInt(request.getParameter("type").trim());
?? ?String ques = new String(request.getParameter("ques").getBytes("iso8859-1"),"gbk");
? ? ? ? //選項A
?? ??? ?String keyA = null;
? ? ? ? //選項B
?? ??? ?String keyB = null;
? ? ? ? //選項C
?? ??? ?String keyC = null;
? ? ? ? //選項D
?? ??? ?String keyD = null;
? ? ? ? //參考答案
?? ??? ?String answer = "";
?? ??? ?QuestionUtil qu = new QuestionUtil();
?? ??? ?Question question = new Question();
?? ??? ?if(type==1)//單選題
?? ??? ?{
?? ??? ??? ?keyA = new String(request.getParameter("keyA").getBytes("iso8859-1"),"gbk").trim();
?? ??? ??? ?keyB = new String(request.getParameter("keyB").getBytes("iso8859-1"),"gbk").trim();
?? ??? ??? ?keyC = new String(request.getParameter("keyC").getBytes("iso8859-1"),"gbk").trim();
?? ??? ??? ?keyD = new String(request.getParameter("keyD").getBytes("iso8859-1"),"gbk").trim();
?? ??? ??? ?answer = request.getParameter("answer_sin").trim();
?? ??? ?}else if(type==2)//多選題
?? ??? ?{
?? ??? ??? ?keyA = new String(request.getParameter("keyA").getBytes("iso8859-1"),"gbk").trim();
?? ??? ??? ?keyB = new String(request.getParameter("keyB").getBytes("iso8859-1"),"gbk").trim();
?? ??? ??? ?keyC = new String(request.getParameter("keyC").getBytes("iso8859-1"),"gbk").trim();
?? ??? ??? ?keyD = new String(request.getParameter("keyD").getBytes("iso8859-1"),"gbk").trim();
?? ??? ??? ? ? ?String[] str_answer = request.getParameterValues("answer_mul");
?? ??? ??? ?for(int i = 0;i < str_answer.length;i++)
?? ??? ??? ?{
?? ??? ??? ??? ?answer = answer + str_answer[i];
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ?}else if(type==3)//判斷題
?? ??? ?{
?? ??? ??? ?answer = request.getParameter("answer_jud");
?? ??? ?}else//簡答題,設計題
?? ??? ?{
?? ??? ??? ?answer = new String(request.getParameter("answer_other").getBytes("iso8859-1"),"gbk").trim();
?? ??? ?}
?? ??? ?question.setCourse(course);
?? ??? ?question.setType(type);
?? ??? ?question.setQues(ques);
?? ??? ?question.setKeyA(keyA);
?? ??? ?question.setKeyB(keyB);
?? ??? ?question.setKeyC(keyC);
?? ??? ?question.setKeyD(keyD);
?? ??? ?question.setAnswer(answer);
?? ??? ?boolean success = qu.insertQuestioin(question);
?? ??? ?if(success)
?? ??? ?{
?? ?response.sendRedirect(request.getContextPath()+"/admin/AddQuesSuccess.html");
?? ??? ?}else
?? ??? ?{
?? ??? ? response.sendRedirect(request.getContextPath()+"/Fail.html");
?? ??? ?}
由于修改考題信息與添加考題信息的方法類似在此我們不再細說。下面是刪除考題信息關鍵代碼及說明
Javascript代碼,提醒用戶是否刪除.
function IsDelete(obj)
? ? ? ?{
? ? ? ? ?var okey = confirm("確認刪除?");
? ? ? ? ?if(okey==true)
? ? ? ? ?{?
? ? ? ? ? ?var keyWord = obj.value;
window.location.href="<%=path%>/admin/DeleteQuestion.jsp?Qid="+keyWord;
? ? ? ? ?}
}
刪除考題代碼:
String str_qid = request.getParameter("Qid").trim();
int Qid = Integer.parseInt(str_qid);
? ? ? ? boolean success = new QuestionUtil().deleteTest(Qid);?? ?
3.4.7考試設置信息維護模塊設計
考試設置信息維護是管理員對考試設置信息維護,它包括對考試設置信息的添加,修改,刪除。這些考試信息包括考試時間,各題的數量和分值等。設置時,系統先讀取已存在的考試設置信息供給管理員查詢,再提供給管理員操作。考試設置信護流程圖如圖3.14所示。
?
圖3.14考試設置信息維護流程
添加/修改考試設置信息關鍵代碼及說明如下:
//獲取課程名稱,同樣這里用gbk對接收到的信息進行編碼
String course = new String(request.getParameter("course").getBytes("iso8859-1"),"gbk");
//獲取單選題總數
?? ??? ?int singleCount =Integer.parseInt(request.getParameter("singleCount"));
?? ?//獲取單個單選題分值
?? ?int perSingle = Integer.parseInt(request.getParameter("perSingle"));
?? ?//獲取多選題總數?? ?
int multiplyCount=Integer.parseInt(request.getParameter("multiplyCount"));
//獲取單個多選題分值
?? ??? ?int perMultiply = Integer.parseInt(request.getParameter("perMultiply"));
?? ?//獲取判斷題總數?
?? ?int judgeCount = Integer.parseInt(request.getParameter("judgeCount"));
//獲取單個判斷題分值
?? ?int perJudge = Integer.parseInt(request.getParameter("perJudge"));
?? ??? ?//獲取簡答題總數
int jdCount = Integer.parseInt(request.getParameter("jdCount"));
?? ?//獲取單個簡答題分值
int perJd = Integer.parseInt(request.getParameter("perJd"));
?? ?//獲取設計題總數
?? ?int programCount = Integer.parseInt(request.getParameter("programCount"));
?? ?//獲取單個設計題分值
?? ?int perProgram = Integer.parseInt(request.getParameter("perProgram"));
?? ?//獲取總考試時間
int totalTime = Integer.parseInt(request.getParameter("totalTime"));
?? ?int flag = Integer.parseInt(request.getParameter("flag"));
?? ?TestSetUtil tsu = new TestSetUtil();
?? ?TestSet ts = new TestSet();
?? ?ts.setCourse(course);
?? ?ts.setSinChCount(singleCount);
?? ?ts.setPerSinScore(perSingle);
?? ?ts.setMulChCount(multiplyCount);
?? ?ts.setPerMulScore(perMultiply);
?? ?ts.setJudgeCount(judgeCount);
?? ?ts.setPerJudScore(perJudge);
?? ?ts.setJdCount(jdCount);
?? ?ts.setPerJdScore(perJd);
?? ?ts.setProgramCount(programCount);
?? ?ts.setPerProScore(perProgram);
?? ?ts.setTotaltime(totalTime);
?? ?boolean success = tsu.insertOrUpdate(ts, flag);
?? ?if(success)
?? ?{
?? ??? ??? ?response.sendRedirect(
request.getContextPath()+"/admin/TestSucces ? ? ?s.html");
?? ??? ??? ?
?? ??? ?}else
?? ??? ?{
?? ??? ?response.sendRedirect(request.getContextPath()+"/Fail.html");
}
由于刪除考試設置信息同刪除考題功能類似,這時也不再詳講,如有疑問請參考前面刪除考題信息功能。
3.4.8用戶管理模塊設計
用戶管理是管理員對系統用戶信息的管理。這些用戶包括學生和教師。用戶管理操作包括添加用戶,更新用戶和刪除用戶。添加用戶時,刪除管理用戶時,系統會先將用戶信息讀出供給管理員參考,再提供給管理員操作。用戶密碼不用設置,系統默認為“123456”;修改用戶時用戶編號和用戶密碼不能被修改其它均能被修改;用戶時,系統會先提醒管理員是否刪除,若果確認刪除才能刪除用戶。用戶管理流程圖如圖3.15所示。
?
圖3.15用戶管理流程
添加/更新用戶的關鍵代碼及說明如下:
//獲取用戶名,這里也用gbk對其進行編碼
String name=new String(request.getParameter("name").getBytes("iso8859-1"),"gbk").trim();
//獲取用戶類型,1為學生,2為教師,3為管理員
?? ? ?int type=Integer.parseInt(request.getParameter("type"));
?? ? ?//獲取性別,用gbk對其進行編著碼
String sex=new String(request.getParameter("sex").getBytes("iso8859-1"),"gbk").trim();
?? ??? ?String password = "123456";//初始密碼設為123456
? ? ? ? //獲取操作標志,0為添加用戶信息,1為更新用戶信息
?? ??? ?String flag = request.getParameter("flag").trim();
?? ??? ?UserUtil userUtil = new UserUtil();?
?? ??? ?User user = new User();
?? ??? ?boolean success = false;
?? ??? ?user.setId(Uid);
?? ??? ?user.setType(type);
?? ??? ?user.setName(name);
?? ??? ?user.setPassword(password);
?? ??? ?user.setSex(sex);
?? ??? ?if("0".equals(flag))//添加用戶
?? ??? ?{
?? ??? ? ?success= userUtil.insertUser(user);?? ?
?? ??? ??? ?
?? ??? ?}else if("1".equals(flag))//更新用戶
?? ??? ?{
?? ??? ??? ?success=userUtil.motifyUser(user);
?? ??? ?}
?? ??? ?if(success)
{?? ? ?response.sendRedirect(request.getContextPath()+"/admin/success.html");?? ?
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ?response.sendRedirect(request.getContextPath()+"/Fail.html");
}
由于刪除用戶信息同刪除考題功能類似,這時也不再詳講,如有疑問請參考前面刪除考題信息功能。
3.4.9個人信息維護模塊設計
系統用戶包括學生,教師,管理員都可以對個人信息進行維護。維護操作包括對個人基本信息進行修改,修改密碼等。系統能提供極為友好的界面方便用戶操作。對其本信息進行時,用戶不能修改自己的編號。對密碼進行修改時按昭一般系統的要求先確認舊密碼,再輸入新密碼和確認新密碼。
個人基本信息信息維護的關鍵代碼如下所示:
UserUtil userUtil = new UserUtil();
? ? ? ? //得到session
HttpSession session = request.getSession(true);
? ? ? ? //獲取session中的用戶編號
String Uid = (String)session.getAttribute("Uid");
? ? ? ? //得到用戶名,用gbk對其進行編碼
String name = new String(request.getParameter("name").trim().getBytes("iso8859-1"),"gbk");
//得到用戶類型
? ? ? ? String typeString=new String(request.getParameter("type").getBytes("iso8859-1"),"gbk");
? ? ? ? int type=1;
? ? ? ? if("教師".equals(typeString))
? ? ? ? {
? ? ? ? ?? ?type=2;
? ? ? ? }else if("管理員".equals(typeString))
? ? ? ? {
? ? ? ? ?? ?type=3;
? ? ? ? }
? ? ? ? String sex = new String(request.getParameter("sex").getBytes("iso8859-1"),"gbk").trim();
? ? ? ? User user = new User();
? ? ? ? user.setId(Uid);
? ? ? ? user.setName(name.trim());
? ? ? ? user.setType(type);
? ? ? ? user.setSex(sex);
? ? ? ? if(userUtil.motifyUser(user))
? ? ? ? { ? ? ?? ?response.sendRedirect(request.getContextPath()+"/success.html" ??
? ? ? ? }else
? ? ? ? {
? ? ? ? ?? ?response.sendRedirect(request.getContextPath()+"/Fail.html");
? }?
4 系統測試
4.1 系統運行環境?
? ? ?數據庫:SQLServer2005
? ? ?Web服務器:Tomcat6.0及以上版本
? ? ?操作系統:能運行java虛擬機的操作系統均可
4.2 測試目的
系統測試是為了發現錯誤而執行程序的過程,成功的測試是發現了至今尚未發現的錯誤的測試。
測試的目的就是希望能以最少的人力和時間發現潛在的各種錯誤和缺陷。應根據開發各階段的需求、設計等文檔或程序的內部結構精心設計測試用例,并利用這些實例來運行程序,以便發現錯誤。系統測試應包括軟件測試、硬件測試和網絡測試。硬件測試、網絡測試可以根據具體的性能指標來進行,此處所說的測試更多的是指軟件測試。系統測試是保證系統質量和可靠性的關鍵步驟,是對系統開發過程中的系統分析系統設計和實施的最后復查。
4.3 各功能模塊測試
將工程導入Tomcat的項目文件夾生即webapps文件夾中, 再啟動TomCat服務器。在瀏覽器中輸入工程的URL,如“www.localhost:8080/ExamOnline”可進入系統操作界面,用戶可以選擇操作。如圖4.1所示。
?
圖4.1系統主界面
4.3.1在線考試模塊測試
在主界面點擊學生考試,可以進入學生登陸界面。此界面在提交數據時有簡單驗證功能,如學號不能為空等,科目必須選擇等。如圖4.2所示。
?
圖4.2學生登陸界面
? ?選擇科目后進入確認信息頁面,如圖4.3所示。系統將考生的個人信息讀出到該頁面,供給考生確認。并將考試科目考試設置信息(題目分布、分值分布、考試時間等)讀出到該頁面,提供給考生。
?
圖4.3確認信息頁面
點擊開始考試,將進入到考試頁面,考生開臺答題,如圖4.4所示。在答題時系統提供剩余時間倒計時功能,以方便了角答題時間。當考試剩余時間為0時系統將自動提交試卷,并通知考生離開考場,如圖4.5所示。
?
圖4.4學生考試頁面
?
圖4.5考試結束
4.3.2查看/修改試卷測試
教師在主界面上點擊教師管理,并輸入正確的登陸信息后可以進入教師管理界面,在左邊的菜單選項中點擊“查看/修改試卷”,撐開子菜單。在撐開的子菜單中點擊考生姓名可以查看到考生的考試試卷,在如圖4.6所示。
在此界面中系統會提醒教師對主觀題進行評定,評分時系統也不一個簡單的驗證,如得分不能超過此題總分等,如圖4.7所示。
?
圖4.6查看/修改試卷界面
?
圖4.7提交修改試卷
4.3.3分數段統計測試?
? ? 當教師提交評定后,系統會生考生成績信息和該科各分數段統計信息。在教師管理主界面上點擊“分數段統計”,操作子菜單。在子菜單中點擊要統計的分數段信息。可以統計的分數段有及格率,60-69,70-79,80-89,90-100。圖4.8是及格率的統計信息。
?
圖4.8分數段統計界面
4.3.4成績查詢測試
? ? 學生在主界面點擊“學生管理”,并輸入正確的登陸信息可以進入學生管理界面。在界面中點擊左邊菜單欄中的“成績查詢”選項,可以查詢到學生的全部成績信息,如圖4.9所示。點擊“查看詳情”,學生可以看到該科的考卷及各題得分情況,如圖4.10所示。
?
圖4.9學生成績查詢
?
圖4.10查看成績詳情
4.3.5個人信息維護測試
? ?個人信息維護分為個人基本信息維護和修改密碼。學生,教師,管理員在登陸,點擊左邊菜單欄上的“個人信息維護”選項,撐開子菜單。在子采單中選擇主界面左邊的選擇“修改個人信息”進入個人基本信息維護界面如圖4.11,用戶可以對個人的基本信息進行維護。點擊“修改密碼”進入修改密碼界面,修改密碼時系統會對用戶輸入信息進行一個簡單的驗證如兩次輸入新密碼必須相同等,如圖4.12所示。
?
圖4.11 個人基本信息維護
?
圖4.12修改密碼
4.3.6 考題管理
在瀏覽器中輸入“http://localhost:8080/ExamOnline/admin/login.jsp”進入管理員登陸頁面。當提交登陸信息時,系統會進行簡單的數據驗證,如驗證碼輸入的正確性,如圖4.13所示。
輸入正確的登陸信息后,進入后臺管理主界面,在左邊的菜單欄上點擊“試題管理”選項進入試題管理界面,如圖4.14所示。
?
圖4.13管理員登陸界面
?
圖4.14 試題管理界面
? 在試題管理界面上,系統將試題信息讀取到界面上,點擊添加圖標,轉到添加試題界面,管理員可以輸入考題信息,輸入一道“javascript”的選擇題,如圖4.15。添加后在界面上找到該試題如圖4.16所示。
?
圖4.15添加考題
?
圖4.16添加考題成功
現點擊考題右邊的編輯圖標可以對考題進行修改,現將剛添加的考題的科目改為“java”,如圖4.17。修改后再在主界面找到試題,如圖4.18所示。
?
圖4.17修改考題
?
圖4.18修改考題成功
點擊考題右邊的刪除圖標,可以刪除該考題,刪除時系統會提醒用戶是否確認刪除,如果用戶確認刪除可以刪除考題,現在剛添加的考題刪除,如圖4.19。
?
圖4.19刪除考題
4.3.7考試設置管理測試
在管理員界面上點擊左邊菜單欄上的“考試設置管理”,進入考試設置管理界面。系統會選將考試設置信息讀取到該界面上。用戶點擊操作按鈕可以對基進行操作,如圖4.20所示。
?
圖4.20考試設置管理 界面
點擊添加圖標,可以進入添加界面,用戶可以添加考試設置信息。現添加一條課程名為“javascript”的考試設置信息。添加后如圖4.21所示。
?
圖4.21添加考試設置信息
點擊考試設置信息右邊的刪除圖標可以刪除考試設置信息。
點擊編輯圖標將轉到編輯界面,用戶可以對該考試設置信息進行編輯。現將剛添加的考試設置信息的考試時間修改為80分鐘。修改后如圖4.22所示。
?
圖4.22修改考試設置
4.3.8用戶管理測試
點擊管理員菜單中“用戶管理”按鈕,進入用戶管理界面,系統選將用戶信息讀取到該頁面上,用戶點擊操作按鈕可以對其進行操作。如圖4.23所示。
?
圖4.23用戶管理界面
點擊添加圖標,可以進入到添加頁面,管理員可以添加用戶信息。現添加一個用戶名為“student”的用戶信息,添加后如圖4.24所示。
?
圖4.24添加用戶信息
點擊用戶信息右邊的刪除圖標,可以刪除該用戶信息。點擊用戶信息右邊的編輯圖標,可以進入編輯頁面對該信息進行編輯,現將剛添加的用戶的名字改為“測試者”,修改后如圖4.25所示。
?
圖4.25修改用戶信息
?
5 ?結論
本系統采用B/S模式結構設計,運用JSP技術和servlet技術結合,通過JDBC -ODBC橋連接操作數據庫,實現了在線考試,成績查詢,考題管理等功能。學生考試時可以隨機地為登陸的考生抽取試題組成考卷。當學生提交考卷后,系統會自動批改客觀題,并將試卷提供給教師查看和提醒教師對試卷主觀題進行修改。待教師修改完試卷后,系統會自動生成考生成績和分數段統計信息。學生可以查詢自己的成績信息和試卷,以便更好地了解自己的學習情況。教師也可以通過分數段統計信息更好地了解學生的學生情況。后臺管理員可以對考題,考試設置信息,用戶信息進行維護。學生,教師,管理員都可以對個人信息進行維護。
?? ?通過本次課程設計,系統的學習了HTML,CSS,javascript等前臺知識和jsp,servlet,javabean等web程序設計知識。對數據庫連接,數據庫操作有了更進一步的理解。對面向對象程序設計思想有了進一步的體會。通過從系統的需求分析到總體設計到詳細設計再到系統測試,進一步了解了規范的軟件設計流程。
?? ?在系統還存在很多不足之處。界面布局凌亂使界面不夠美觀且HTML代碼和CSS代碼混雜,不便于維護;系統設計沒有嚴格按照MVC模式來設計,給系統維護帶來了儲多的不便等等。在以后的學習和開發中,我會注意這些問題,使其開發更規范,開發的系統更優異。
?
總結
以上是生活随笔為你收集整理的基于java的在线考试系统设计(含源文件)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Servlet+jsp+mysql开
- 下一篇: 基于JavaWeb学生成绩信息管理系统(