版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 1引言2</b></p><p> 2系統(tǒng)運(yùn)行環(huán)境和功能簡(jiǎn)介2</p><p> 2.1系統(tǒng)運(yùn)行環(huán)境2</p><p> 2.2系統(tǒng)功能模塊劃分2</p><p> 3系統(tǒng)的體系結(jié)構(gòu)4</p><p> 3.1系統(tǒng)服務(wù)器開(kāi)發(fā)語(yǔ)言JSP4</
2、p><p><b> 3.2數(shù)據(jù)層5</b></p><p> 3.2.1關(guān)系型數(shù)據(jù)庫(kù)mssql2000+sp35</p><p> 3.2.2數(shù)據(jù)庫(kù)連接池5</p><p> 3.2.3 Hibernate框架6</p><p><b> 3.3前臺(tái)交互7</b&
3、gt;</p><p> 3.3.1交互方式7</p><p> 3.3.2 Ajax技術(shù)7</p><p> 3.3.3 DWR8</p><p> 4系統(tǒng)的具體設(shè)計(jì)和實(shí)現(xiàn)9</p><p> 4.1系統(tǒng)的數(shù)據(jù)庫(kù)設(shè)計(jì)9</p><p> 4.2題庫(kù)管理模塊11</
4、p><p> 4.2.1 保存、更新、刪除試題11</p><p> 4.2.2 查詢?cè)囶}13</p><p> 4.2.3 試題與選項(xiàng)關(guān)聯(lián)14</p><p> 4.3自動(dòng)組卷模塊17</p><p> 4.4試卷監(jiān)控22</p><p> 4.5批閱試卷22</p&
5、gt;<p> 4.6成績(jī)查詢23</p><p> 4.7注冊(cè)考試23</p><p> 4.8在線測(cè)試23</p><p> 4.8.1倒計(jì)時(shí)24</p><p> 4.8.2分頁(yè)獲取試題25</p><p> 4.8.3分頁(yè)保存答案25</p><p>
6、; 4.8.4自動(dòng)閱卷25</p><p> 5系統(tǒng)的性能和安全26</p><p><b> 6小結(jié)28</b></p><p><b> 參考文獻(xiàn)28</b></p><p><b> 英文摘要29</b></p><p><
7、;b> 致謝29</b></p><p><b> 附錄30</b></p><p> 基于jsp在綫考試系統(tǒng) </p><p> 摘要:本文闡述了運(yùn)用b/s模式設(shè)計(jì)在線測(cè)試系統(tǒng)的思想,介紹了當(dāng)前較流行的web應(yīng)用技術(shù)和框架---JSP、Java、Ajax和ORM技術(shù),并以此為理論基礎(chǔ)和實(shí)踐依據(jù),在Hibernat
8、e框架下結(jié)合數(shù)據(jù)庫(kù)連接池技術(shù),設(shè)計(jì)并實(shí)現(xiàn)了在線測(cè)試系統(tǒng)。完成了試題庫(kù)的維護(hù)、自動(dòng)組卷、自動(dòng)閱卷(客觀題)、教師批閱(主觀題)、學(xué)生在線測(cè)試、成績(jī)查詢各項(xiàng)功能。</p><p> 關(guān)鍵字:在線測(cè)試 JSP Ajax Hibernate Servlet</p><p><b> 1引言</b></p><p> 隨著計(jì)算機(jī)技術(shù),尤其是
9、計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展及其不斷深入的普及。在21世紀(jì)信息時(shí)代已經(jīng)到來(lái)的今天,網(wǎng)絡(luò)對(duì)于人們來(lái)說(shuō)已不再是一個(gè)陌生的概念。從個(gè)人到學(xué)校、公司、機(jī)關(guān),網(wǎng)絡(luò)已經(jīng)并將繼續(xù)影響著人們的生活、學(xué)習(xí),必將對(duì)社會(huì)各行各業(yè)產(chǎn)生重大影響。學(xué)校作為培養(yǎng)人才的基地,更應(yīng)該走在信息時(shí)代的前沿。如何利用網(wǎng)絡(luò)來(lái)提高教學(xué)的質(zhì)量和效率,克服傳統(tǒng)教學(xué)的弊端,如何架起學(xué)生與教師以及學(xué)生與學(xué)生的網(wǎng)絡(luò)交流平臺(tái),已成為教育者不得不考慮的現(xiàn)實(shí)問(wèn)題。本系統(tǒng)著重研究在線測(cè)試系統(tǒng)的實(shí)現(xiàn),充分利
10、用web應(yīng)用給我們帶來(lái)的便利,結(jié)合各種流行高效的技術(shù),利用web方式對(duì)題庫(kù)進(jìn)行管理和維護(hù),提供自動(dòng)生成試卷、自動(dòng)閱卷、在線測(cè)試、查閱分?jǐn)?shù)等功能,大大的節(jié)省了時(shí)間和精力,以達(dá)到輔助教學(xué),提高教學(xué)效率的目的。</p><p> 2系統(tǒng)運(yùn)行環(huán)境和功能簡(jiǎn)介</p><p><b> 2.1系統(tǒng)運(yùn)行環(huán)境</b></p><p> 操作系統(tǒng):Wind
11、owsXp/WindowsNT</p><p> Web應(yīng)用服務(wù)器:Tomcat5.5.26(需要JDK1.5以上)</p><p> 數(shù)據(jù)庫(kù):MSSQL2000+sp3 </p><p> 2.2系統(tǒng)功能模塊劃分</p><p> 本系統(tǒng)主要實(shí)現(xiàn)的功能有:題庫(kù)管理、組卷、試卷監(jiān)控、批閱試卷、注冊(cè)考試、在線測(cè)試、成績(jī)查詢。功能如圖2-
12、1:</p><p><b> 圖2-1系統(tǒng)功能圖</b></p><p> 題庫(kù)管理:教師用戶可以增加、修改、刪除、查詢題庫(kù)中的試題。本系統(tǒng)的試題種類包括單選、多選、填空、判斷、簡(jiǎn)答和編程。其中問(wèn)題的選項(xiàng)也可以進(jìn)行管理,并且教師可以指定這些問(wèn)題的作用范圍,例如是否可以用于在線測(cè)試等。</p><p> 組卷:系統(tǒng)會(huì)保存教師填寫的試卷參數(shù)
13、,供學(xué)生注冊(cè)時(shí)自動(dòng)隨機(jī)組卷。</p><p> 試卷監(jiān)控:發(fā)布出去的試卷,教師可以監(jiān)控所有注冊(cè)該試卷的學(xué)生和試卷的狀態(tài)。</p><p> 批閱試卷:考試結(jié)束,收回的試卷其中的主觀題目教師可以進(jìn)行批閱。</p><p> 注冊(cè)考試:當(dāng)教師發(fā)布試卷后學(xué)生可以進(jìn)行注冊(cè)。</p><p> 在線測(cè)試:注冊(cè)后的試卷,學(xué)生可以進(jìn)行在線測(cè)試。&l
14、t;/p><p> 成績(jī)查詢:批閱后的試卷,學(xué)生可以查到自已的得分,教師可以按學(xué)生的姓名,查詢學(xué)生的得分。</p><p><b> 3系統(tǒng)的體系結(jié)構(gòu)</b></p><p> 整個(gè)系統(tǒng)采用表示層/業(yè)務(wù)邏輯層/數(shù)據(jù)層的三層體系結(jié)構(gòu)。系統(tǒng)結(jié)構(gòu)如圖3-1。</p><p> 圖3-1系統(tǒng)體系結(jié)構(gòu)圖</p>
15、<p> 3.1系統(tǒng)服務(wù)器開(kāi)發(fā)語(yǔ)言JSP</p><p> 系統(tǒng)服務(wù)器編程采用最常用的JSP技術(shù),JSP (JavaServerPage)是Sun公司在1999年發(fā)布的J2EE的重要組成部分,是基于JavaServlet以及整個(gè)Java體系的Web開(kāi)發(fā)技術(shù),為企業(yè)級(jí)Web的站點(diǎn)動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)人員提供了一種非常簡(jiǎn)單卻有效的工具。JSP與ASP有許多相似之處,都是為基于Web應(yīng)用實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè)制作提供的技術(shù)
16、環(huán)境支持,JSP有以下優(yōu)點(diǎn):</p><p> ?、賹?nèi)容的生成和顯示分離.使用JSP技術(shù),Web頁(yè)面開(kāi)發(fā)者可以使用HTML或XML標(biāo)志或者小腳本來(lái)生成頁(yè)面上的動(dòng)態(tài)內(nèi)容.生成內(nèi)容的邏輯被封裝在標(biāo)志和JavaBeans組件中,并且被捆綁到小腳本中,所有的腳本在服務(wù)器端運(yùn)行。</p><p> ?、趶?qiáng)調(diào)可重用的組件。絕大多數(shù)JSP頁(yè)面依賴于可重用的、跨平臺(tái)的組件(JavaBeans或EJB)來(lái)
17、執(zhí)行應(yīng)用程序所要求的更為復(fù)雜的處理,基于組件的方法加速了總體開(kāi)發(fā)過(guò)程。</p><p> ?、塾布脚_(tái)和服務(wù)器無(wú)關(guān)。JSP作為Java的組成部分,繼承了Java技術(shù)的“一次編寫,隨處可用(Write once,run anywhere)”的特性,可以運(yùn)行于大多數(shù)流行的操作系統(tǒng)平臺(tái)及Web服務(wù)器。這種與服務(wù)器和操作系統(tǒng)平臺(tái)的無(wú)關(guān)性是JSP相對(duì)于其它動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)最大的一個(gè)優(yōu)點(diǎn)。</p><p>
18、; ?、芘cJa va平臺(tái)有機(jī)集成。JSP技術(shù)是J2EE平臺(tái)的重要組成部分。JSP使用Java語(yǔ)言作為它的腳步語(yǔ)言,在JSP頁(yè)面中可以使用幾乎所有的Java組件和JavaAPI,從而可以發(fā)揮Java語(yǔ)言的強(qiáng)大功能。使用JSP技術(shù)可以創(chuàng)建具有高度可伸縮性和可靠性的Web應(yīng)用程序。</p><p> ?、莨δ芸蓴U(kuò)展性。JSP可以通過(guò)JavaBean和EJB以及自定義的標(biāo)記來(lái)擴(kuò)展功能,也可以通過(guò)JDBC與Oracle,
19、DB2, SQL Server等大型關(guān)系數(shù)據(jù)庫(kù)進(jìn)行連接;另外JSP提供了一些隱含對(duì)象,可以使腳步功能更加強(qiáng)大,并且編程更加容易、方便。例如利用Request對(duì)象,可方便地接收用戶在HTML表單中提交的信息。利用session對(duì)象可以跟蹤用戶狀態(tài),利用application對(duì)象可以得到當(dāng)前應(yīng)用服務(wù)的全局信息。系統(tǒng)中的在線學(xué)生的信息就是保存在application中。</p><p><b> 3.2數(shù)據(jù)
20、層</b></p><p> 3.2.1關(guān)系型數(shù)據(jù)庫(kù)mssql2000+sp3</p><p> Microsoft SQL Server 2000數(shù)據(jù)庫(kù)系統(tǒng)是在Windows NT環(huán)境下開(kāi)發(fā)的一種全新的關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng),是發(fā)展最快的關(guān)系數(shù)據(jù)庫(kù)。SQl Server2000具有大型數(shù)據(jù)庫(kù)系統(tǒng)的一些基本功能,支持事務(wù)處理功能、支持?jǐn)?shù)據(jù)庫(kù)加密、設(shè)置用戶組別或用戶的密碼和權(quán)限等等
21、。SQL Server 2000 是一個(gè)具備完全Web支持的數(shù)據(jù)庫(kù)產(chǎn)品,提供了以Web標(biāo)準(zhǔn)為基礎(chǔ)的擴(kuò)展數(shù)據(jù)庫(kù)編程功能。由于最初的Sql Server 2000 并沒(méi)有把1433端口打開(kāi),所以需要給SQL Server2000 打個(gè)Sp3補(bǔ)丁。</p><p> 3.2.2數(shù)據(jù)庫(kù)連接池</p><p> 在基本的數(shù)據(jù)源(DataSource)實(shí)現(xiàn)中,物理的數(shù)據(jù)庫(kù)連接和客戶端的連接對(duì)象(C
22、onnection Object)有著一比一的對(duì)應(yīng)關(guān)系。當(dāng)連接對(duì)象關(guān)閉的時(shí)候,物理的連接也隨之關(guān)閉。這樣一個(gè)客戶的會(huì)話都要花費(fèi)資源去打開(kāi),初始化和關(guān)閉物理連接。對(duì)于這個(gè)資源的耗費(fèi)問(wèn)題,可以用連接池(Connection Pool)來(lái)解決。連接池中有以保持一個(gè)數(shù)據(jù)庫(kù)物理連接的高速緩存,會(huì)話可以重復(fù)利用存儲(chǔ)在緩存中的連接。連接池可以極大地提高性能,在多個(gè)客戶端共享少量的物理連接的三層網(wǎng)絡(luò)環(huán)境下表現(xiàn)的尤為突出。圖3-2表示了JDBC驅(qū)動(dòng)程序提
23、供了一個(gè)應(yīng)用服務(wù)器用來(lái)建立和管理連接池ConnectionPoolDataSource的實(shí)現(xiàn)。在本系統(tǒng)中充分利用了Tomcat提供的dbcp數(shù)據(jù)庫(kù)連接池功能。在多用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,利用連接池緩存數(shù)據(jù)庫(kù)的連接,可以減少建立數(shù)據(jù)庫(kù)連接造成的系統(tǒng)資源開(kāi)銷。同時(shí)dbcp連接池也提供了自動(dòng)釋放無(wú)效的數(shù)據(jù)庫(kù)連接來(lái)防止系統(tǒng)由于數(shù)據(jù)庫(kù)連接泄露造成系統(tǒng)崩潰。</p><p> 圖3-2 連接池的運(yùn)作</p>
24、<p> 3.2.3 Hibernate框架</p><p> 一般來(lái)說(shuō)在數(shù)據(jù)層,我們可以用jsp直接調(diào)用sql語(yǔ)句操縱數(shù)據(jù)庫(kù),或者在JavaBean中利用sql語(yǔ)句執(zhí)行數(shù)據(jù)庫(kù)操縱。然而,這樣會(huì)使我們?cè)陂_(kāi)發(fā)時(shí)候,把注意力過(guò)多的集中到sql語(yǔ)句上,同時(shí)系統(tǒng)的可維護(hù)性,和編寫代碼的效率很低。所以本系統(tǒng)中采用了ORM(對(duì)象關(guān)系映射)技術(shù)中的Hibernate框架結(jié)合DAO模式完成數(shù)據(jù)層的對(duì)象持久化的問(wèn)
25、題。在編寫代碼的時(shí)候,我們只要操縱Java中的對(duì)象,剩下的對(duì)象與數(shù)據(jù)的轉(zhuǎn)換就交給Hibernate去處理了。這樣系統(tǒng)的可維護(hù)性和開(kāi)發(fā)效率就會(huì)有很大的提高。同時(shí)利用Hibernate從tomcat提供的JNDI連接池獲取數(shù)據(jù)庫(kù)連接,將其封裝成Hibernate的Session,通過(guò)Session來(lái)處理對(duì)象的保存,更新,刪除操作。 Hibernate結(jié)合DAO實(shí)現(xiàn)對(duì)象的持久化,工作原理如圖3-3。</p><p>
26、 圖3-3 Hibernate結(jié)合DAO實(shí)現(xiàn)對(duì)象的持久化</p><p><b> 3.3前臺(tái)交互</b></p><p><b> 3.3.1交互方式</b></p><p> 在前臺(tái)與服務(wù)器端的交互,系統(tǒng)中有兩種方式,一種是常見(jiàn)的form表單提交的方式,此種方式應(yīng)用在如系統(tǒng)用戶登錄的時(shí)候。當(dāng)用戶填寫用戶名和密碼把
27、表單提交到服務(wù)器端,服務(wù)器端接收到數(shù)據(jù)后,進(jìn)行業(yè)務(wù)處理,驗(yàn)證用戶明和密碼后,把結(jié)果返回給瀏覽器。另外一種是客戶端以異步請(qǐng)求的方式與服務(wù)器端交互。在做數(shù)據(jù)驗(yàn)證,在線考試的剩余時(shí)間的獲取和刷新時(shí),這些都需要與服務(wù)器進(jìn)行異步通信和局部刷新頁(yè)面。</p><p> 3.3.2 Ajax技術(shù)</p><p> Ajax這個(gè)名詞是一位叫Jesse James Garrett 的美國(guó)人創(chuàng)造的。Jes
28、se是Adaptive Path公司負(fù)責(zé)用戶體驗(yàn)策略的主管,他在2005年2月18日發(fā)表了一篇題為《Ajax:一個(gè)Web應(yīng)用的新途徑》的論文。在文中他給出了Ajax的定義。Ajax不是一種技術(shù)。實(shí)際上,它由幾種蓬勃發(fā)展的技術(shù)以新的強(qiáng)大方式組合而成。Ajax包含:1、基于CSS標(biāo)準(zhǔn)的表示;2、使用Document Object Model 進(jìn)行動(dòng)態(tài)顯示和交互;3、使用XMLHttpRequest與服務(wù)器進(jìn)行異步通信;4、使用JavaScr
29、ipt綁定一切。Ajax工作原理如下:1.客戶斷利用XMLHttpRequest對(duì)象向服務(wù)器發(fā)送異步請(qǐng)求2.服務(wù)器端接受到請(qǐng)求后進(jìn)行業(yè)務(wù)處理,處理完后把結(jié)果返回客戶端3.客戶端接受到返回響應(yīng)后,進(jìn)行更新頁(yè)面等操作。各種技術(shù)在Ajax中的作用如圖3-4。</p><p> 圖3-4各種技術(shù)在Ajax中的作用</p><p><b> 3.3.3 DWR</b><
30、;/p><p> DWR(Direct Web Remoting)是getahead公司開(kāi)發(fā)的一個(gè)實(shí)現(xiàn)Ajax應(yīng)用的框架。它允許客戶端Javascript遠(yuǎn)程調(diào)用服務(wù)器端的Java類的方法,執(zhí)行相關(guān)的事物操作。DWR主要包含兩個(gè)主要部分,其一是運(yùn)行在瀏覽器端的Javascript,這部分被用來(lái)與服務(wù)器通信,并更新頁(yè)面內(nèi)容:其二是運(yùn)行在服務(wù)器端的JavaServlet,這部分被用來(lái)處理請(qǐng)求并將響應(yīng)結(jié)果返回給瀏覽器。
31、DWR采取了一種動(dòng)態(tài)生成基于Java類的Javascript代碼的方法來(lái)實(shí)現(xiàn)和處理Ajax。這樣Web開(kāi)發(fā)人員就可以在Javascript里像使用瀏覽器本地代碼一樣使用Java代碼,而實(shí)際上這些Java代碼是運(yùn)行在服務(wù)器端并且可以自由訪問(wèn)Web服務(wù)器資源的。處于安全考慮,Web開(kāi)發(fā)人員可以根據(jù)要求進(jìn)行適當(dāng)?shù)呐渲脕?lái)決定哪些Java類可以安全的被外部使用。</p><p> 4系統(tǒng)的具體設(shè)計(jì)和實(shí)現(xiàn)</p>
32、;<p> 4.1系統(tǒng)的數(shù)據(jù)庫(kù)設(shè)計(jì)</p><p> 結(jié)合系統(tǒng)的功能和分析,數(shù)據(jù)庫(kù)的設(shè)計(jì)模型如圖:4-1. 問(wèn)題選項(xiàng)表T_Q_ELEMENTS,問(wèn)題表T_QUESTIONS,學(xué)生信息表T_STUDENTS,教師表T_TEACHERS, 科目表T_SUBJECTS, 章節(jié)表T_CHAPTS, 班級(jí)表T_CLASS, 試卷參數(shù)表T_EXAM_PARAM, 學(xué)生試卷表T_EXAMS, 試卷組成元素表T
33、_EXAM_ELEMENTS。</p><p> 教師在頁(yè)面添加試卷的參數(shù)向試卷參數(shù)表(T_EXAM_PARAM)中添加參數(shù)后,發(fā)布此試卷,學(xué)生可以注冊(cè)考試,注冊(cè)時(shí)首先會(huì)從試卷參數(shù)表(T_EXAM_PARAM)中讀取相應(yīng)的參數(shù)如單選題個(gè)數(shù)等,利用這些參數(shù)從題目表(T_QUESTIONS)中隨機(jī)選取問(wèn)題,而這些問(wèn)題的選項(xiàng)可以從問(wèn)題選項(xiàng)表(T_Q_ELEMENTS)關(guān)聯(lián)查出,然后把這些問(wèn)題的id添加到試卷組成元素表
34、(T_EXAM_ELEMENTS)中,最后生成學(xué)生試卷表(T_EXAMS)。當(dāng)學(xué)生在線答題時(shí),會(huì)跟據(jù)學(xué)生試卷(T_EXAMS)的id查出試卷組成元素表中的記錄得到問(wèn)題id,利用問(wèn)題的id得到問(wèn)題和相關(guān)聯(lián)的問(wèn)題選項(xiàng)。學(xué)生保存答案時(shí)按題型分為兩種情況,一是保存選擇性的題目,此時(shí)就把被選中的問(wèn)題的選項(xiàng)的id存入試卷組成元素表中對(duì)應(yīng)的學(xué)生答案字段中。另外就是非選擇性題目,即需要輸入文字的題目,此時(shí)把輸入的文字存入成元素表中對(duì)應(yīng)的學(xué)生答案字段中。
35、</p><p> 其中需要說(shuō)明的是在實(shí)際編寫代碼時(shí),對(duì)數(shù)據(jù)庫(kù)做了一些改進(jìn)。如問(wèn)題表(T_QUESTIONS)與科目表(T_SUBJECTS)間的關(guān)聯(lián)是用問(wèn)題表中的科目名稱(strSUBName)與科目表中的科目名稱(strNAME)。同時(shí)教師和科目間的關(guān)聯(lián)關(guān)系,在本系統(tǒng)中還沒(méi)有應(yīng)用到,但是出于以后的擴(kuò)展考慮,仍然在教師表中建立一個(gè)字段科目的id。所以在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)并不是一味的追求數(shù)據(jù)庫(kù)設(shè)計(jì)的規(guī)范性,而是結(jié)合實(shí)
36、際情況,以提高系統(tǒng)效率為目的。因此某些冗余字段的出現(xiàn),也正是出于此目的,例如試卷參數(shù)表(試卷參數(shù)表)中的試卷名稱strNAME與學(xué)生試卷表中的試卷名稱strName,就是冗余字段,當(dāng)需要查出某學(xué)生參加的考試名稱時(shí)就無(wú)需關(guān)聯(lián)試卷參數(shù)表,這樣就可以減少系統(tǒng)的開(kāi)銷,提高查詢速度。</p><p> 圖4-1:系統(tǒng)數(shù)據(jù)庫(kù)模型圖</p><p><b> 4.2題庫(kù)管理模塊</b
37、></p><p> 該模塊主要是教師用戶可以增加、修改、刪除、查詢題庫(kù)中的試題。本系統(tǒng)的試題種類包括單選、多選、填空、判斷、簡(jiǎn)答和編程。其中問(wèn)題的選項(xiàng)也可以進(jìn)行管理,并且教師可以指定這些問(wèn)題的作用范圍,例如是否可以用于在線測(cè)試等。</p><p> 實(shí)現(xiàn)對(duì)題庫(kù)中的試題的增加、刪除、修改、查詢時(shí),始終直接操作都是相關(guān)的Java對(duì)象QuestionDAO,在這個(gè)java類里封裝了對(duì)
38、試題對(duì)象TQuestions的操作.這樣的一個(gè)開(kāi)發(fā)模式就是DAO(數(shù)據(jù)訪問(wèn)對(duì)象)模式。而最終把對(duì)象轉(zhuǎn)換到數(shù)據(jù)庫(kù)中的是利用Hibernate來(lái)實(shí)現(xiàn)的。 </p><p> 下面就詳細(xì)的介紹這個(gè)模塊的實(shí)現(xiàn)和用到的相關(guān)技術(shù)。</p><p> 4.2.1 保存、更新、刪除試題</p><p> Session接口是Hibernate向應(yīng)用程序提供的操縱數(shù)據(jù)庫(kù)的最主要
39、接口,它提供了基本的保存、更新、刪除和查詢方法。Session具有一個(gè)緩存,位于緩存中的對(duì)象處于持久化狀態(tài),它和數(shù)據(jù)庫(kù)中的相關(guān)記錄對(duì)應(yīng),Session能夠在某些時(shí)間點(diǎn),按緩存中持久化對(duì)象的屬性變化來(lái)同步更新數(shù)據(jù)庫(kù),這一過(guò)程被稱為清理緩存。</p><p> 除了持久化狀態(tài),對(duì)象還能處于其他狀態(tài),Session的特定方法能使對(duì)象從一個(gè)狀態(tài)轉(zhuǎn)換到另一個(gè)狀態(tài)。</p><p> 對(duì)于需要被持
40、久化的Java對(duì)象,在它的生命周期中,可處于以下三個(gè)狀態(tài)</p><p> . 臨時(shí)狀態(tài)(transient):剛剛用new語(yǔ)句創(chuàng)建,還沒(méi)有被持久化,不處于 Session的緩存中。沒(méi)有和數(shù)據(jù)庫(kù)記錄相關(guān)聯(lián)的Java對(duì)象被稱為臨時(shí)對(duì)象 。</p><p> . 持久化狀態(tài)(persistent):已經(jīng)被持久化,加入到Session的緩存中。被固化到數(shù)據(jù)庫(kù)中的Java對(duì)象被稱為持久化對(duì)象。
41、</p><p> . 游離狀態(tài)(detached):已經(jīng)被持久化,但不再處于Session的緩存中。其對(duì)應(yīng)的Session實(shí)例己被關(guān)閉的Java對(duì)象被稱為游離對(duì)象。</p><p> Java對(duì)象的完整狀態(tài)轉(zhuǎn)換圖如圖4-1所示,Session的特定方法觸發(fā)Java對(duì)象由一個(gè)狀態(tài)轉(zhuǎn)換到另一個(gè)狀態(tài)。從圖4-1看出, 當(dāng)Java對(duì)象處于臨時(shí)狀態(tài)或游離狀態(tài),只要不被任何變量引用,就會(huì)結(jié)束生命
42、周期,它占用的內(nèi)存就可以被JVM的垃圾回收器回收;當(dāng)處于持久化狀態(tài),由于Session的緩存會(huì)引用它,因此它始終處于生命周期中。</p><p> 圖:4-2Hibernate中對(duì)象狀態(tài)轉(zhuǎn)換圖</p><p> 下面是更新問(wèn)題和刪除問(wèn)題的部分代碼:</p><p><b> **</b></p><p><b
43、> * 更新問(wèn)題</b></p><p> * @param obj 問(wèn)題</p><p> * @return true/false</p><p><b> */</b></p><p> private boolean update(TQuestions obj){ </p>
44、<p> Transaction tx = session.beginTransaction();</p><p><b> try {</b></p><p> session.update(obj);</p><p> tx.commit();</p><p> return true;<
45、;/p><p> } catch (HibernateException e) {</p><p> tx.rollback();</p><p> // TODO Auto-generated catch block</p><p> e.printStackTrace();</p><p> return f
46、alse;</p><p><b> }</b></p><p><b> }</b></p><p><b> /**</b></p><p> * 按id刪除問(wèn)題,</p><p> * @param id</p><p
47、><b> * @return</b></p><p><b> */</b></p><p> public boolean delete(Integer id){</p><p> Transaction tx = session.beginTransaction();</p><p
48、><b> try {</b></p><p> String hql="delete from TQuestions where intId=?";</p><p> Query q=session.createQuery(hql);</p><p> q.setInteger(0, id);</p&g
49、t;<p> q.executeUpdate();</p><p> tx.commit();</p><p> return true;</p><p> } catch (HibernateException e) {</p><p> tx.rollback();</p><p> //
50、 TODO Auto-generated catch block</p><p> e.printStackTrace();</p><p> return false;</p><p><b> } </b></p><p><b> }</b></p><p>
51、 從上面的代碼中可以看出操作的是一個(gè)Java對(duì)象,而在底層有Hibernate處理,把對(duì)象的操作,轉(zhuǎn)換成對(duì)數(shù)據(jù)庫(kù)的操作。</p><p> 4.2.2 查詢?cè)囶}</p><p> 從數(shù)據(jù)庫(kù)中檢索對(duì)象是使用Hibernate最復(fù)雜的部分。 </p><p> HQL檢索,HQL( Hibernate Query Language)是與其相似的關(guān)系型查詢語(yǔ)言SQ
52、L的面向?qū)ο蠓窖?。它可以?shí)現(xiàn)分頁(yè)查詢功能,而且利用占位符可以有效的避免SQL語(yǔ)句錯(cuò)誤造成的系統(tǒng)異常甚至崩潰。并且它支持分頁(yè)查詢,在大量數(shù)據(jù)中可以只分頁(yè)獲取數(shù)據(jù)減小服務(wù)器的不必要的資源開(kāi)銷。</p><p> 下面是一個(gè)分頁(yè)查詢題庫(kù)中的試題的一個(gè)公共的方法。</p><p><b> /**</b></p><p> * 按試卷id查出所有
53、與試卷相關(guān)的問(wèn)題</p><p> * @param examId </p><p> * @param start </p><p> * @param count</p><p> * @return List 問(wèn)題</p><p><b> */</b></p>&l
54、t;p> public List queryPage(int examId, int start, int count) {</p><p> session=HibernateUtil.openSession(); </p><p> String hql = " select questions ,exelements.strAnswer from TQuest
55、ions as questions,TExamElements as exelements where questions.intId = exelements.intQid and exelements.intExamid=? ";</p><p> Query q = session.createQuery(hql);</p><p> q.setInteger(0,
56、examId);</p><p> if (count != 0) {</p><p> q.setFirstResult(start);</p><p> q.setMaxResults(count);</p><p><b> }</b></p><p> List l = q.li
57、st(); </p><p> HibernateUtil.closeSession();</p><p><b> return l;</b></p><p><b> }</b></p><p> 4.2.3 試題與選項(xiàng)關(guān)聯(lián)</p><p> 本系統(tǒng)同時(shí)支持對(duì)試
58、題選項(xiàng)的管理與維護(hù),教師用戶可以對(duì)試題的選項(xiàng)進(jìn)行增加、刪除、修改的操作。并且試題選項(xiàng)數(shù)量不限。同試題一樣,也是在一個(gè)DAO類QElementDAO中封裝了對(duì)試題選項(xiàng)類TQElementDAO的一系列的操作。然而試題選項(xiàng)與試題是有關(guān)聯(lián)關(guān)系的,那么如何處理這種關(guān)聯(lián)呢。</p><p> 先看一下這一部分的數(shù)據(jù)庫(kù)設(shè)計(jì)如表4-3和4-4</p><p> 表:4-3試題表T_QUESTIONS
59、</p><p> 表:4-3試題選項(xiàng)表T_Q_ELEMENTS</p><p> 在試題選項(xiàng)表中有一個(gè)試題的主鍵intQID作為外鍵,所以從試題到試題選項(xiàng)的一對(duì)多的關(guān)聯(lián)關(guān)系是用試題的id關(guān)聯(lián)上去的。那么如何在Java對(duì)象中體現(xiàn)這種關(guān)系呢?在TQuestions試題對(duì)象中用一個(gè)Set集合來(lái)存儲(chǔ)它所關(guān)聯(lián)的所有試題選項(xiàng)對(duì)象,在查詢到某個(gè)試題時(shí)候就可以關(guān)聯(lián)查出對(duì)應(yīng)的所有試題選項(xiàng)了。兩個(gè)類的部
60、分代碼如下:</p><p><b> /**</b></p><p> * @author zheng</p><p><b> *</b></p><p><b> */</b></p><p> package org.zlj.zxcs.
61、vo;</p><p> import java.util.Date;</p><p> import java.util.HashSet;</p><p> import java.util.Set;</p><p> public class TQuestions implements java.io.Serializable
62、{</p><p> // Fields </p><p> private Integer intId;//id</p><p> private String strSubName; //科目名稱</p><p> private String strContent;//內(nèi)容</p><p&
63、gt; private String strChapt;//章節(jié)</p><p> private String strType;//類型 </p><p> private String strLevel;//難度等級(jí)</p><p> private String strUsestate;//問(wèn)題有效范圍</p><p>
64、 private Integer intCounts;//被抽取的次數(shù) </p><p> private Integer intCreateId;//創(chuàng)建人id</p><p> private String strCreator;//創(chuàng)建人姓名</p><p> private Date dcreateDate;//創(chuàng)建日期</p>
65、<p> private Set tqelementset = new HashSet(0);</p><p> // Constructors</p><p> ……set and get</p><p> package org.zlj.zxcs.vo; </p><p><b> /**</b>
66、</p><p> * TQElements generated by MyEclipse - Hibernate Tools</p><p><b> */</b></p><p> public class TQElements implements java.io.Serializable {</p><p&g
67、t; private Integer intId;</p><p> private TQuestions TQuestions;</p><p> private String strContent;</p><p> private Integer intIsanswer;</p><p> 到此類中的關(guān)系有了,下面要做的就是要
68、在Hibernate的映射文件中配置對(duì)象與數(shù)據(jù)間的轉(zhuǎn)換關(guān)系了。部分配置代碼如下:</p><p> <hibernate-mapping></p><p> <class name="org.zlj.zxcs.vo.TQElements" table="T_Q_ELEMENTS" schema="dbo" c
69、atalog="ONLINEEXAM"></p><p> <id name="intId" type="java.lang.Integer"></p><p> <column name="intId" /></p><p> <generat
70、or class="native" /></p><p><b> </id></b></p><p> <many-to-one name="TQuestions" class="org.zlj.zxcs.vo.TQuestions" fetch="select&quo
71、t; cascade="none"></p><p> <column name="intQID" /></p><p> </many-to-one></p><p> <property name="strContent" type="java.lan
72、g.String" ></p><p> <column name="strCONTENT" length="3000" /></p><p> </property></p><p> <property name="intIsanswer" type=
73、"java.lang.Integer"></p><p> <column name="intISANSWER" /></p><p> </property></p><p><b> </class></b></p><p>
74、</hibernate-mapping></p><p> <hibernate-mapping></p><p> <class name="org.zlj.zxcs.vo.TQuestions" table="T_QUESTIONS" schema="dbo" catalog="ON
75、LINEEXAM"></p><p> <id name="intId" type="java.lang.Integer"></p><p> <column name="intId" /></p><p> <generator class="
76、native" /></p><p><b> </id></b></p><p> <property name="strContent" type="java.lang.String"></p><p> <column name="str
77、Content" length="3000" /></p><p> </property> </p><p><b> ……</b></p><p> <set name="tqelementset" table="t_Q_Elements"
78、inverse="true"</p><p> cascade="delete" lazy="false" ></p><p><b> <key></b></p><p> <column name="intQID" /><
79、;/p><p><b> </key></b></p><p> <one-to-many class="org.zlj.zxcs.vo.TQElements" /></p><p><b> </set></b></p><p><b
80、> </class></b></p><p> </hibernate-mapping></p><p> 在映射文件中的1對(duì)多關(guān)聯(lián)關(guān)系是用<set>元素來(lái)配置的。</p><p> 圖4-4是運(yùn)行時(shí)的截圖,查詢出一個(gè)試題后,可以關(guān)聯(lián)得到它的試題選項(xiàng)。</p><p> 圖:4-
81、4試題關(guān)聯(lián)得到試題選項(xiàng)</p><p><b> 4.3自動(dòng)組卷模塊</b></p><p> 該模塊主要是教師錄入試卷的一些參數(shù),供學(xué)生注冊(cè)時(shí)隨機(jī)生成試卷用。其頁(yè)面如圖4-5。在該頁(yè)面教師要依據(jù)題庫(kù)有符合條件的試題的數(shù)量來(lái),填寫各種試題的數(shù)量。這里使用Ajax技術(shù)中的DWR框架,異步獲取試題庫(kù)中可用題目數(shù)量,當(dāng)教師選擇試卷的科目和試卷的難度時(shí),系統(tǒng)就會(huì)到數(shù)據(jù)庫(kù)中
82、獲取與之匹配的題目數(shù)量,并把結(jié)果顯示出來(lái)。具體實(shí)現(xiàn)方法如下。</p><p> 第一步:安裝jar開(kāi)發(fā)包。從DWR官方網(wǎng)站http://www.getahead.ltd.uk/dwr/下載DWR開(kāi)發(fā)包,這里使用的是DWR2.03這個(gè)開(kāi)發(fā)包里包含了DWR運(yùn)行所需的所有Java類和相應(yīng)的API文檔。把該jar包放到項(xiàng)目的lib包里。</p><p> 第二步:修改現(xiàn)有項(xiàng)目的web.xml配
83、置文件。加入一個(gè)Servlet配置,代碼如下。</p><p> <servlet> </p><p> <servlet-name>dwr-invoker</servlet-name></p><p> <servlet-class>org.directwebremoting.servlet.DwrServle
84、t</servlet-class></p><p> <init-param></p><p> <param-name>debug</param-name> </p><p> <param-value>true</param-value></p><p> &
85、lt;/init-param></p><p> </servlet></p><p> <servlet-mapping></p><p> <servlet-name>dwr-invoker</servlet-name></p><p> <url-pattern>
86、/dwr/*</url-pattern> </p><p> </servlet-mapping></p><p> 這段描述主要是告訴WEB應(yīng)用程序,全部以“/dwr/”起始的URL所指的請(qǐng)求都交給org.directwebremoting.servlet.DwrServlet這個(gè)Servlet處理。</p><p> 圖4-5組卷參
87、數(shù)頁(yè)面</p><p> 第三步:創(chuàng)建dwr.xml</p><p> 在WEB-INF文件夾下建立dwr.xml配置文件。代碼如下</p><p> <?xml version="1.0" encoding="UTF-8"?></p><p> <!DOCTYPE dwr P
88、UBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd"></p><p><b> <dwr></b></p><p><b> <allo
89、w></b></p><p> <create creator="new" javascript="JQuestionDao"></p><p> <param name="class" value="org.zlj.zxcs.dao.QuestionDAO" />
90、 </p><p> <include method="getAviliableCount" /></p><p><b> ……</b></p><p><b> </create></b></p><p><b> ……</b&
91、gt;</p><p><b> </allow></b></p><p><b> </dwr></b></p><p> 這段描述主要是把org.zlj.zxcs.dao.QuestionDAO類轉(zhuǎn)換成Jscript對(duì)象JQuestionDao 并且只暴露方法getAviliableCou
92、nt,該方法用來(lái)完成獲取可用試題的數(shù)量。</p><p> 第四步:測(cè)試URL,查看是否轉(zhuǎn)換成功</p><p> 在瀏覽器里輸入http://127.0.0.1:8080/dwr,可以看到已經(jīng)部署的所有java類,本例中,頁(yè)面信息如下:</p><p> Classes known to DWR:</p><p> JSubject
93、Dao (org.zlj.zxcs.dao.SubjectDAO) </p><p> JExamDao (org.zlj.zxcs.dao.ExamDAO) </p><p> JExamElementDao (org.zlj.zxcs.dao.ExamElementDAO) </p><p> JQuestionDao (org.zlj.zxcs.dao.
94、QuestionDAO)</p><p> 點(diǎn)擊JQuestionDao進(jìn)入該類的方法部署頁(yè)面如圖4-6,在getAviliableCount中分別輸入java,2,111表示java科目中難度為簡(jiǎn)單可用范圍是正式測(cè)驗(yàn)的問(wèn)題。點(diǎn)擊Execute可以查看方法的實(shí)際運(yùn)行情況如圖4-7。到此說(shuō)明DWR正常工作。</p><p> 圖4-6 JQuestionDao類</p>
95、<p> 圖4-7 DWR測(cè)試結(jié)果</p><p> 第五步:建立客戶端頁(yè)面,利用Javascript遠(yuǎn)程調(diào)用Java類的方法</p><p> 頁(yè)面為http://127.0.0.1:8080/zxcs/teacher/examParamAdd.jsp, 部分代碼如下,運(yùn)行效果如圖4-8</p><p> <script type=
96、9;text/javascript'src='<%=basePath%>dwr/interface/JQuestionDao.js'></p><p><b> </script></b></p><p> <script type='text/javascript' src='
97、;<%=basePath%>dwr/engine.js'></p><p><b> </script></b></p><p> <script type='text/javascript' src='<%=basePath%>dwr/util.js'></p&g
98、t;<p><b> </script></b></p><p><b> ……</b></p><p> //獲取題庫(kù)中的已有的個(gè)數(shù)</p><p> if(strSubName!="")JQuestionDao.getAviliableCount(strSub
99、Name,strLevel,"",showCheckValue); </p><p> 使用Ajax可以帶來(lái)可見(jiàn)的便捷:1、減輕服務(wù)器的負(fù)擔(dān)。Ajax的原則是“按需取數(shù)據(jù)”,可以在相當(dāng)?shù)某潭壬蠝p少冗余請(qǐng)求和響應(yīng)對(duì)服務(wù)器造成的負(fù)擔(dān)。2、無(wú)刷新更新頁(yè)面,減少用戶心里和實(shí)際等待的時(shí)間。特別地,當(dāng)要讀取大量數(shù)據(jù)時(shí),不會(huì)像Reload那樣出現(xiàn)白屏的情況。Ajax使用XMLHttpRequest對(duì)象發(fā)送
100、請(qǐng)求并的得到服務(wù)器的響應(yīng),在不重載整個(gè)頁(yè)面的情況下,使用Javascript操作DOM更新頁(yè)面。所以在讀取數(shù)據(jù)的過(guò)程中,用戶面對(duì)的不是空白的屏幕,是原來(lái)的頁(yè)面內(nèi)容(也可以加點(diǎn)提示信息,讓用戶知道處于讀取數(shù)據(jù)的過(guò)程),只有當(dāng)數(shù)據(jù)接收完后才更新相應(yīng)的部分內(nèi)容。這種更新是瞬間的,用戶幾乎感覺(jué)不到。3、帶來(lái)更好的用戶體驗(yàn)。4、可以把以前一些服務(wù)器的負(fù)擔(dān)工作轉(zhuǎn)嫁到客戶端,利用客戶端閑置的能力來(lái)處理,減輕服務(wù)器和帶寬的負(fù)擔(dān),節(jié)約空間和帶寬成本。5、
101、可以調(diào)用外部數(shù)據(jù)。6、基于標(biāo)準(zhǔn)化的并被廣泛支持的技術(shù),無(wú)需下載插件或者小程序。7、進(jìn)一步促進(jìn)頁(yè)面呈現(xiàn)和數(shù)據(jù)的分離。</p><p> 圖4-8 DWR調(diào)用遠(yuǎn)程方法</p><p><b> 4.4試卷監(jiān)控</b></p><p> 模塊的功能是對(duì)教師發(fā)布出去的試卷,教師可以監(jiān)控所有注冊(cè)該試卷的學(xué)生和試卷的狀態(tài)。該功實(shí)現(xiàn)方法在于使用應(yīng)用服
102、務(wù)器的application對(duì)象,來(lái)保存在線用戶信息,創(chuàng)建一個(gè)session監(jiān)聽(tīng)器,當(dāng)session失效時(shí)從application對(duì)象中去除該用戶的信息。在監(jiān)控頁(yè)面,獲取注冊(cè)了該試卷的所有學(xué)生和試卷的狀態(tài)然后獲取該學(xué)生的在線狀態(tài),通過(guò)頁(yè)面表格顯示出來(lái)。</p><p><b> 4.5批閱試卷</b></p><p> 對(duì)于收回的試卷,教師可以批閱其中的主觀題,該
103、模塊是根據(jù)學(xué)生的試卷id獲取試卷中的試題信息包括試題的參考答案和學(xué)生所做的答案,最后教師結(jié)合實(shí)際情況給學(xué)生評(píng)分。</p><p><b> 4.6成績(jī)查詢</b></p><p> 對(duì)于教師用戶可以查詢參與由自己發(fā)布的試卷的成績(jī)。對(duì)于學(xué)生可以查詢自己所有的測(cè)試成績(jī)。主要是依賴與查詢條件的控制。</p><p><b> 4.7注
104、冊(cè)考試</b></p><p> 學(xué)生可以注冊(cè)教師已經(jīng)發(fā)布的試卷,在組卷時(shí),先從試卷參數(shù)表中讀出參數(shù),然后利用這些參數(shù)進(jìn)行組卷。其中從題庫(kù)中隨機(jī)抽取n條試題時(shí)使用了mssql的select top n * from tableName order by newid(),而Hibernate的Session接口的Session.createSQLQuery(sql)方法可以生成原生SQL語(yǔ)句,這樣就
105、可以使用它來(lái)完成隨機(jī)抽題了。</p><p><b> 4.8在線測(cè)試</b></p><p> 在線測(cè)試主要完成倒計(jì)時(shí)、分頁(yè)獲取試題、分頁(yè)保存答案、三個(gè)主要的功能。由于需要進(jìn)行異步請(qǐng)求和局部更新頁(yè)面所以,這三個(gè)功能都是利用Ajax技術(shù)實(shí)現(xiàn)的,頁(yè)面運(yùn)行效果如圖4-8.</p><p><b> 4.8.1倒計(jì)時(shí)</b>
106、;</p><p> 當(dāng)頁(yè)面加載時(shí),自動(dòng)調(diào)用javaScript腳本利用DWR獲取考試剩余時(shí)間,利用javascript更新顯示時(shí)間區(qū)域秒針顯示。并把獲取時(shí)間的腳本設(shè)置為每一分鐘執(zhí)行一次。當(dāng)剩余時(shí)間為0時(shí)候自動(dòng)調(diào)用結(jié)束考試的方法,同樣此方法也是利用Ajax實(shí)現(xiàn)的。部分代碼如下:</p><p><b> //取得剩余時(shí)間</b></p><p&
107、gt; function getLeftTime(){ </p><p> JExamDao.getTimes(examId,showTimes); </p><p><b> }</b></p><p><b> //顯示出剩余時(shí)間</b></p><p> function s
108、howTimes(date){</p><p> var lefttimes = $("timespace");</p><p> if(date<=0){</p><p> lefttimes.innerHTML = date;</p><p> saveAnswer(); //保存當(dāng)頁(yè)答案</p&g
109、t;<p> alert("考試已經(jīng)結(jié)束");</p><p> JExamDao.endExam(examId,function() {</p><p> top.location='<%= basePath %>logout.jsp'; });</p><p><b> }else
110、{</b></p><p> lefttimes.innerHTML = "剩余"+date+"分鐘"; </p><p> showLeftSec(); </p><p><b> } </b></p><p><b> }</b&
111、gt;</p><p><b> //顯示時(shí)間秒數(shù)</b></p><p> function showLeftSec(){ </p><p> if (leftseconds<0) { //如果秒到0就重新更新分鐘 </p><p> leftseconds=59; //重新把秒針設(shè)為59<
112、;/p><p> getLeftTime();//從數(shù)據(jù)庫(kù)中重新獲取剩余時(shí)間</p><p><b> }else{</b></p><p> $("leftsec").innerHTML=""+leftseconds+"秒"; </p><p> left
113、seconds--; </p><p> setTimeout("showLeftSec()",1000); //每秒更新一次秒針</p><p><b> }</b></p><p><b> }</b></p><p> 4.8.2分頁(yè)獲取試題</p>
114、<p> 獲取試卷中的試題,利用Hibernate的一對(duì)多的關(guān)系可以很容易的獲取試題和它所對(duì)應(yīng)的試題選項(xiàng),通過(guò)獲取試題的種類給予用戶不同的界面,如單選題則顯出單選按鈕,多選題顯示多選按鈕,同時(shí)獲取學(xué)生做過(guò)的答案,并將其顯示在頁(yè)面上。利用Hibernate中Query接口setFirstResult設(shè)置開(kāi)始的行數(shù)和setMaxResults設(shè)置最大行數(shù)讀取數(shù)據(jù)庫(kù)中的記錄,在頁(yè)面結(jié)合javascript動(dòng)態(tài)設(shè)置起始行數(shù)。相關(guān)代
115、碼見(jiàn)附錄。</p><p> 4.8.3分頁(yè)保存答案</p><p> 保存答案時(shí)把試題按兩種類型保存,如果是選擇性的題目保存被選中的選項(xiàng)的id,如果是輸入文本性的題目保存其輸入的文本。當(dāng)學(xué)生點(diǎn)擊翻頁(yè)按鈕時(shí)觸發(fā)javascript腳本,利用Ajax進(jìn)行保存當(dāng)前頁(yè)面的試題答案。</p><p><b> 4.8.4自動(dòng)閱卷</b></
116、p><p> 當(dāng)提交試卷時(shí),系統(tǒng)會(huì)自動(dòng)批閱試卷中的單選題、多選題、判斷題。評(píng)分時(shí)候分為兩種,一種是正確答案只有一個(gè)的,即單選題和判斷題。此時(shí)只要比較學(xué)生提交的答案(選項(xiàng)的id)和該試題的正確答案的選項(xiàng)id是否一樣即可。另外一種就是多選題,此時(shí)可先把學(xué)生做的答案即多個(gè)選項(xiàng)的id封裝到一個(gè)Set集合中去,然后在獲取試題的正確選項(xiàng)的Set集合,利用Java中的Set集合equals方法,來(lái)判斷學(xué)生是否答對(duì)了此題。部分代碼
117、如下:</p><p> // 把學(xué)生所做的答案組合成一個(gè)set集合</p><p> if (strAnswer != null) {</p><p> String[] tempAnswer = strAnswer.split(",");</p><p> for (int i = 0; i <
118、tempAnswer.length; i++) {</p><p> Integer temInt = new Integer(tempAnswer[i]);</p><p> setStuAnswer.add(temInt);}</p><p> // 獲取問(wèn)題的正確選項(xiàng)的id集合</p><p> while (tempIt.ha
119、sNext()) {</p><p><b> //問(wèn)題選項(xiàng)</b></p><p> TQElements tempQE = (TQElements) tempIt.next();Integer temp = tempQE.getIntIsanswer();</p><p> //把問(wèn)題的正確答案的選項(xiàng)id放入集合中 <
120、;/p><p> if (temp.intValue() == 1){</p><p> Integer intQEID = tempQE.getIntId();</p><p> setQEID.add(intQEID);}}</p><p> //對(duì)比學(xué)生所做的答案集合與問(wèn)題的正確選項(xiàng)id集合</p><p>
121、 if (setStuAnswer.size() > 0 && setQEID.size() > 0</p><p> && setStuAnswer.equals(setQEID)) { </p><p> corExeIdSet.add(exeID);}} </p><p><b> 5系統(tǒng)的性能和
122、安全</b></p><p> 在系統(tǒng)的設(shè)計(jì)和編碼時(shí)候考慮到系統(tǒng)的性能和安全的問(wèn)題主要采取的策略如下。</p><p> 1.采用數(shù)據(jù)庫(kù)連接池。Tomcat提供了一個(gè)較為成熟的數(shù)據(jù)庫(kù)連接池DBCP連接池,利用連接池可以使系統(tǒng)減少建立與數(shù)據(jù)庫(kù)的連接次數(shù)。節(jié)約系統(tǒng)的寶貴支援,提高系統(tǒng)的負(fù)載量。</p><p> 2.合理配置數(shù)據(jù)庫(kù)連接池,以提高系統(tǒng)的性
123、能和安全。當(dāng)web應(yīng)用服務(wù)器發(fā)異常時(shí)候可能會(huì)使當(dāng)前數(shù)據(jù)庫(kù)連接失效。而失效的連接如不及時(shí)的回收可能會(huì)造成系統(tǒng)的崩潰。Tomcat配置文件中的可以指定連接池自動(dòng)回收失效的連接代碼如下:</p><p> <parameter></p><p> <name>removeAbandoned</name></p><p> <
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文——基于jsp的java在線考試系統(tǒng)
- 畢業(yè)論文——基于jsp的java在線考試系統(tǒng)
- 畢業(yè)論文——基于jsp的java在線考試系統(tǒng)
- 畢業(yè)論文---基于jsp的在線畢業(yè)論文管理系統(tǒng)
- 基于jsp的在線考試系統(tǒng)畢業(yè)設(shè)計(jì)
- 畢業(yè)論文基于jsp的畢業(yè)論文管理系統(tǒng)的設(shè)計(jì)
- 基于jsp的在線書店銷售系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文
- 在線考試系統(tǒng)畢業(yè)論文
- 在線考試系統(tǒng)畢業(yè)論文
- 畢業(yè)論文---基于java的在線考試系統(tǒng)的設(shè)計(jì)
- 基于jsp網(wǎng)上書店系統(tǒng)設(shè)計(jì)-畢業(yè)論文
- 在線考試系統(tǒng)畢業(yè)論文
- 在線考試系統(tǒng)畢業(yè)論文
- 在線考試系統(tǒng)畢業(yè)論文
- 在線考試系統(tǒng)畢業(yè)論文
- 畢業(yè)論文 基于jsp的網(wǎng)上購(gòu)物系統(tǒng)設(shè)計(jì)
- 在線考試系統(tǒng)畢業(yè)論文
- 在線考試系統(tǒng)畢業(yè)論文
- 畢業(yè)論文——在線考試系統(tǒng)
- 畢業(yè)論文——在線考試系統(tǒng).
評(píng)論
0/150
提交評(píng)論