網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(論文+PPT+源碼)
時(shí)間:2023-06-04 14:39:02 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-06-04 14:39:02 來源:網(wǎng)站運(yùn)營
網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(論文+PPT+源碼):
畢業(yè)設(shè)計(jì)(論文)任務(wù)書
第1頁
畢業(yè)設(shè)計(jì)(論文)題目:網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)(論文)要求及原始數(shù)據(jù)(資料):了解國內(nèi)外網(wǎng)絡(luò)考試系統(tǒng)的發(fā)展現(xiàn)狀,深入分析考試系統(tǒng)的工作流程;根據(jù)考試系統(tǒng)的工作流程設(shè)計(jì)系統(tǒng)的總體結(jié)構(gòu),繪制總體結(jié)構(gòu)圖;設(shè)計(jì)系統(tǒng)的功能模塊,如:后臺(tái)系統(tǒng)維護(hù)模塊,包括試題的錄入、維護(hù)、刪除等功能;前臺(tái)考試模塊,包括考題的分發(fā)、考試時(shí)間的記錄等功能;教師組題模塊,包括考題的生成、題型的選擇、分值的設(shè)定等功能;設(shè)計(jì)并實(shí)現(xiàn)教師考前出題的組題功能模塊,包括考題類型、數(shù)量、每個(gè)題分?jǐn)?shù)的設(shè)定等;熟練地運(yùn)用和掌握J(rèn)avaWeb技術(shù)和MySql數(shù)據(jù)庫編程;進(jìn)行考試系統(tǒng)的程序代碼編寫、調(diào)試運(yùn)行以及功能測試;訓(xùn)練檢索文獻(xiàn)資料和利用文獻(xiàn)資料的能力;訓(xùn)練撰寫技術(shù)文檔與學(xué)位論文的能力。 |
---|
第2頁
畢業(yè)設(shè)計(jì)(論文)主要內(nèi)容:1.綜述網(wǎng)絡(luò)考試系統(tǒng)的項(xiàng)目背景及國內(nèi)外發(fā)展現(xiàn)狀;2.分析傳統(tǒng)考試形式的工作流程,設(shè)計(jì)網(wǎng)絡(luò)考試系統(tǒng);3.闡明網(wǎng)絡(luò)考試系統(tǒng)的運(yùn)行環(huán)境及開發(fā)工具; 4.給出管理員題庫后臺(tái)維護(hù)管理模塊、教師組題模塊、前臺(tái)考試模塊的設(shè)計(jì)方法;5. 介紹網(wǎng)絡(luò)考試系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)方法;6.闡述網(wǎng)絡(luò)考試系統(tǒng)中每個(gè)功能模塊的程序編寫、調(diào)試、運(yùn)行及達(dá)到的實(shí)際效果;7.對系統(tǒng)進(jìn)行全面測試,分析測試結(jié)果并詳細(xì)說明自己的網(wǎng)絡(luò)考試系統(tǒng)中具有亮點(diǎn)的模塊和不足之處。 學(xué)生應(yīng)交出的設(shè)計(jì)文件(論文):1.內(nèi)容完整、層次清晰、敘述流暢、排版規(guī)范的畢業(yè)設(shè)計(jì)論文;2.包括畢業(yè)設(shè)計(jì)論文、源程序等內(nèi)容在內(nèi)的畢業(yè)設(shè)計(jì)電子文檔及其它相關(guān)材料。 |
---|
第3頁
主要參考文獻(xiàn)(資料):[1] 李英杰. 基于JAVA技術(shù)的網(wǎng)絡(luò)考試管理系統(tǒng)的研究與開發(fā)[D]. 杭州: 同濟(jì)大學(xué),2007, (23):頁碼.[2] 王添財(cái). 基于Java EE的在線考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 廣東:華南理工大學(xué),2014.[3] 劉毅. 人工智能在自動(dòng)組卷建模中應(yīng)用研究[J]. 計(jì)算機(jī)仿真,2011.[4] 郭琳. Java Web中錯(cuò)誤異常的處理方法分析[J]. 電子技術(shù)與軟件工程,2015.[5] 關(guān)海偉. Java Web的云存儲(chǔ)技術(shù)研究[D]. 杭州:杭州電子科技大學(xué),2014,(23):頁碼.[6] Renuka Kumar. Detection of Obfuscation in Java Malware[J]. 愛思唯爾期刊,2016. [7] 鄭保平,郭榮寧. 數(shù)據(jù)庫技術(shù)研究綜述[J]. 軍事通信系統(tǒng),2003,(18): 頁碼.[8] Ronald P .Anjard. The Basics of Database Management Systems[J]. Emerald期刊,1994.[9] Sepideh Naghdi. Preventing database schema extraction by error message handing[J]. 愛思唯爾期刊, 2015. [10] 朱少民. 軟件測試方法和技術(shù)[D]. 杭州:清華大學(xué)出版社,2010.[11] 柳純錄. 軟件評測師教程[J]. 杭州:清華大學(xué)出版社,2005.[12] 舒華峰. 自動(dòng)組卷系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 吉林:吉林大學(xué),2014,(15):頁碼. |
---|
畢業(yè)設(shè)計(jì)(論文)任務(wù)書
第1頁
畢業(yè)設(shè)計(jì)(論文)題目:網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)(論文)要求及原始數(shù)據(jù)(資料):了解國內(nèi)外網(wǎng)絡(luò)考試系統(tǒng)的發(fā)展現(xiàn)狀,深入分析考試系統(tǒng)的工作流程;根據(jù)考試系統(tǒng)的工作流程設(shè)計(jì)系統(tǒng)的總體結(jié)構(gòu),繪制總體結(jié)構(gòu)圖;設(shè)計(jì)系統(tǒng)的功能模塊,如:后臺(tái)系統(tǒng)維護(hù)模塊,包括試題的錄入、維護(hù)、刪除等功能;前臺(tái)考試模塊,包括考題的分發(fā)、考試時(shí)間的記錄等功能;教師組題模塊,包括考題的生成、題型的選擇、分值的設(shè)定等功能;設(shè)計(jì)并實(shí)現(xiàn)教師考前出題的組題功能模塊,包括考題類型、數(shù)量、每個(gè)題分?jǐn)?shù)的設(shè)定等;熟練地運(yùn)用和掌握J(rèn)avaWeb技術(shù)和MySql數(shù)據(jù)庫編程;進(jìn)行考試系統(tǒng)的程序代碼編寫、調(diào)試運(yùn)行以及功能測試;訓(xùn)練檢索文獻(xiàn)資料和利用文獻(xiàn)資料的能力;訓(xùn)練撰寫技術(shù)文檔與學(xué)位論文的能力。 |
---|
第2頁
畢業(yè)設(shè)計(jì)(論文)主要內(nèi)容:1.綜述網(wǎng)絡(luò)考試系統(tǒng)的項(xiàng)目背景及國內(nèi)外發(fā)展現(xiàn)狀;2.分析傳統(tǒng)考試形式的工作流程,設(shè)計(jì)網(wǎng)絡(luò)考試系統(tǒng);3.闡明網(wǎng)絡(luò)考試系統(tǒng)的運(yùn)行環(huán)境及開發(fā)工具; 4.給出管理員題庫后臺(tái)維護(hù)管理模塊、教師組題模塊、前臺(tái)考試模塊的設(shè)計(jì)方法;5. 介紹網(wǎng)絡(luò)考試系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)方法;6.闡述網(wǎng)絡(luò)考試系統(tǒng)中每個(gè)功能模塊的程序編寫、調(diào)試、運(yùn)行及達(dá)到的實(shí)際效果;7.對系統(tǒng)進(jìn)行全面測試,分析測試結(jié)果并詳細(xì)說明自己的網(wǎng)絡(luò)考試系統(tǒng)中具有亮點(diǎn)的模塊和不足之處。 學(xué)生應(yīng)交出的設(shè)計(jì)文件(論文):1.內(nèi)容完整、層次清晰、敘述流暢、排版規(guī)范的畢業(yè)設(shè)計(jì)論文;2.包括畢業(yè)設(shè)計(jì)論文、源程序等內(nèi)容在內(nèi)的畢業(yè)設(shè)計(jì)電子文檔及其它相關(guān)材料。 |
---|
第3頁
主要參考文獻(xiàn)(資料):[1] 李英杰. 基于JAVA技術(shù)的網(wǎng)絡(luò)考試管理系統(tǒng)的研究與開發(fā)[D]. 杭州: 同濟(jì)大學(xué),2007, (23):頁碼.[2] 王添財(cái). 基于Java EE的在線考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 廣東:華南理工大學(xué),2014.[3] 劉毅. 人工智能在自動(dòng)組卷建模中應(yīng)用研究[J]. 計(jì)算機(jī)仿真,2011.[4] 郭琳. Java Web中錯(cuò)誤異常的處理方法分析[J]. 電子技術(shù)與軟件工程,2015.[5] 關(guān)海偉. Java Web的云存儲(chǔ)技術(shù)研究[D]. 杭州:杭州電子科技大學(xué),2014,(23):頁碼.[6] Renuka Kumar. Detection of Obfuscation in Java Malware[J]. 愛思唯爾期刊,2016. [7] 鄭保平,郭榮寧. 數(shù)據(jù)庫技術(shù)研究綜述[J]. 軍事通信系統(tǒng),2003,(18): 頁碼.[8] Ronald P .Anjard. The Basics of Database Management Systems[J]. Emerald期刊,1994.[9] Sepideh Naghdi. Preventing database schema extraction by error message handing[J]. 愛思唯爾期刊, 2015. [10] 朱少民. 軟件測試方法和技術(shù)[D]. 杭州:清華大學(xué)出版社,2010.[11] 柳純錄. 軟件評測師教程[J]. 杭州:清華大學(xué)出版社,2005.[12] 舒華峰. 自動(dòng)組卷系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 吉林:吉林大學(xué),2014,(15):頁碼. |
---|
畢業(yè)設(shè)計(jì)(論文)
論文題目 | 網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) |
---|
Thesis Topic | The design and implementation of the network examination system |
畢業(yè)設(shè)計(jì)(論文)任務(wù)書
第1頁
畢業(yè)設(shè)計(jì)(論文)題目:網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)(論文)要求及原始數(shù)據(jù)(資料):了解國內(nèi)外網(wǎng)絡(luò)考試系統(tǒng)的發(fā)展現(xiàn)狀,深入分析考試系統(tǒng)的工作流程;根據(jù)考試系統(tǒng)的工作流程設(shè)計(jì)系統(tǒng)的總體結(jié)構(gòu),繪制總體結(jié)構(gòu)圖;設(shè)計(jì)系統(tǒng)的功能模塊,如:后臺(tái)系統(tǒng)維護(hù)模塊,包括試題的錄入、維護(hù)、刪除等功能;前臺(tái)考試模塊,包括考題的分發(fā)、考試時(shí)間的記錄等功能;教師組題模塊,包括考題的生成、題型的選擇、分值的設(shè)定等功能;設(shè)計(jì)并實(shí)現(xiàn)教師考前出題的組題功能模塊,包括考題類型、數(shù)量、每個(gè)題分?jǐn)?shù)的設(shè)定等;熟練地運(yùn)用和掌握J(rèn)avaWeb技術(shù)和MySql數(shù)據(jù)庫編程;進(jìn)行考試系統(tǒng)的程序代碼編寫、調(diào)試運(yùn)行以及功能測試;訓(xùn)練檢索文獻(xiàn)資料和利用文獻(xiàn)資料的能力;訓(xùn)練撰寫技術(shù)文檔與學(xué)位論文的能力。 |
---|
第2頁
畢業(yè)設(shè)計(jì)(論文)主要內(nèi)容:1.綜述網(wǎng)絡(luò)考試系統(tǒng)的項(xiàng)目背景及國內(nèi)外發(fā)展現(xiàn)狀;2.分析傳統(tǒng)考試形式的工作流程,設(shè)計(jì)網(wǎng)絡(luò)考試系統(tǒng);3.闡明網(wǎng)絡(luò)考試系統(tǒng)的運(yùn)行環(huán)境及開發(fā)工具; 4.給出管理員題庫后臺(tái)維護(hù)管理模塊、教師組題模塊、前臺(tái)考試模塊的設(shè)計(jì)方法;5. 介紹網(wǎng)絡(luò)考試系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)方法;6.闡述網(wǎng)絡(luò)考試系統(tǒng)中每個(gè)功能模塊的程序編寫、調(diào)試、運(yùn)行及達(dá)到的實(shí)際效果;7.對系統(tǒng)進(jìn)行全面測試,分析測試結(jié)果并詳細(xì)說明自己的網(wǎng)絡(luò)考試系統(tǒng)中具有亮點(diǎn)的模塊和不足之處。學(xué)生應(yīng)交出的設(shè)計(jì)文件(論文):1.內(nèi)容完整、層次清晰、敘述流暢、排版規(guī)范的畢業(yè)設(shè)計(jì)論文;2.包括畢業(yè)設(shè)計(jì)論文、源程序等內(nèi)容在內(nèi)的畢業(yè)設(shè)計(jì)電子文檔及其它相關(guān)材料。 |
---|
第3頁
主要參考文獻(xiàn)(資料):[1] 李英杰. 基于JAVA技術(shù)的網(wǎng)絡(luò)考試管理系統(tǒng)的研究與開發(fā)[D]. 杭州: 同濟(jì)大學(xué),2007, (23):頁碼.[2] 王添財(cái). 基于Java EE的在線考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 廣東:華南理工大學(xué),2014.[3] 劉毅. 人工智能在自動(dòng)組卷建模中應(yīng)用研究[J]. 計(jì)算機(jī)仿真,2011.[4] 郭琳. Java Web中錯(cuò)誤異常的處理方法分析[J]. 電子技術(shù)與軟件工程,2015.[5] 關(guān)海偉. Java Web的云存儲(chǔ)技術(shù)研究[D]. 杭州:杭州電子科技大學(xué),2014,(23):頁碼.[6] Renuka Kumar. Detection of Obfuscation in Java Malware[J]. 愛思唯爾期刊,2016. [7] 鄭保平,郭榮寧. 數(shù)據(jù)庫技術(shù)研究綜述[J]. 軍事通信系統(tǒng),2003,(18): 頁碼.[8] Ronald P .Anjard. The Basics of Database Management Systems[J]. Emerald期刊,1994.[9] Sepideh Naghdi. Preventing database schema extraction by error message handing[J]. 愛思唯爾期刊, 2015. [10] 朱少民. 軟件測試方法和技術(shù)[D]. 杭州:清華大學(xué)出版社,2010.[11] 柳純錄. 軟件評測師教程[J]. 杭州:清華大學(xué)出版社,2005.[12] 舒華峰. 自動(dòng)組卷系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 吉林:吉林大學(xué),2014,(15):頁碼. |
---|
網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
摘 要
科技在進(jìn)步,人們生活和工作的方式正發(fā)生著改變,不僅體現(xiàn)在人們的衣食住行,也體現(xiàn)在與時(shí)俱進(jìn)的考試形式上。以前的考試需要組織者投入大量的時(shí)間和精力,需要對考試的試題進(jìn)行篩選,對后期的考卷進(jìn)行批閱,這么多的步驟影響了整個(gè)考試執(zhí)行的效率。因此,本文提出了一種網(wǎng)絡(luò)考試系統(tǒng),用于解決上述的一些問題。
本文描述的網(wǎng)絡(luò)考試系統(tǒng)主要是利用瀏覽器作為界面,利用B/S模式,即用戶可利用瀏覽器直接訪問本站點(diǎn)。主要用到的技術(shù)是采用JavaWeb技術(shù)和MySql數(shù)據(jù)庫等設(shè)計(jì)出了各種功能。該系統(tǒng)主要有用戶管理、功能管理、角色權(quán)限管理、學(xué)生網(wǎng)絡(luò)考試、試題管理、錯(cuò)題管理、自動(dòng)組卷等功能。
本文提供了一些該系統(tǒng)的部分代碼跟截圖幫助介紹該系統(tǒng),對系統(tǒng)的總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)以及測試都給出了一些介紹,還對運(yùn)行截圖以及代碼作出了相應(yīng)的解釋。該網(wǎng)絡(luò)考試系統(tǒng)基本上可以滿足一些簡單的考試,運(yùn)行良好,基本可以滿足設(shè)計(jì)要求。
關(guān)鍵詞: 考試;JavaWeb;網(wǎng)絡(luò)
The design and implementation of the network examination system
Abstract
Science and technology in progress, people living and working the way is changing, not only reflected in people's basic necessities, but also reflected in the form of examination with the times. The previous exams require the organizers to devote a lot of time and effort to the examination of the examination questions, the late examination of the examination papers, so many steps affect the efficiency of the entire examination. Therefore, this paper presents a network test system, used to solve some of the above problems.
This article describes the network test system is mainly using the browser as an interface, the use of B / S mode, that users can use the browser to directly access the site. The main use of the technology is the use of JavaWeb technology and MySql database design a variety of functions. The system mainly has user management, function management, role rights management, student network examination, test questions management, wrong title management, automatic test paper and other functions.
This article provides some of the system code and screenshots to help introduce the system, the overall design of the system, detailed design and testing are given some introduction, but also on the operation of the screenshot and the code to make a corresponding explanation. The network test system is basically able to meet some simple exams, running well, the basic can meet the design requirements.
Keywords:Examination; JavaWeb; Network
目 錄
摘 要ii
Abstractiiii
第1章 緒論11
1.1 研究的目的及意義11
1.2 研究開發(fā)現(xiàn)狀分析11
1.3 研究的內(nèi)容11
第2章 系統(tǒng)相關(guān)技術(shù)33
2.1 JAVA簡介33
2.2 J2EE33
2.3 MySQL44
2.4 MyEclipse55
2.5 JavaScript66
2.6 JQuery66
2.7 CSS377
2.8 JSP77
2.9 Tomcat服務(wù)器88
第3章 可行性與需求分析99
3.1 可行性分析99
3.2 需求分析99
第4章 系統(tǒng)總體設(shè)計(jì)1111
4.1. 系統(tǒng)概要功能圖1111
4.2 系統(tǒng)基本功能1111
4.2.1 登錄功能1111
4.2.2 系統(tǒng)答題1111
4.2.3 答題得分1212
4.2.4 錯(cuò)題解析1212
4.2.5 系統(tǒng)功能管理1212
4.2.6 用戶管理1212
4.2.7 角色管理1212
4.2.8 題目管理1313
4.2.9 試卷管理1313
4.3 數(shù)據(jù)庫設(shè)計(jì)1313
第5章 系統(tǒng)詳細(xì)設(shè)計(jì)1818
5.1 學(xué)生用戶端1818
5.1.1 學(xué)生用戶登錄1818
5.1.2 主界面1919
5.1.3 系統(tǒng)答題2020
5.1.4 答題得分2121
5.1.5 錯(cuò)題解析2424
5.2 管理員端2424
5.2.1 管理員登錄2424
5.2.2 管理員主界面2525
5.2.3 系統(tǒng)功能管理2525
5.2.4 用戶管理2727
5.2.5 角色管理2929
5.2.6 題目管理3030
5.2.7 試卷管理3232
5.3 數(shù)據(jù)管理3333
第6章 系統(tǒng)測試3737
6.1 功能測試3737
6.2 兼容性測試4242
6.3 測試的方法4242
第7章 結(jié)束語4343
致謝4444
參考文獻(xiàn)4545
外文翻譯4646
第1章 緒論
1.1 研究的目的及意義
在我們以往的考試經(jīng)歷中,我們可以看到,每次考試都需要經(jīng)過出試卷、印試卷、發(fā)卷、做卷、收卷、閱卷、統(tǒng)計(jì)等過程,這幾個(gè)過程有著很強(qiáng)的先后次序,不能順序顛倒。這些過程中,又以出卷、閱卷和統(tǒng)計(jì)最為復(fù)雜,當(dāng)一次考試涉及的人數(shù)眾多時(shí),老師需要批閱非常多的卷子,重復(fù)的批閱卷子浪費(fèi)了大量的時(shí)間,此外,不僅效率底下,同時(shí)大量的閱卷工作也讓老師疲于應(yīng)付,最后導(dǎo)致閱卷的準(zhǔn)確率下降。即便閱卷完成之后,工作還沒結(jié)束,還需要對這些卷子進(jìn)行分?jǐn)?shù)登記、成績統(tǒng)計(jì)以及對各個(gè)題目進(jìn)行錯(cuò)誤率統(tǒng)計(jì),這些工作消耗時(shí)間非常多,因此效率也是非常低的。此外,從學(xué)生角度出發(fā),每次做卷都要準(zhǔn)備筆和草稿紙,麻煩且不符合環(huán)保的要求,從老師的角度出發(fā),如果能夠減少出卷、閱卷和統(tǒng)計(jì)的時(shí)間,那么可以騰出更多的時(shí)間用在其他的地方。因此本文基于JavaWeb技術(shù)希望開發(fā)一套網(wǎng)絡(luò)考試系統(tǒng)來解決出卷、閱卷、統(tǒng)計(jì)花費(fèi)時(shí)間過多的問題,同時(shí)為學(xué)校教務(wù)信息化作出一份貢獻(xiàn)。
本文開發(fā)的網(wǎng)絡(luò)考試系統(tǒng)具有一定的現(xiàn)實(shí)意義,主要是解決教師在出卷、閱卷和統(tǒng)計(jì)上花費(fèi)時(shí)間過多的問題。開發(fā)一個(gè)系統(tǒng)需要考慮很多方面的問題,比如說時(shí)效性和高效性這是兩個(gè)最最常見的因素,因?yàn)闀r(shí)效性關(guān)系到你的系統(tǒng)在投入使用時(shí)是不是真的能夠解決當(dāng)前所存在的這些問題,網(wǎng)絡(luò)考試系統(tǒng)在國內(nèi)雖然已經(jīng)初具規(guī)模,一些學(xué)校也在使用這種方式考試,但我覺得目前的考試系統(tǒng)還存在著一些未解決的問題,還需進(jìn)一步完善。同時(shí)高效性也是一個(gè)非常重要的因素,如果你的系統(tǒng)用了以后還不如不用那么你的系統(tǒng)必定是一個(gè)不成功的產(chǎn)品這也是我們開發(fā)需要考慮的一個(gè)重要問題。本系統(tǒng)目前只可以實(shí)現(xiàn)對一門科目的客觀題的考試,基本上還不是特別成熟的一個(gè)系統(tǒng),我還需要考慮如何進(jìn)行多科目的主客觀題型的考試是我以后研究的方向。因此是本系統(tǒng)的開發(fā)具有很重要的實(shí)際意義,能在當(dāng)前的發(fā)展?fàn)顟B(tài)下為學(xué)生和教師提供適當(dāng)?shù)膸椭耐瑫r(shí)也為今后此類軟件的發(fā)展提供一定的基礎(chǔ)。
1.2 研究開發(fā)現(xiàn)狀分析
國內(nèi)考試系統(tǒng)的信息化發(fā)展比較緩慢,在廣泛化應(yīng)用的過程中,開發(fā)者一方面不斷投資購建各種硬件、系統(tǒng)軟件和網(wǎng)絡(luò),另一方面也不斷開發(fā)實(shí)施了各類教學(xué)軟件、數(shù)據(jù)統(tǒng)計(jì)、信息記錄等應(yīng)用系統(tǒng),形成了一定規(guī)模的信息化建設(shè)體系??墒牵捎谀壳皣鴥?nèi)的系統(tǒng)還不是很完善,比如一門考試就需要一個(gè)系統(tǒng)去支持,這樣成本太高,而且我國集體信息化水平有些落后,資金短缺等因素。我國的網(wǎng)絡(luò)考試系統(tǒng)還沒有很好地完全自如的融入到我們的學(xué)習(xí)生活中,比其他國家有一定的差距。國外的管理與國內(nèi)完全不同,不但在線考試化建設(shè)早,而且他們有堅(jiān)強(qiáng)的技術(shù)團(tuán)隊(duì)來提供技術(shù)基礎(chǔ)。
1.3 研究的內(nèi)容
本系統(tǒng)的研究目的在于實(shí)現(xiàn)網(wǎng)絡(luò)考試系統(tǒng),實(shí)現(xiàn)該系統(tǒng)要完成的工作包括如下幾個(gè)方面:
(1)了解全球的網(wǎng)絡(luò)考試系統(tǒng)的發(fā)展歷程和現(xiàn)狀。深入解析其工作流程。
(2)根據(jù)該系統(tǒng)的工作流程設(shè)計(jì)其總體結(jié)構(gòu),繪制其結(jié)構(gòu)圖。
(3)設(shè)計(jì)系統(tǒng)的功能模塊,如:后臺(tái)系統(tǒng)運(yùn)行維護(hù)模塊。包括試題的錄入、篩選、刪除,隨機(jī)生成,提交,打分等功能。前臺(tái)考試模塊,包括題的分發(fā)、時(shí)間的記錄等功能。教師組題模塊,具有考題的生成、選擇、分?jǐn)?shù)評判的等能力。設(shè)計(jì)并實(shí)現(xiàn)教師考前出題的組題功能模塊。包括題類型,數(shù)量,每個(gè)題考分的設(shè)定等。
(4)熟練地運(yùn)用和掌握J(rèn)avaWeb技術(shù)和MySql數(shù)據(jù)庫編程,進(jìn)行考試系統(tǒng)的程序代碼編寫、調(diào)試運(yùn)行以及功能測試。
(5)了解電腦服務(wù)器的運(yùn)行問題以及原理;大數(shù)據(jù)庫的儲(chǔ)存;以及大數(shù)據(jù)庫與程序的互相交流問題。
本網(wǎng)絡(luò)考試系統(tǒng)運(yùn)用了很多的開發(fā)工具以及以java為基礎(chǔ)的開發(fā)語言,在后臺(tái)的代碼編寫中主要運(yùn)用了Java、J2EE;前臺(tái)的設(shè)計(jì)中運(yùn)用了JavaScript、JQuery、css等一些開發(fā)語言;通過eclipse來編寫這些程序;用mysql進(jìn)行數(shù)據(jù)庫的設(shè)計(jì)與分析;另外該網(wǎng)絡(luò)考試系統(tǒng)的部署容器為tomcat,當(dāng)需要進(jìn)行考試時(shí),只需要配置tomcat服務(wù)器,便可進(jìn)行考試。
2.1 JAVA簡介
Java作為一種計(jì)算機(jī)編程語言,其在企業(yè)網(wǎng)絡(luò)和Internet環(huán)境的應(yīng)用更是十分廣泛,現(xiàn)在已成為Internet中最受歡迎、最有影響的編程語言之一。其最大的特點(diǎn)就是面向?qū)ο?,這種面向?qū)ο蟮某绦蛟O(shè)計(jì)更接近我們的思維方式,相對于面向過程的程序設(shè)計(jì),它最大的優(yōu)點(diǎn)就是可擴(kuò)展性和可維護(hù)性,這也使我們的代碼更健壯。
我們都知道面向?qū)ο笾饕兴拇筇匦裕悍庋b、抽象、繼承和多態(tài)。
封裝:在面向?qū)ο笳Z言中,封裝特性最為直接的體現(xiàn)在類中,類即現(xiàn)實(shí)生活中的實(shí)體的抽象,我們將其所擁有的屬性和方法封裝到類中,對外部我們提供相應(yīng)的接口,通過實(shí)例化的對象可以調(diào)用類中封裝好的屬性和方法,并且在使用這些方法時(shí)并不用知曉其內(nèi)部的具體實(shí)現(xiàn),這是面向?qū)ο蟮姆庋b特性;
抽象:抽象就是將一類實(shí)體的所共同擁有的特性抽象出來,封裝在一個(gè)抽象類中,抽象在面向?qū)ο笳Z言中是由抽象類來體現(xiàn)的。抽象類描述的是一類事物共有的東西,而并非特指某種事物,所以在Java編程語言中體現(xiàn)為抽象類不能實(shí)例化;
繼承:繼承就是指子類可以繼承父類或者接口,從而可以實(shí)現(xiàn)代碼重用,其實(shí)繼承體現(xiàn)的是單繼承關(guān)系,父類和子類本質(zhì)上還是一類實(shí)體。
多態(tài):Java中的多態(tài)具有多重含義。首先多態(tài)最為直白的體現(xiàn)就是父類對象引用不同的子類對象實(shí)例,調(diào)用不同的子類重寫的方法從而表現(xiàn)出不同的行為。多態(tài)能夠提高代碼重用,還可為程序提供更好的可擴(kuò)展性。
2.2 J2EE
J2EE是一項(xiàng)目架構(gòu)標(biāo)準(zhǔn)主要用于網(wǎng)頁的開發(fā)通過這個(gè)標(biāo)準(zhǔn)可以制定出一些應(yīng)用于企業(yè)的網(wǎng)站。嚴(yán)格地來說,J2EE并不屬于一種產(chǎn)品而是一種約束或者是標(biāo)準(zhǔn)。有的人把它稱開發(fā)的規(guī)范,因此,不管是哪一家公司他們只要在這個(gè)架構(gòu)下進(jìn)行開發(fā)都可以開發(fā)出一款比較實(shí)用的高級應(yīng)用程序。J2EE從開發(fā)到設(shè)計(jì),再到最后的綜合管理可以構(gòu)成一套完整的開發(fā)體系,J2EE是由oracle軟件公司跟其他多數(shù)享譽(yù)盛名的科技公司共同努力發(fā)明并且應(yīng)用起來的。J2EE是軟件開發(fā)的一項(xiàng)標(biāo)準(zhǔn)。J2EE并非是一種生產(chǎn)產(chǎn)品,它既可以說一種開發(fā)標(biāo)準(zhǔn),也能夠說是一種開發(fā)規(guī)范。無論是哪家公司都能夠在這種現(xiàn)有統(tǒng)一的標(biāo)準(zhǔn)下開發(fā)出一套屬于自己企業(yè)的高級應(yīng)用系統(tǒng)的。J2EE是一個(gè)公司級平臺(tái)。它用來給那些在公司經(jīng)營項(xiàng)目中遇到的研發(fā)、設(shè)計(jì)、系統(tǒng)管控有關(guān)難題進(jìn)行簡化。
J2EE可以說這一項(xiàng)技術(shù)是根據(jù)JAVA標(biāo)準(zhǔn)升級而成而不是憑空獨(dú)創(chuàng)的,J2EE不斷的更新和發(fā)展最終形成了現(xiàn)在的約束和規(guī)范。J2EE技術(shù)首先要不違背它所繼承的技術(shù)和規(guī)范標(biāo)準(zhǔn),比如說對數(shù)據(jù)庫的訪問以及良好的跨平臺(tái)性質(zhì),以及分布式的應(yīng)用。同時(shí),還要適用于各種各樣的使用人群。除此之外必須還要為其他的網(wǎng)頁開發(fā)或者企業(yè)開發(fā)提供大量的預(yù)留接口,體現(xiàn)其強(qiáng)大的可擴(kuò)展性。其他的開發(fā)人員可以通過這些預(yù)留的接口對該規(guī)范和準(zhǔn)則進(jìn)行更加標(biāo)準(zhǔn)和一致性高的開發(fā),從而體現(xiàn)出J2EE標(biāo)準(zhǔn)的強(qiáng)大的伸縮性。那么最終的一個(gè)目的就是要使得程序開發(fā)人員在開發(fā)過程中盡量少使用市場上的一些現(xiàn)有的框架,從而規(guī)范一個(gè)正確的開發(fā)體系。那么,他是利用一種開發(fā)模型,此模型呈現(xiàn)分布式。以此來完成對所有應(yīng)用的開發(fā)。在開發(fā)過程中主要根據(jù)系統(tǒng)的各個(gè)功能進(jìn)行劃分,也可將這些功能劃分為不同的組件。不同的組件會(huì)存放在不同的服務(wù)器上,并通過不同的用戶接口進(jìn)行管理。那么使用這一標(biāo)準(zhǔn)可以明確的規(guī)范開發(fā)的流程,并且可以通過MVC來解決系統(tǒng)層次和架構(gòu)的問題,使得開發(fā)人員更加輕松的開發(fā)代碼,并且讓維護(hù)人員或者后期的修改人員能更加方便地查看系統(tǒng)的代碼和結(jié)構(gòu)。
2.3 MySQL
MySQL是一款開源的數(shù)據(jù)庫。它具有非常實(shí)用的價(jià)值。他屬于中型數(shù)據(jù)庫。MySQL提供了許多的技術(shù)支持其中包括了多操作系統(tǒng)的支持也包括了多線程的支持,同時(shí)也提供多種資源的支持,除此之外,還可以提供多種的數(shù)據(jù)庫連接方法解決數(shù)據(jù)庫并發(fā)和大量數(shù)據(jù)操作的問題 。使用MySQL的人都會(huì)認(rèn)為這個(gè)數(shù)據(jù)庫特別實(shí)用。由于它是完全開源和免費(fèi)的,在使用成本上也不會(huì)有太大的損失,因此是目前中小型公司主要使用的數(shù)據(jù)庫之一。從數(shù)據(jù)庫關(guān)系來看他是一款關(guān)系型數(shù)據(jù)庫具有很多優(yōu)點(diǎn)比如說用的內(nèi)存空間較小用戶界面簡單操作起來十分便捷并且不需要太多繁瑣的安裝步驟。MySQL是由MySQL公司開發(fā)而成,那么這個(gè)公司是一個(gè)什么公司呢?從歷史數(shù)據(jù)來看它是一個(gè)非常有商業(yè)眼光的公司,也是非常成功的一個(gè)公司,它所開發(fā)的產(chǎn)品都受到了人們的青睞。MySQL本身的特性也非常的突出,他能夠兼容多種操作系統(tǒng),同時(shí)也能兼容多種的編程語言,比如說Linux環(huán)境下使用,也同時(shí)能夠支持多種編程語言并為這些編程語言提供他們所要使用的用戶接口。在性能方面具有處理大數(shù)據(jù)高并發(fā)的處理能力,并且不會(huì)占用太多的主機(jī)內(nèi)存,這一點(diǎn)相對其他的數(shù)據(jù)庫要好很多。MySQL的架構(gòu)應(yīng)用圖如2-1所示:
圖2-1 Mysql架構(gòu)服務(wù)圖
MySQL使用了好幾種軟件進(jìn)行測試,保證這個(gè)可用性;它支持好多種操作系統(tǒng);支持多線程,提供了很多資源;也提種了很多數(shù)據(jù)庫連接方法;它還可以處理很多比較大的數(shù)據(jù)庫。大部分使用這個(gè)軟件的人就會(huì)有很大的幫助了,而且還因?yàn)槠渌_放源碼軟件,也還大大降低總體擁有成本了。
MySQL數(shù)據(jù)庫是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在WEB應(yīng)用方面MySQL數(shù)據(jù)庫是最好的RDBMS(Relational Database Management System:關(guān)系型數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。關(guān)系型數(shù)據(jù)庫有較強(qiáng)的靈活性,它將數(shù)據(jù)保存到不同的表中,這樣將數(shù)據(jù)進(jìn)一步細(xì)分,讀取速度和靈活性就會(huì)提高。MySQL數(shù)據(jù)庫是真正做到了多線程、多用戶的SQL數(shù)據(jù)庫[9]。它使用最常用標(biāo)準(zhǔn)化語言去訪問數(shù)據(jù)庫。MySQL數(shù)據(jù)庫以其成本低、體積小、速度快和源碼開發(fā)的優(yōu)點(diǎn),開發(fā)中小型的網(wǎng)站都選用MySQL數(shù)據(jù)庫作為數(shù)據(jù)庫。
在大學(xué)期間,MySQL做為我們最先接觸和理解的數(shù)據(jù)庫其基礎(chǔ)應(yīng)用相對廣泛,此次畢業(yè)設(shè)計(jì)我也選用MySQL做為后臺(tái)數(shù)據(jù)庫。
MySQL數(shù)據(jù)庫的實(shí)現(xiàn)是以一個(gè)客戶機(jī)/服務(wù)器結(jié)構(gòu)[13]的形式,它是很多不同的客戶程序和庫和一個(gè)服務(wù)器守護(hù)程序組合而成的。
MySQL數(shù)據(jù)庫主要是快度速、比較健壯和易于使用。我們需要這樣一個(gè)SQL服務(wù)器,它能基于不昂貴的基礎(chǔ)上,處理數(shù)據(jù)速度快,加之可視化插件、軟件的使用可以使其數(shù)據(jù)操作更加方便。
可以總結(jié)出MySQL具有以下幾個(gè)特性:
- 支持AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統(tǒng);
- 為多種編程語言提供了API;
- 支持多線程,充分利用CPU資源;
- 通過優(yōu)化的SQL語句算法,有效地增進(jìn)了查詢速度;
- 能夠作為單獨(dú)的應(yīng)用程序?yàn)榭蛻舳朔?wù)器網(wǎng)絡(luò)環(huán)境提供數(shù)據(jù)支持,也能夠作為庫而嵌入到其他的軟件,完成相關(guān)的數(shù)據(jù)存儲(chǔ)作用;
- 提供多種語言支持,數(shù)據(jù)表名和數(shù)據(jù)列名都可以使用多種編碼方式如中文的GB 2312、BIG5,日文的Shift_JIS等;
- 提供多種用于管理數(shù)據(jù)庫操作的管理工具;
使用MySql數(shù)據(jù)庫用作集群服務(wù)器管理系統(tǒng)的數(shù)據(jù)庫。可以讓服務(wù)器大量的相關(guān)數(shù)據(jù)得以快捷地查詢處理。
2.4 MyEclipse
MyEclipse是一種有集成效果的開發(fā)工具。在Eclipse的基礎(chǔ)上進(jìn)行插件的集成,最終形成功能強(qiáng)大的開發(fā)軟件。目前主要用于JAVA,JAVAEE的開發(fā),也可以用于移動(dòng)應(yīng)用的開發(fā),其主要特點(diǎn)是功能強(qiáng)大,應(yīng)用廣泛,并且支持很多開源的產(chǎn)品,應(yīng)用前景非常廣發(fā)。
MyEclipse是由Eclipse通過對插件的集成而來,是對IDE的拓展,可以用來開發(fā)網(wǎng)頁等應(yīng)用,可以實(shí)現(xiàn)程序的開發(fā),調(diào)試,發(fā)布等,能極大的提高開發(fā)效率,能完美支持HTML、STRUTS等,可以說集成后的MyEclipse包含了當(dāng)前所有主流的開源產(chǎn)品。MyEclpise也經(jīng)歷了很多代的產(chǎn)品,從最開始的到后來的2014版本,2015版本等都說明了它在發(fā)展歷程中的變化。
MyEclipse的配置使用也非常智能,不需要使用者懂太多的知識(shí),只需要在自己使用的功能中進(jìn)行了解即可,在完成項(xiàng)目開發(fā)之后,也可以直接通過MyEclipse進(jìn)行項(xiàng)目部署,可以將網(wǎng)頁項(xiàng)目進(jìn)行選中,直接運(yùn)行在Tomcat中,也可以將項(xiàng)目打包通過導(dǎo)出功能將項(xiàng)目全部導(dǎo)出,然后將項(xiàng)目發(fā)布到tomcat中,通過對配置文件的設(shè)置,完成布置,布置完項(xiàng)目以后可以在瀏覽器中進(jìn)行查看??梢哉f,有了MyEclipse之后,基本就能支持所有的web開發(fā),就能使用快捷的編譯工具進(jìn)行快速的開發(fā),也能在各種各樣的服務(wù)器上進(jìn)行代碼測試。在其他方面,MyEclispe也有很多的開發(fā)前景,比如在云開發(fā)領(lǐng)域,在移動(dòng)端開發(fā)領(lǐng)域,在企業(yè)級開發(fā)領(lǐng)域等等,因此,MyEclipse的應(yīng)用場景非常的廣泛。
2.5 JavaScript
JavaScript看樣子和Java很像,但是,實(shí)際上它們之間并沒有直接聯(lián)系,只是大家都以Java開頭而已。目前互聯(lián)網(wǎng)上最重要的語言是什么?不是Java,不是.Net,也不是PHP,而是JavaScript,它是互聯(lián)網(wǎng)上最重要的語言。它不僅能跨平臺(tái)、跨瀏覽器,它還能跨后端語言。在WEB2.0時(shí)代,JavaScript語言像橋一樣,將前端頁面和后端服務(wù)器連接了起來,這樣前端頁面不用知道服務(wù)器那里是用什么語言編寫的,也不用知道是如何編寫的,而服務(wù)器那頭也不用知道前端是用什么語言寫的,只需要知道前端會(huì)傳過來一些固定格式的數(shù)據(jù)信息。JavaScript編寫的程序是在瀏覽器中運(yùn)行的,它不會(huì)在服務(wù)器那頭運(yùn)行,一定程度上減少了服務(wù)器那頭的壓力。JavaScript語言在網(wǎng)頁完全加載完畢后,可以與網(wǎng)頁產(chǎn)生互動(dòng)來完成一些操作,利用這個(gè)特性,我們經(jīng)常將JavaScript運(yùn)用在驗(yàn)證表單、修改HTML元素和存儲(chǔ)用戶數(shù)據(jù)等方面上。這些功能,F(xiàn)lash和Silverlight都能完成,但是Flash和Silverlight都要單獨(dú)的安裝插件,使用門檻比較高,而且針對不同的瀏覽器,插件也不一樣,在一堆插件中,用戶很難選擇正確的插件進(jìn)行安裝。而JavaScript不同,它不需要額外的安裝什么東西,只要是個(gè)瀏覽器,就能支持。JavaScript的語法與C的語法類似,語句通過在最后加上“;”符號(hào)來表示結(jié)束,同樣的大小寫敏感,注釋也是“//”開始。因此學(xué)習(xí)過C語言的人能夠很快的上手JavaScript的開發(fā)工作。
2.6 JQuery
如果把開發(fā)人員扔回石器時(shí)代,那么JavaScript就是一堆繩子、木頭和石頭,通過用這些工具,人類就可以在石器時(shí)代活下來,同樣的,開發(fā)人員也能用JavaScript做任何事。但是,如果說我們把繩子、木頭和石頭組裝起來,做成榔頭,做成弓箭,那么無論是打獵還是耕作,效率都會(huì)有很大的提升。jQuery就是這里的榔頭和弓箭。jQuery是由JavaScript寫的,它封裝了一些我們在創(chuàng)作網(wǎng)頁時(shí)候常用的操作,比如對DOM的修改、AJAX等操作,這些操作如果讓開發(fā)人員自己用JavaScript編寫,那么可能要花幾十行代碼,復(fù)雜的甚至要上百行,同時(shí)考慮到這些操作比較頻繁,那么一個(gè)頁面上你會(huì)看到很多很多的JavaScript代碼,開發(fā)成本和維護(hù)成本都會(huì)很高,代碼也不容易讀。在jQuery,這些操作只需要少數(shù)幾行代碼甚至一行代碼就能完成,減少了開發(fā)人員的負(fù)擔(dān),也讓后期維護(hù)更加簡單。繩子、木頭和石頭可以組裝成榔頭、弓箭等,同樣的,JavaScript也能組裝成許多和jQuery類似的工具,但是我們?yōu)槭裁催x擇jQuery,而不選擇其他的呢?一方面是因?yàn)閖Query功能強(qiáng)大且容易學(xué)習(xí),另一方面,jQuery從發(fā)行到現(xiàn)在,經(jīng)歷了許多版本的迭代,不僅穩(wěn)定,而且網(wǎng)上相關(guān)的資料也更齊全,遇到問題也能更容易的解決。此外,在jQuery的支持下,還誕生一大批基于jQuery的插件,比如UI插件、彈窗、選項(xiàng)卡、導(dǎo)航菜單、在線客服、瀑布流、3D、時(shí)間軸等等的插件,這些插件不僅簡化了開發(fā),還使網(wǎng)頁更加美觀,用戶交互體驗(yàn)更加好?;谏鲜鲈颍旁诒姸喙ぞ咧?,采用了jQuery。
2.7 CSS3
Cascading Style Sheets(CSS),中文叫層疊樣式表?,F(xiàn)在來說我們已經(jīng)進(jìn)入了WEB2.0的時(shí)代,WEB2.0下的網(wǎng)站不僅需要好看的外觀,同時(shí)還要用戶體驗(yàn)良好的界面。CSS2標(biāo)準(zhǔn),從現(xiàn)在的大環(huán)境下去看,顯然已經(jīng)不能滿足日益增長的用戶需求和開發(fā)需求。因此CSS3標(biāo)準(zhǔn)應(yīng)運(yùn)而生。CSS的作用是控制頁面的布局,除了控制布局外,它還能夠?qū)撁嫔系淖煮w顏色、大小、字體、背景和你能在網(wǎng)頁上看到的一切進(jìn)行控制。日前很多瀏覽器都能很好的支持CSS3標(biāo)準(zhǔn)。
CSS3引入許多新特性,以字體為例,在以前的CSS版本中,如果我們將網(wǎng)頁的字體設(shè)置成“宋體”,那么大多數(shù)的電腦都能正常顯示,可是我們都知道,MacOS系統(tǒng)里的字體要比Windows下的字體好看,但是如果我們將網(wǎng)頁的字體設(shè)置為MacOS系統(tǒng)里的字體,那么Windows系統(tǒng)用戶就沒辦法正常訪問。這在老版本的CSS中是沒辦法解決的,但是在CSS3中,通過@Font-face特性,可以允許瀏覽器從服務(wù)器上加載字體文件,換句話說,即便你的電腦上沒有這種字體,你也能正常的訪問用了這個(gè)字體的頁面??梢奀SS3賦予了更大的靈活性。除了@Font-face特性外,CSS3還引入了包括Word-wrap & Text-overflow樣式、文字渲染、多列布局、漸變、陰影、反射、盒子模型、Transforms 和 Animation Transitions等等新特性,這些新特點(diǎn)的引進(jìn),降低了創(chuàng)造者的開發(fā)難度,也提高了體驗(yàn)。
2.8 JSP
JSP(Java Script Pages)是由Sun公司建立的一種動(dòng)態(tài)網(wǎng)頁技術(shù),它是建立在HTML文件基礎(chǔ)上的。在傳統(tǒng)的網(wǎng)頁HTML文件(*.htm,*.html)中加入Java程序。
首先JSP是跨平臺(tái)的,因?yàn)镴ava就是可移植跨平臺(tái)的,而JSP技術(shù)是建立在Java平臺(tái)之上,所以使用JSP開發(fā)的Web應(yīng)用也是跨平臺(tái)的。
JSP頁面不僅可以使用普通網(wǎng)頁一樣使用標(biāo)準(zhǔn)標(biāo)記語言的元素(如HTML標(biāo)記)以外,還可以使用其獨(dú)有的JSP標(biāo)記。JSP可以直接向數(shù)據(jù)庫中獲取或?qū)懭霐?shù)據(jù),所以通過JSP,我們可以在網(wǎng)頁中加入更多動(dòng)態(tài)內(nèi)容。
JSP有如下優(yōu)點(diǎn):
(1)一次編寫,到處運(yùn)行。除了系統(tǒng)之外,代碼不用做任何更改。
(2)JSP具有多平臺(tái)支持。可以在任意平臺(tái)上的任意環(huán)境中開發(fā),在任意環(huán)境中進(jìn)行系統(tǒng)的部署和擴(kuò)展。相比JSP的多平臺(tái)支持相比ASP/.net的局限性是顯而易見的。
(3)具有可伸縮性。不論是只有一個(gè)小的Jar文件就可以運(yùn)行的Servlet/JSP,還是由多臺(tái)服務(wù)器進(jìn)行集群和負(fù)載均衡,亦或者由多臺(tái)Application來事務(wù)處理,Java顯示了其廣闊的應(yīng)用范圍和巨大的生命力。
(4)功能強(qiáng)大的多樣化的開發(fā)工具支持。Java已經(jīng)有了許多非常優(yōu)秀的開發(fā)工具,其中大部分可以免費(fèi)得到,并且其中大多都能運(yùn)行在多平臺(tái)下。
選取JSP的原因
JSP通過其獨(dú)有的標(biāo)簽庫,使靜態(tài)HTML網(wǎng)頁技術(shù)向動(dòng)態(tài)網(wǎng)頁技術(shù)完善。通過其在網(wǎng)絡(luò)編程中的使用,可以利用嵌入Java代碼使其充分利用Java語言的上手容易,跨平臺(tái),運(yùn)行效率高等優(yōu)點(diǎn)。具備一定程序設(shè)計(jì)的基本知識(shí),學(xué)習(xí)JSP也十分容易。
首先JSP是一種動(dòng)態(tài)網(wǎng)頁編程語言,再加上JSP具有跨平臺(tái)、運(yùn)行效率高、易學(xué)易用等特點(diǎn)和優(yōu)勢,做簡單界面比較容易,故選用JSP來實(shí)現(xiàn)網(wǎng)絡(luò)考試系統(tǒng)。
2.9 Tomcat服務(wù)器
Tomcat 服務(wù)器是Apache組織的一個(gè)開源子項(xiàng)目。具備基本的web服務(wù)的功能,是中小型系統(tǒng)首選的服務(wù)器,更是開發(fā)和調(diào)試JSP 程序的首選。因?yàn)門omcat 技術(shù)不僅免費(fèi)而且性能穩(wěn)定,我們在本科階段的很多web項(xiàng)目中也多為使用Tomcat作為服務(wù)器,其也成為目前比較流行使用的Web 應(yīng)用服務(wù)器。
如果配置正確,Tomcat 服務(wù)器實(shí)際上在運(yùn)行JSP 頁面和Servlet容器。此外,Tomcat和其他Web服務(wù)器一樣,都具有基于處理HTML頁面的功能,另外它還是一個(gè)Servlet和JSP容器。獨(dú)立的Servlet容器是Tomcat服務(wù)器的默認(rèn)模式。目前Tomcat服務(wù)器最新版本為8.0.0,本次畢設(shè)我使用的也是Tomcat8。
此外,Tomcat 服務(wù)器運(yùn)行時(shí)占用的系統(tǒng)資源較小,可擴(kuò)展性良好,支持郵件服務(wù)和負(fù)載平衡等開發(fā)應(yīng)用系統(tǒng)常用的功能。因此利用Tomcat服務(wù)器作為網(wǎng)絡(luò)考試系統(tǒng)的Web應(yīng)用服務(wù)器。
3.1 可行性分析
可行性分析是用最小的代價(jià)在最短的時(shí)間內(nèi)確定問題是否能夠解決。我首先需要進(jìn)一步對上一章節(jié)目前考試系統(tǒng)現(xiàn)狀的分析。之后初步的確定項(xiàng)目的規(guī)模跟目標(biāo),確定項(xiàng)目的約束跟限制,必須分析幾種可能解法的利弊,從而判定原定系統(tǒng)的目標(biāo)和規(guī)模是否能夠?qū)崿F(xiàn),系統(tǒng)完成后帶來的效益是否能夠達(dá)到最大值。總之,只有認(rèn)真的進(jìn)行了可行性分析,才會(huì)避免或者減輕項(xiàng)目開發(fā)后期可能出現(xiàn)的困境。
1. 經(jīng)濟(jì)可行性
經(jīng)濟(jì)可行性的重要方面是研究成本,其中包含畢業(yè)設(shè)計(jì)所需的開發(fā)成本,對開發(fā)成本是不是會(huì)大于開發(fā)項(xiàng)目前期預(yù)計(jì)利潤進(jìn)行預(yù)算。在結(jié)合上述所有情況的分析下,我覺得自己的畢設(shè)課題是經(jīng)濟(jì)可行性好的。首先開發(fā)此次畢設(shè)軟件不要前期的投入資金,其次是自己設(shè)計(jì)的,最多是自己去圖書館找書,在實(shí)驗(yàn)室做項(xiàng)目,通過老師教導(dǎo),同學(xué)幫助,這些都是免費(fèi)的,再有就是需要一臺(tái)電腦,這些都是能接受的,成本很小的同時(shí)我也可能夠提升我在編碼方面的實(shí)現(xiàn)能力。
2. 技術(shù)可行性
本課題使用的是Java技術(shù),開發(fā)平臺(tái)選用Eclipse,Eclipse有著完整配備的功能,便于初學(xué)者使用還有代碼提示,讓我使用更加得心應(yīng)手。在決定了編程框架后,再說用Java語言編碼的優(yōu)點(diǎn):快,精簡,可用性高等。同時(shí),使用的數(shù)據(jù)庫是MySQL,開源的MySQL增添了可視化和穩(wěn)定化的優(yōu)點(diǎn),而且安全方面也做得很好,更別說它的強(qiáng)大的保存數(shù)據(jù)功能以及查詢數(shù)據(jù)功能。
- 操作可行性
該網(wǎng)絡(luò)考試系統(tǒng)部署容器為tomcat,當(dāng)需要進(jìn)行考試時(shí),只需要配置tomcat服務(wù)器,便可進(jìn)行考試。本系統(tǒng)采用jsp技術(shù),利用網(wǎng)絡(luò)就能夠進(jìn)行訪問和操作,且界面簡單易操作,用戶只要有電腦,都能進(jìn)行訪問和操作。本系統(tǒng)具有易操作、易管理、交互性好的特點(diǎn),在操作上是非常簡單的。因此本系統(tǒng)可以進(jìn)行開發(fā)。
3.2 需求分析
一.功能需求分析
網(wǎng)絡(luò)考試系統(tǒng)主要用于實(shí)現(xiàn)高校在線考試,基本功能包括:自動(dòng)組卷、試卷發(fā)布、試卷批閱、試卷成績統(tǒng)計(jì)等。本系統(tǒng)結(jié)構(gòu)如下:
(1)學(xué)生端:
登錄模塊:登錄功能;
網(wǎng)絡(luò)考試模塊:可參加考試,并查看考試結(jié)果,提交試卷后老師允許的情況下查看錯(cuò)題;
(2)超級管理員端:
登錄模塊:實(shí)現(xiàn)管理員登錄功能;
用戶管理模塊:實(shí)現(xiàn)用戶信息的增加、修改、查看功能;
角色權(quán)限管理模塊:實(shí)現(xiàn)角色的增加、修改、查看功能;
試卷管理模塊:實(shí)現(xiàn)試卷信息的增加、修改、查看功能;
試題管理模塊:實(shí)現(xiàn)試題信息的增加、修改、查看功能;
- 試題管理員端(老師):
試卷管理模塊:實(shí)現(xiàn)試卷信息的增加、修改、查看功能;
試題管理模塊:實(shí)現(xiàn)試題信息的增加、修改、查看功能;
二.非功能需求分析
1、整個(gè)系統(tǒng)的設(shè)計(jì)中,系統(tǒng)必須滿足以下要求:
(1)數(shù)據(jù)安全性
存儲(chǔ)有關(guān)隱私權(quán)的網(wǎng)絡(luò)考試等問題的系統(tǒng)數(shù)據(jù),需要確保數(shù)據(jù)的安全性,在網(wǎng)站設(shè)計(jì)時(shí)必須要采取安全防范措施,以解決潛在的安全問題,比如如何防止學(xué)生上網(wǎng)查答案。
(2)易用性
在用戶權(quán)限范圍內(nèi),可在一個(gè)統(tǒng)一風(fēng)格的界面內(nèi)即可完成相關(guān)的所有業(yè)務(wù)流程操作或者獲取所有相關(guān)信息,大大提高操作員的工作效率和易用性,靈活應(yīng)用本系統(tǒng)。
(3)柔軟性
由于這個(gè)網(wǎng)絡(luò)考試系統(tǒng)涉及到范圍廣泛的業(yè)務(wù),設(shè)計(jì)出的系統(tǒng)必須能夠處理接受變化的能力。
(4)擴(kuò)展性
隨著互聯(lián)網(wǎng)管理業(yè)務(wù)管理需求的不斷變化,老師管理系統(tǒng)必然涉及到業(yè)務(wù)更新及擴(kuò)展,這就要求在設(shè)計(jì)之初就應(yīng)該考慮良好的可擴(kuò)展性方案。
第4章 系統(tǒng)總體設(shè)計(jì)
4.1. 系統(tǒng)概要功能圖
本系統(tǒng)所開發(fā)的網(wǎng)絡(luò)考試系統(tǒng)主要分成了三個(gè)模塊的主要功能,系統(tǒng)功能、考試功能和學(xué)生功能,每個(gè)功能都包含了幾個(gè)子功能,子功能主要包括:對于系統(tǒng)功能方面的管理、角色的管理、用戶方面的管理、對于試題管理、對于的試卷管理、學(xué)生答題、總結(jié)出錯(cuò)題庫與得分。系統(tǒng)的概要功能圖如圖4-1所示:
圖4-1 系統(tǒng)概要功能圖
4.2 系統(tǒng)基本功能
系統(tǒng)功能的劃分方式可以分成很多種類,前面是按照功能模塊進(jìn)行劃分,將系統(tǒng)分成三個(gè)模塊,本章節(jié)依據(jù)網(wǎng)絡(luò)考試系統(tǒng)的系統(tǒng)角色不同,可以分成用戶端和管理員端。用戶端包括:登錄功能、學(xué)生答題、答題得分以及考完試之后的錯(cuò)題解析。管理員端包括:登錄功能、系統(tǒng)功能管理、用戶管理、角色管理、題目管理、試卷管理。下面本節(jié)主要對各個(gè)基本的功能進(jìn)行一個(gè)簡介。(此處沒有對試題管理員進(jìn)行詳細(xì)介紹,因?yàn)楣芾韱T的題目管理跟試卷管理的功能就是他的功能)
4.2.1 登錄功能
登錄功能是一個(gè)系統(tǒng)的重要組成部分,也是一個(gè)系統(tǒng)重要的門戶功能,登錄功能主要實(shí)現(xiàn)了使用者對系統(tǒng)的登錄,在本文所設(shè)計(jì)的體系中,登錄主要分成了兩種身份:學(xué)生用戶和管理員。兩種身份登陸,能細(xì)分系統(tǒng)的功能模塊,實(shí)現(xiàn)更加方便的操作和管理。
4.2.2 系統(tǒng)答題
系統(tǒng)答題模塊是本系統(tǒng)的一個(gè)重要功能,可以實(shí)現(xiàn)讓用戶的答題操作。系統(tǒng)答題功能主要是學(xué)生用戶登錄以后操作的,學(xué)生用戶在輸入正確的用戶名和密碼以后能開始系統(tǒng)答題,系統(tǒng)答題的題目均來自數(shù)據(jù)庫。
4.2.3 答題得分
答題得分功能實(shí)現(xiàn)了學(xué)生用戶在答題結(jié)束以后對自己得分情況的查看,該功能就實(shí)現(xiàn)了登錄系統(tǒng)的學(xué)生用戶在完成自己的試卷以后,點(diǎn)擊體提交就能看到自己的得分,因此該功能是一個(gè)展示性質(zhì)的功輔助能。
4.2.4 錯(cuò)題解析
錯(cuò)題解析功能是系統(tǒng)答題功能的一個(gè)輔助或者說優(yōu)化的功能,只有學(xué)生用戶在登錄系統(tǒng)完成答題以后在老師允許的情況下才能進(jìn)行該功能的操作,學(xué)生答題可能存在一定的錯(cuò)誤,對錯(cuò)誤題目的查看成為考試系統(tǒng)的子功能。因此本文所設(shè)計(jì)的錯(cuò)題解析功能,能讓學(xué)生迅速發(fā)現(xiàn)正確或者錯(cuò)誤題目,以及解析過程。這樣方便自學(xué)和改進(jìn)。學(xué)生功能結(jié)構(gòu)圖,如圖4-2所示:
圖4-2學(xué)生系統(tǒng)結(jié)構(gòu)圖
4.2.5 系統(tǒng)功能管理
系統(tǒng)功能管理主要實(shí)現(xiàn)了對系統(tǒng)的其他功能進(jìn)行管理,主要包括對新功能的添加和編輯,對現(xiàn)有功能的添加和修改,同時(shí)能對現(xiàn)有的功能進(jìn)行子功能的編輯和修改,修改后的功能可以在系統(tǒng)中被查看。
4.2.6 用戶管理
用戶管理是一個(gè)系統(tǒng)的重要功能之一,對用戶的管理可以實(shí)現(xiàn)對系統(tǒng)使用者的了解和查看,能讓使用者更加方便的使用本系統(tǒng),用戶的種類分為多種,本文主要體現(xiàn)在學(xué)生用戶和管理者兩種用戶上面,可以對用戶的信息進(jìn)行添加修改等。
4.2.7 角色管理
角色管理主要是針對用戶來設(shè)計(jì)的,不同的用戶擁有不同的權(quán)力。換句話說就是操作的權(quán)限是不同的。學(xué)生賬號(hào)只能進(jìn)行答題等行為,而不能進(jìn)行后臺(tái)的管理員操作。管理員賬號(hào)也擁有不一樣的權(quán)利。這些權(quán)力體現(xiàn)在對賬號(hào)的操作,試卷和題目的管理上,因此對權(quán)限的管理能很好的控制系統(tǒng)用戶的行為,有利于系統(tǒng)更加穩(wěn)定的運(yùn)行。
4.2.8 題目管理
題目管理主要是針對管理員的功能,該功能面向系統(tǒng)中試卷所使用的題目庫,在本系統(tǒng)中,管理員能通過對題目的添加和修改對題目進(jìn)行管理,可以查看現(xiàn)有的題目,同時(shí)也能對新的題目進(jìn)行添加,為試卷的生成提供更多題目的選擇。
4.2.9 試卷管理
試卷管理是本系統(tǒng)的核心功能,主要實(shí)現(xiàn)的是對學(xué)生用戶考試答題的試卷進(jìn)行管理,通過系統(tǒng)隨機(jī)抽取的題目自動(dòng)生成試卷并且能將試卷存入數(shù)據(jù)庫,供學(xué)生考試時(shí)進(jìn)行選擇。管理員功能結(jié)構(gòu)圖,如圖4-3所示:
圖4-3 管理員功能結(jié)構(gòu)圖
4.3 數(shù)據(jù)庫設(shè)計(jì)
數(shù)據(jù)庫的設(shè)計(jì)十分重要,下面將對本文所使用的數(shù)據(jù)表進(jìn)行逐一的介紹。
1. 用戶表及ER圖
表4.1用戶表
字段名 | 數(shù)據(jù)類型 | 長 度 | 字段含義 | 是否主鍵 | 是否外鍵 |
---|
userid | INTEGER | 11 | 用戶ID | 是 | |
roleid | INTEGER | 11 | 角色id | | 是 |
username | VARCHAR | 20 | 用戶賬戶名 | | |
userpwd | VARCHAR | 20 | 用戶密碼 | | |
usertruename | VARCHAR | 30 | 真實(shí)姓名 | | |
用戶表ER圖,如圖4-4所示:
圖4-4 用戶表ER圖
用戶id:每一個(gè)登陸的用戶都有一個(gè)特有的編號(hào);
角色id:學(xué)生、超級管理員、試題管理員,三個(gè)角色分別對應(yīng)一個(gè)編號(hào);
賬號(hào):登錄時(shí)需要用到的;
密碼:密碼對應(yīng)相應(yīng)的賬號(hào);
姓名:用戶的真實(shí)姓名;
狀態(tài):1為正常,0為禁用。
2. 角色表
表4.2角色表
字段名 | 數(shù)據(jù)類型 | 長度 | 字段含義 | 是否主鍵 | 是否外鍵 |
---|
roleid | INTEGER | 11 | 角色id | 是 | |
rolename | VARCHAR | 20 | 角色名 | | |
rolestate | INTEGER | 11 | 角色狀態(tài) | | |
角色id:學(xué)生、超級管理員、試題管理員,三個(gè)角色分別對應(yīng)一個(gè)編號(hào);
角色名:學(xué)生、超級管理員、試題管理員;
角色狀態(tài):1為正常,0為禁用。
3. 功能表ER圖
表4.3功能表
字段名 | 數(shù)據(jù)類型 | 長度 | 字段含義 | 是否主鍵 | 是否外鍵 |
---|
funid | INTEGER | 11 | 功能ID | 是 | |
funname | VARCHAR | 20 | 功能名 | | |
funurl | VARCHAR | 200 | 功能地址 | | |
funpid | INTEGER | 11 | 頂層功能ID | | |
funstate | INTEGER | 11 | 功能狀態(tài) | | |
功能表ER圖,如圖4-5所示:
圖4-5 功能表ER圖
功能id:每個(gè)功能對應(yīng)的編號(hào);
功能名:分別有系統(tǒng)功能管理、角色管理、用戶管理、題目管理、試卷管理等;
功能地址:每個(gè)功能對應(yīng)一個(gè)地址,用于管理;
頂層功能id:系統(tǒng)功能包括系統(tǒng)功能管理、角色管理、用戶管理,試題管理包括題目管理、試卷管理;
狀態(tài):1為正常,0為禁用。
4. 權(quán)限表ER圖
表4.4權(quán)限表
字段名 | 數(shù)據(jù)類型 | 長度 | 字段含義 | 是否主鍵 | 是否外鍵 |
---|
rrid | INTEGER | 11 | 角色權(quán)限ID | 是 | |
funid | INTEGER | 11 | 功能ID | | 是 |
權(quán)限表ER圖,如圖4-6所示:
圖4-6 權(quán)限表ER圖
角色權(quán)限id:每個(gè)角色所擁有的權(quán)限對應(yīng)的編號(hào);
功能id:每個(gè)功能對應(yīng)的編號(hào);
5. 試題表ER圖
表4.5試題表
字段名 | 數(shù)據(jù)類型 | 長度 | 字段含義 | 是否主鍵 | 是否外鍵 |
---|
sid | INTEGER | 11 | 試題ID | 是 | |
scontent | VARCHAR | 150 | 題干 | | |
sa | VARCHAR | 100 | A選項(xiàng) | | |
sb | VARCHAR | 100 | B選項(xiàng) | | |
sc | VARCHAR | 100 | C選項(xiàng) | | |
sd | VARCHAR | 100 | D選項(xiàng) | | |
試題表ER圖,如圖4-7所示:
圖4-7 試題表ER圖
試題id:每道題對應(yīng)的編號(hào);
題干:題目的內(nèi)容;
6. 試卷表ER圖
表4.6試卷表
字段名 | 數(shù)據(jù)類型 | 長度 | 字段含義 | 是否主鍵 | 是否外鍵 |
---|
pid | INTEGER | 11 | 試卷ID | 是 | |
pname | VARCHAR | 11 | 試卷名 | | |
sid | INTEGER | 11 | 試題ID | | 是 |
試卷表ER圖,如圖4-8所示:
圖4-8 試卷表ER圖
試卷ID:每套試卷對應(yīng)的編號(hào);
試卷名:試卷對應(yīng)的名字;
試題id:每道題對應(yīng)的編號(hào);
7. 學(xué)生試卷表ER圖
表4.7學(xué)生試卷表
字段名 | 數(shù)據(jù)類型 | 長度 | 字段含義 | 是否主鍵 | 是否外鍵 |
---|
spid | INTEGER | 11 | 試卷ID | 是 | |
userid | INTEGER | 11 | 用戶ID | | 是 |
sid | INTEGER | 11 | 角色I(xiàn)D | | 是 |
studentkey | VARCHAR | 10 | 學(xué)生答案 | | |
studentstate | INTEGER | 11 | 試題答案 | | |
學(xué)生試卷表ER圖,如圖4-9所示:
圖4-9 學(xué)生試卷表ER圖
試卷ID:每套試卷對應(yīng)的編號(hào);
用戶id:每一個(gè)登陸的用戶都有一個(gè)特有的編號(hào);
角色id:學(xué)生、超級管理員、試題管理員,三個(gè)角色分別對應(yīng)一個(gè)編號(hào);
學(xué)生答案:學(xué)生做試卷后的結(jié)果;
試題答案:每道題的正確答案;
本章主要介紹網(wǎng)絡(luò)考試系統(tǒng)的詳細(xì)設(shè)計(jì),分別從用戶端和管理員端介紹各個(gè)功能模塊的實(shí)現(xiàn)情況和運(yùn)行截圖。下面首先介紹用戶端,然后介紹管理員端。
5.1 學(xué)生用戶端
在這個(gè)系統(tǒng)中使用者主要是分為管理員和學(xué)生,我在這里先介紹學(xué)生用戶系統(tǒng)的運(yùn)行情況。以下是學(xué)生用戶從登陸到錯(cuò)題解析的整個(gè)運(yùn)行流程情況將在下面的論文中進(jìn)行展示。
5.1.1 學(xué)生用戶登錄
學(xué)生用戶登陸,先到這個(gè)界面。 如圖5-1所示:
圖5-1用戶登錄運(yùn)行界面
在進(jìn)入登錄界面以后選擇學(xué)生登錄,再輸入正確的用戶名和正確的密碼,就可以登錄。如圖5-2所示:
圖5-2用戶登錄輸入界面
用戶正確完成登錄輸入以后,系統(tǒng)會(huì)根據(jù)用戶所輸入的信息,通過功能代碼實(shí)現(xiàn)與數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)的對比,從而判別該登錄用戶是否合法,如果不合法將提示輸入正確的登錄信息,輸入正確則登錄系統(tǒng),進(jìn)入系統(tǒng)的主界面。
5.1.2 主界面
學(xué)生用戶正確登錄系統(tǒng)之后會(huì)跳轉(zhuǎn)到學(xué)生用戶端的界面,主界面如圖5-3所示:
圖5-3學(xué)生用戶主界面
學(xué)生用戶的主界面主要包含了試卷列表和查看錯(cuò)題兩個(gè)功能,試卷列表中羅列了所有考試的試卷,學(xué)生可以根據(jù)老師的要求選擇對應(yīng)的的試卷進(jìn)行考試,考試結(jié)束以后還可以進(jìn)行錯(cuò)題查看功能。
5.1.3 系統(tǒng)答題
學(xué)生用戶登錄系統(tǒng)以后選擇試卷列表中的試卷進(jìn)行考試答題,答題界面如圖5-4所示:
圖5-4學(xué)生用戶答題界面
學(xué)生要在一定的時(shí)間內(nèi),完成試卷上的所有題目,然后進(jìn)行提交,答題的進(jìn)度和時(shí)間的限制可以系統(tǒng)會(huì)給出提示,運(yùn)行界面如圖5-5所示:
圖5-5學(xué)生用戶答題進(jìn)度界面
5.1.4 答題得分
學(xué)生在規(guī)定的時(shí)間內(nèi)完成答題,完成以后提交系統(tǒng),提交系統(tǒng),系統(tǒng)會(huì)根據(jù)題庫對比得到考試成績,成績界面如圖5-6所示:
圖5-6學(xué)生用戶答題成績界面
計(jì)時(shí)器(到時(shí)自動(dòng)交卷)功能,交卷時(shí)判斷試卷是否有未答題、計(jì)算得分等功能都在paper.jsp中用javascript來實(shí)現(xiàn)
// 交卷功能
判斷是否有未答題目
function unAnswer(){
if(unanswer != 0){
layer.open({
title:'警告',
content: "還有"+unanswer+"道題目未做!",
icon:2,
end:
function(){
postAnswer();
}
});
}
else{
postAnswer();
}
}
計(jì)算得分
function getScore(){
//var spid = n
$.post({
url: basePath + 'user/studentPaper?cmd=score&userid='+'${userid}'+'&spid='+ now.getTime(),
contentType:
false,
processData:
false,
success:
function(res) {
console.log(res)
layer.open({
title:'得分',
content: res,
icon:1,
end:
function(){
location.href = basePath+'user/studentPaper?cmd=stupaper';
}
})
},
error:
function(res) {
console.log('error');
}
})
}
倒計(jì)時(shí)功能
//小于10的數(shù)字前面補(bǔ)0
function p(n){
return n<10?'0'+n:n;
}
//獲取當(dāng)前時(shí)間
var now=
new Date();
//獲取結(jié)束時(shí)間
var endDate=
new Date();
//設(shè)置考試時(shí)間(單位分鐘)
endDate.setMinutes(now.getMinutes()+20)
function getTime(){
var startDate=
new Date();
var countDown=(endDate.getTime()-startDate.getTime())/1000;
var h=parseInt(countDown/(60*60)%24);
var m=parseInt(countDown/60%60);
var s=parseInt(countDown%60);
$('.time').html(p(h)+'時(shí)'+p(m)+'分'+p(s)+'秒');
if(countDown<=0){
document.getElementById('time').innerHTML='考試結(jié)束';
layer.open({
title:'警告',
content: '考試時(shí)間到,試卷已經(jīng)提交!',
icon:5,
end:
function(){
unAnswer();
}
})
}
else{
setTimeout('getTime()',500);
}
}
getTime()
學(xué)生得到成績以后可以對自己的本次成績進(jìn)行查看,也能對自己的其他考試試卷的成績進(jìn)行查看,查看界面如圖5-7所示:
圖5-7學(xué)生答題情況成績結(jié)果界面
5.1.5 錯(cuò)題解析
學(xué)生用戶能對自己的答題試卷中錯(cuò)誤的題進(jìn)行查看,并且能看到錯(cuò)題的解析,但是此功能只是一個(gè)輔助優(yōu)化功能,必須是在交卷之后老師同意的情況下,才能查看。錯(cuò)題的解析界面如圖5-8所示
圖5-8學(xué)生用戶錯(cuò)題解析界面
學(xué)生能根據(jù)數(shù)據(jù)庫中給出的正常答案,對比自己的錯(cuò)誤選項(xiàng)進(jìn)行研究和學(xué)習(xí),達(dá)到考試提升能力的效果。
5.2 管理員端
管理員端的功能主要為了更好的管理系統(tǒng),讓學(xué)生用戶能順利考試,因此管理員功能在實(shí)現(xiàn)的時(shí)候需要考慮的因素和功能會(huì)比較多,下面對管理員如何在這個(gè)系統(tǒng)中操作進(jìn)行演示。試卷管理員(老師)的功能包括在其中。
5.2.1 管理員登錄
管理員登錄和學(xué)生用戶登錄使用的是同一個(gè)登錄界面,區(qū)別在于登錄時(shí)選取的身份是管理員身份,登錄界面如圖5-9所示:
圖5-9管理員登錄界面
5.2.2 管理員主界面
管理員正確輸入信息后會(huì)跳轉(zhuǎn)到管理員的主界面,主界面如圖5-10所示:
圖5-10管理員主界面
在管理員主界面上,我們可以看到管理員端主要分成了兩個(gè)部分的功能,第一個(gè)是系統(tǒng)功能,第二個(gè)是試卷管理功能,下面將對這兩個(gè)功能下的子功能進(jìn)行逐一介紹。
5.2.3 系統(tǒng)功能管理
系統(tǒng)功能管理實(shí)現(xiàn)了所有的父功能和子功能之間的聯(lián)系,能讓管理員更方便得查看各個(gè)功能的實(shí)現(xiàn)情況。系統(tǒng)功能管理的界面如圖5-11所示:
圖5-11系統(tǒng)功能管理界面
功能之間存在著主次關(guān)系,可以通過新建實(shí)現(xiàn)新的功能,也可以通過編輯來實(shí)現(xiàn)功能間的聯(lián)系,新建功能如圖5-12所示:
圖5-12系統(tǒng)新建功能界面
編輯系統(tǒng)子功能如圖5-13所示:
圖5-13系統(tǒng)功能管理編輯子功能界面
5.2.4 用戶管理
實(shí)現(xiàn)用戶的管理解決的是學(xué)生的使用系統(tǒng)有關(guān)的問題,用戶管理界面如圖5-14所示:
圖5-14用戶管理界面
用戶管理可以對用戶進(jìn)行新增、修改和查詢,用戶新增界面如圖5-15所示:
圖5-15用戶新增界面
用戶修改界面如圖5-16所示:
圖5-16用戶修改界面
用戶查詢界面如圖5-17所示:
圖5-17用戶查詢界面
5.2.5 角色管理
角色管理主要把各個(gè)角色之間的權(quán)限管理實(shí)現(xiàn)了,方便最高權(quán)限的人對其他管理員的管理。角色管理界面如圖5-18所示:
圖5-18角色管理界面
對角色的管理主要體現(xiàn)在對角色的權(quán)限控制上,權(quán)限設(shè)置界面如圖5-19所示:
圖5-19角色設(shè)置界面
角色可以通過添加完成。添加角色界面如圖5-20所示:
圖5-20角色新增界面
5.2.6 題目管理
題目的管理主要實(shí)現(xiàn)對所有考試題目得新增和編輯。題目管理界面如圖5-21所示:
圖5-21題目管理界面
實(shí)現(xiàn)對現(xiàn)有題目的編輯如圖5-22所示:
圖5-22題目編輯界面
除了對現(xiàn)有題目的修改,還能實(shí)現(xiàn)對新題目的添加,新增新題目的界面如圖5-23所示:
圖5-23題目新增界面
5.2.7 試卷管理
試卷的管理是學(xué)生考試的關(guān)鍵功能,試卷管理界面如圖5-24所示:
圖5-24試卷管理界面
試卷的種類分為很多種,要想從試卷中找到相關(guān)的試卷可以啟動(dòng)搜索功能,搜索界面如圖5-25所示:
圖5-25試卷搜索界面
可以隨機(jī)抽取題目生成試卷。生成試卷的界面如圖5-26所示:
圖5-26試卷新增界面
在DAO層,利用隨機(jī)函數(shù),(設(shè)置試卷題目和插入題目數(shù)量)實(shí)現(xiàn)自動(dòng)組卷
public Integer addpaper(Paper paper) {
// TODO Auto-generated method stub
String sql = "INSERT INTO paper(pname,sid) SELECT ?,sid FROM " +
"subject where sstate = 1 ORDER BY rand() LIMIT ?";
Integer rtn =DBUnitHelper.executeUpdate(sql,paper.getPname(),paper.getScount());
return rtn;
5.3 數(shù)據(jù)管理
數(shù)據(jù)管理對代碼與數(shù)據(jù)庫之間的連接和交互起作用,數(shù)據(jù)庫交互實(shí)現(xiàn)的代碼為:
Connection conn = null;
try {
DbUtils.loadDriver("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/exam", "root", "zhs2668281");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
完成數(shù)據(jù)庫的連接,進(jìn)行一些簡單的數(shù)據(jù)庫操作,包括增刪改查等,主要代碼為:
public static Integer executeUpdate(String sql,Object ...objects){
Connection conn = getConn();
QueryRunner qr = new QueryRunner();
Integer rtn = 0;
try {
if(objects == null){
rtn = qr.update(conn, sql);
}else{
rtn = qr.update(conn, sql, objects);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
DbUtils.close(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
return rtn;
}
public static Integer executeUpdate(String sql){
return executeUpdate(sql, null);
}
public static <T> List<T> executeQuery(String sql,Class<T> cls,Object ...objects){
Connection conn = getConn();
List<T> list = null;
try{
QueryRunner rq = new QueryRunner();
if(objects == null){
list = rq.query(conn, sql,new BeanListHandler<T>(cls));
}else{
list = rq.query(conn, sql,new BeanListHandler<T>(cls),objects);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
DbUtils.close(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
其中分頁查找的代碼為:
/**
* 帶分頁的查詢
* @param sql SQL語句
* @param map SQL參數(shù)
* @param pc 分頁控制對象,需要傳遞參數(shù):當(dāng)前第幾頁(currentindex),每頁顯示多少行:(pagesize)
* 分頁控件顯示多少也:showpcount
* @return
*/
public static <T> Pager<T> execlist(String sql,PageControl pc,Class cls,String pk,Object...object){
//獲取總記錄數(shù)sql
String sqlcount = "select count(*) as count from ("+sql+") a";
//獲取具體數(shù)據(jù)的SQL語句
Integer min = (pc.getCurrentindex()-1)*pc.getPagesize();
Integer max = pc.getPagesize();
String sqllist = "select * from ("+sql+") a where a."+pk+" limit "+min+","+max;
Connection conn = getConn();
Pager<T> pager = new Pager<T>();
try {
QueryRunner rq = new QueryRunner();
Object count = rq.query(conn, sqlcount, new ScalarHandler<Object>("count"), object);
List<T> list = executeQuery(sqllist,cls,object);
//設(shè)置總記錄數(shù)
Integer c = 0;
if(count!=null){
c=Integer.parseInt(count.toString());
}
pc.setRscount(c);
pager.setList(list);
pc = dealpage(pc);
pager.setPagectrl(pc);
DbUtils.close(conn);
} catch (Exception e) {
e.printStackTrace();
}
return pager;
}
第6章 系統(tǒng)測試
系統(tǒng)測試一個(gè)很主要的任務(wù)便是檢查系統(tǒng)中所存在的一些不足和需要改進(jìn)的方面,以此來提高整個(gè)系統(tǒng)的可靠性。而系統(tǒng)建設(shè)的一個(gè)更主要的目的是檢測整個(gè)系統(tǒng)的“執(zhí)行如何”。這其中可以把它分為三大步,分別是對于模塊測試、組裝測試以及對于驗(yàn)證的測試。而模塊測試即是要測試整個(gè)程序的正確與否,裝測試便是測試程序的接口正確與否,最后的驗(yàn)證測試是使用者是否滿足整個(gè)系統(tǒng)軟件的功能和性能的關(guān)鍵。一旦經(jīng)過系統(tǒng)檢測測試出所存在的一系列問題的時(shí)候就需要經(jīng)過不斷的調(diào)試,從而找出具體的錯(cuò)誤所存在的位置在哪里,以便更好的改正。黑盒測試要根據(jù)系統(tǒng)整體需求說明書,應(yīng)該全面覆蓋到系統(tǒng)聯(lián)合部件。系統(tǒng)檢測是對整個(gè)系統(tǒng)進(jìn)行一系列檢測,進(jìn)一步看看它是否符合需求規(guī)格的定義。在與需求規(guī)格定義不吻合或者是產(chǎn)生矛盾的地方要做進(jìn)一步的修改。我們進(jìn)行的軟件測試主要是包括功能測試和兼容性測試。
6.1 功能測試
為了確保程序的正常運(yùn)行為了保證每個(gè)功能都能實(shí)現(xiàn)既定的任務(wù),在程序開發(fā)結(jié)束時(shí)應(yīng)該對整個(gè)系統(tǒng)進(jìn)行功能測試。就像我們所知道的功能測試就是對我們所開發(fā)的產(chǎn)品的各個(gè)功能進(jìn)行逐一驗(yàn)證確保只能夠完成我們所設(shè)計(jì)的功能。在功能測試的過程中我們需要用到一些測試用例對每一項(xiàng)功能足以測試從而可以檢查我們所設(shè)計(jì)的系統(tǒng)能不能達(dá)到我們當(dāng)時(shí)所期望的所有功能。功能測試從另一個(gè)方面來講也可以叫做黑盒測試或者數(shù)據(jù)驅(qū)動(dòng)測試,因?yàn)樵诤诤袦y試和數(shù)據(jù)驅(qū)動(dòng)測試系功能測試中我們只需要考慮的是每一個(gè)獨(dú)立功能而不需要考慮整個(gè)代碼的功能。一般來講我們可以從系統(tǒng)的每一個(gè)小功能開始測試,比如說在本文中體現(xiàn)的就是登陸功能和發(fā)表評論功能,通過對這兩個(gè)小功能的測試我們可以得出結(jié)論我們的系統(tǒng)是否滿足我們所期望的功能需求的。
我們所接觸的功能測試一般也叫黑盒測試,我們部隊(duì)底層代碼或者其他因素進(jìn)行測試,我們只對各個(gè)功能進(jìn)行測試。我們首先會(huì)對整個(gè)界面的各個(gè)功能進(jìn)行測試,然后逐步深入,對每一個(gè)子功能進(jìn)行測試,這個(gè)就是我們預(yù)期的目標(biāo)。我們需要對所有功能進(jìn)行測試以確保我們的設(shè)計(jì)和我們的實(shí)現(xiàn)是一致的,這樣我們的功能說明說才是真實(shí)有效的。
我們進(jìn)行程序的功能測試主要是對功能完整性進(jìn)行測試,但是不是做完這些就可以了,我們還要對其他的部分進(jìn)行測試,這就好比:判斷條件的測試,輸入的測試等。功能測試如表5.1所示。
表6.1 功能測試表
測試需要達(dá)到的目標(biāo) | 進(jìn)行測試后需要完成下面的目標(biāo):首先我們先檢測軟件是不是達(dá)到了之前提出的要求。這些要求包括每個(gè)功能模塊是不是已實(shí)現(xiàn)。業(yè)務(wù)的過程是不是正確。這個(gè)系統(tǒng)的運(yùn)行是不是比較穩(wěn),系統(tǒng)的性能是不是在能夠接受的范圍。 |
---|
測試涉及到的范圍 | 在想清楚使用者希望有什么要求的時(shí)間里確定給出的功能模塊 |
技術(shù) | 先想出測試用例,然后再使用黑盒測試來測試各個(gè)用例 |
開始標(biāo)準(zhǔn) | 使用者投入使用,可以正常地操作 |
完成標(biāo)準(zhǔn) | 功能的實(shí)現(xiàn)還有操作空間滿足之前的設(shè)計(jì)標(biāo)準(zhǔn) |
測試重點(diǎn) | 測試重點(diǎn):軟件兼容性 |
有必要考慮的事項(xiàng) | 界面是不是合適不同尺寸不同分辨率使用 |
部分測試用例如表6.2、6.3所示:
表6.2 軟件測試用例表
用例編號(hào) | 501 |
---|
用例名稱 | 開始軟件用例測試。 |
用例簡述 | 用戶可以通過click圖標(biāo)來進(jìn)入軟件界面。 |
參與者 | 用戶。 |
前置條件 | 用戶已經(jīng)成功順利地啟動(dòng)這個(gè)軟件。 |
后置條件 | 體驗(yàn)者能夠順利地通過click按鈕來開始一段操作。 |
成功的條件 | 體驗(yàn)者觸摸按鈕就可以正常地操作,功能可以正常使用。 |
基本事件流 | 步驟 | 活動(dòng) |
| 1 | 體驗(yàn)者正常按流程啟動(dòng)程序,進(jìn)入到這個(gè)軟件的登陸界面,最后進(jìn)入此程序的主界面。 |
| 2 | 點(diǎn)擊選擇按鈕。 |
| 3 | 界面之間的跳轉(zhuǎn)。 |
規(guī)則與約束 | 用戶按操作說明正確操作 |
錯(cuò)誤等級如表6.3所示:
表6.3 錯(cuò)誤等級描述表
錯(cuò)誤等級 | 描述 | 響應(yīng)時(shí)間 |
---|
高 | 在模擬機(jī)上可以橫屏顯示,真機(jī)運(yùn)行不能橫屏顯示。 | 需要對Activity節(jié)點(diǎn)進(jìn)行強(qiáng)制橫屏的設(shè)置。應(yīng)立即處理。 |
中 | 軟件在電腦中運(yùn)行時(shí),操作反應(yīng)時(shí)間有些長。 | 優(yōu)化處理解決跳轉(zhuǎn)的方法。處理完嚴(yán)重問題后1小時(shí)內(nèi)處理。 |
低 | 不影響系統(tǒng)實(shí)現(xiàn)功能,但是在用的時(shí)候有些不方便,也可能是設(shè)計(jì)的界面不太好看。 | 有時(shí)間的話再進(jìn)行處理就可以。 |
功能測試會(huì)存在一定的等級誤差也可以理解成我們所開發(fā)的功能是否能滿足我們所期望的設(shè)計(jì)的一個(gè)范圍因此我們可以將錯(cuò)誤的等級劃分成幾個(gè)不同的種類。
表6.4用戶管理模塊功能測試用例
序號(hào) | 測試標(biāo)識(shí) | 測試項(xiàng)目名稱 | 測試用例輸入和說明 | 預(yù)測結(jié)果 | 記錄結(jié)果 |
---|
1 | 用戶管理模塊功能點(diǎn)。 | 新增加的用戶。 | 系統(tǒng)管理員點(diǎn)擊”新增”這個(gè)按鈕。 | 順利的進(jìn)入到新增用戶的界面。 | 測試可以通過。 |
2 | 用戶管理模塊功能點(diǎn)。 | 必填項(xiàng)。 | 空下必填項(xiàng),其他填寫好并提交。 | 提示(用戶名不能為空)。 | 測試中發(fā)現(xiàn)提示不易理解。 |
3 | 用戶管理模塊功能點(diǎn)。 | 全部置空。 | 令所有文本框?yàn)榭铡?/td> | 提示(用戶名不能為空)。 | 測試中發(fā)現(xiàn)提示不易理解。 |
4 | 用戶管理模塊功能點(diǎn)。 | 提交新增用戶信息。 | 在新增用戶界面輸入有效數(shù)據(jù)并點(diǎn)擊提交按鈕。 | 添加成功后跳轉(zhuǎn)到用戶列表界面。 | 測試通過。 |
表6.5角色管理模塊功能測試用例
序號(hào) | 測試標(biāo)識(shí) | 測試項(xiàng)目名稱 | 測試用例輸入和說明 | 預(yù)測結(jié)果 | 記錄結(jié)果 |
---|
1 | 角色管理模塊功能點(diǎn)。 | 新增角色。 | 系統(tǒng)管理員單擊”新增”按鈕。 | 成功進(jìn)入到新增角色界面。 | 測試通過。 |
2 | 角色管理模塊功能點(diǎn)。 | 必填項(xiàng)。 | 空下必填項(xiàng),其他填寫好并提交。 | 提示(角色名不能為空)。 | 測試中發(fā)現(xiàn)提示不易理解。 |
3 | 角色管理模塊功能點(diǎn)。 | 全部置空。 | 令所有文本框?yàn)榭铡?/td> | 提示(角色名不能為空)。 | 測試中發(fā)現(xiàn)提示不易理解。 |
4 | 角色管理模塊功能點(diǎn)。 | 提交新增角色信息。 | 在新增角色界面輸入有效數(shù)據(jù)并點(diǎn)擊提交按鈕。 | 添加成功后跳轉(zhuǎn)到角色列表界面。 | 測試通過。 |
表6.6系統(tǒng)功能管理模塊功能測試用例
序號(hào) | 測試標(biāo)識(shí) | 測試項(xiàng)目名稱 | 測試用例輸入和說明 | 預(yù)測結(jié)果 | 記錄結(jié)果 |
---|
1 | 系統(tǒng)功能管理模塊功能點(diǎn)。 | 新增系統(tǒng)功能。 | 系統(tǒng)管理員單擊”新增”按鈕。 | 成功進(jìn)入到新增系統(tǒng)功能界面。 | 測試通過。 |
2 | 系統(tǒng)功能管理模塊功能點(diǎn)。 | 必填項(xiàng)。 | 空下必填項(xiàng),其他填寫好并提交。 | 提示(系統(tǒng)功能名,子功能URL不能是空的)。 | 測試中發(fā)現(xiàn)提示不易理解。 |
3 | 系統(tǒng)功能管理模塊功能點(diǎn)。 | 全部置空。 | 令所有文本框?yàn)榭铡?/td> | 提示(系統(tǒng)功能名不能為空)。 | 測試中發(fā)現(xiàn)提示不易理解。 |
4 | 系統(tǒng)功能管理模塊功能點(diǎn)。 | 提交新增系統(tǒng)功能信息。 | 在新增系統(tǒng)功能界面輸入有效數(shù)據(jù)然后同時(shí)點(diǎn)擊提交按鈕。 | 添加成功后跳轉(zhuǎn)到系統(tǒng)功能列表界面。 | 測試通過。 |
表6.7題目管理模塊功功能測試用例
序號(hào) | 測試標(biāo)識(shí) | 測試項(xiàng)目名稱 | 測試用例輸入和說明 | 預(yù)測結(jié)果 | 記錄結(jié)果 |
---|
1 | 題目管理模塊功能點(diǎn)。 | 新增題目。 | 系統(tǒng)管理員單擊”新增”按鈕。 | 成功進(jìn)入到新增題目界面。 | 測試通過。 |
2 | 題目管理模塊功能點(diǎn)。 | 必填項(xiàng)。 | 空下必填項(xiàng),其他填寫好并提交。 | 提示(題干,選項(xiàng),標(biāo)準(zhǔn)答案不能為空)。 | 測試中發(fā)現(xiàn)提示不易理解。 |
3 | 題目管理模塊功能點(diǎn)。 | 全部置空。 | 令所有文本框?yàn)榭铡?/td> | 提示(題干,選項(xiàng),標(biāo)準(zhǔn)答案不能為空)。 | 測試中發(fā)現(xiàn)提示不易理解。 |
4 | 題目管理模塊功能點(diǎn)。 | 提交新增題目信息。 | 在新增題目界面輸入有效數(shù)據(jù)并點(diǎn)擊提交按鈕。 | 添加成功后跳轉(zhuǎn)到題目列表界面。 | 測試通過。 |
表6.8試卷管理模塊功能測試用例
序號(hào) | 測試標(biāo)識(shí) | 測試項(xiàng)目名稱 | 測試用例輸入和說明 | 預(yù)測結(jié)果 | 記錄結(jié)果 |
---|
1 | 試卷管理模塊功能點(diǎn)。 | 搜索查詢試卷。 | 系統(tǒng)管理員在查詢框內(nèi)輸入試卷名并點(diǎn)擊查詢。 | 成功搜索出來試卷記錄。 | 測試通過。 |
2 | 試卷管理模塊功能點(diǎn)。 | 查看試卷詳情。 | 系統(tǒng)管理員點(diǎn)擊查看試題。 | 成功跳轉(zhuǎn)到試卷詳情頁面。 | 測試通過。 |
3 | 試卷管理模塊功能點(diǎn)。 | 隨機(jī)組合試卷。 | 系統(tǒng)管理員點(diǎn)擊新增。 | 成功跳轉(zhuǎn)到組合試卷頁面必填試題數(shù)量(試題量高于題庫里量按照題庫最高數(shù)量取出)。 | 測試通過。 |
6.2 兼容性測試
兼容性測試是一個(gè)系統(tǒng)是否能在各種情況下正常運(yùn)行的關(guān)鍵,測試的環(huán)境主要在各個(gè)操作系統(tǒng)和各個(gè)瀏覽器上展開,軟件測試中的兼容性測試很重要,如果說一個(gè)B/S系統(tǒng)與大多數(shù)的主瀏覽器都不是很兼容,那么這個(gè)系統(tǒng)將不能在市場上穩(wěn)定的運(yùn)行。在本設(shè)計(jì)中,我們所提出的系統(tǒng)雖然不用考慮過多的商業(yè)因素但是也必須將兼容性測試后考慮在其中,這樣能讓系統(tǒng)在以后的使用中更加穩(wěn)定的運(yùn)行。因此對系統(tǒng)進(jìn)行一次兼容性測試是很有用的一個(gè)檢測方式。
6.3 測試的方法
軟件測試的常用方法基本有兩種:靜態(tài)測試和動(dòng)態(tài)測試。
1.靜態(tài)測試主要是指在不運(yùn)行程序的前提下,通過人工評審程序源代碼和程序有關(guān)的說明文檔以及其他各類資料,來發(fā)現(xiàn)軟件中存在的邏輯錯(cuò)誤和代碼錯(cuò)誤,但是該類方法有一定的局限性;
2.動(dòng)態(tài)測試顧名思義就是要運(yùn)行測試程序,檢查運(yùn)行結(jié)果和預(yù)期結(jié)果的差異,并分析運(yùn)行效率和健壯性等屬性,動(dòng)態(tài)測試的關(guān)鍵就是測試用例的構(gòu)建。目前,大部分公司的測試方式主要是動(dòng)態(tài)測試,動(dòng)態(tài)測試中設(shè)計(jì)測試用例的方法是白盒法與黑盒法;
白盒測試:也稱之為結(jié)構(gòu)測試,是將軟件看成了一個(gè)透明的白盒子,并按照程序的內(nèi)部結(jié)構(gòu)與處理邏輯來選定測試用例,對軟件的邏輯路徑及過程進(jìn)行測試,檢查它與設(shè)計(jì)是否相符。白盒測試:是通過程序的源代碼進(jìn)行測試而不使用用戶界面。這種類型的測試需要從代碼句法發(fā)現(xiàn)內(nèi)部代碼在算法,溢出,路徑,條件等等中的缺點(diǎn)或者錯(cuò)誤,進(jìn)而加以修正。
黑盒測試:也稱功能測試,數(shù)據(jù)驅(qū)動(dòng)測試或基于規(guī)格說明的測試,是通過使用整個(gè)軟件或某種軟件功能來嚴(yán)格地測試, 而并沒有通過檢查程序的源代碼或者很清楚地了解該軟件的源代碼程序具體是怎樣設(shè)計(jì)的。測試人員通過輸入他們的數(shù)據(jù)然后看輸出的結(jié)果從而了解軟件怎樣工作。將軟件看作黑盒子,在完全不考慮程序的內(nèi)部結(jié)構(gòu)和特性的情況下,測試軟件的外部特性。根據(jù)軟件的需求規(guī)格說明書設(shè)計(jì)測試用例,從程序的輸入和輸出特性上測試是否滿足設(shè)定的功能。
這篇論文主要講述了一個(gè)網(wǎng)絡(luò)考試系統(tǒng),在實(shí)現(xiàn)網(wǎng)絡(luò)考試系統(tǒng)的時(shí)候,我重點(diǎn)完成了以下幾點(diǎn)內(nèi)容:(1)認(rèn)識(shí)國內(nèi)外網(wǎng)絡(luò)考試系統(tǒng)的發(fā)展情況,深入思考該系統(tǒng)的工作流程;(2)按照該考試系統(tǒng)的工作流程設(shè)計(jì)該系統(tǒng)的總體結(jié)構(gòu),繪制結(jié)構(gòu)圖;(3)設(shè)計(jì)系統(tǒng)的功能模塊,如:后臺(tái)系統(tǒng)維護(hù)模塊,其中包含試題的錄入、整理、刪除等功能;前臺(tái)考試模塊,其中包括考試題的抽取、考試時(shí)間的倒計(jì)時(shí)等一些功能;教師組題模塊,包括考試題的生成、題目形式的選擇、每道題分值的設(shè)置等功能;設(shè)計(jì)并完成老師在考試前把題目整理出來功能模塊,包括考題類型、數(shù)量、每個(gè)題分?jǐn)?shù)的設(shè)置等;(4)熟練地運(yùn)用和掌握J(rèn)avaWeb技術(shù)和MySql數(shù)據(jù)庫編程,進(jìn)行考試系統(tǒng)的程序代碼編寫、調(diào)試運(yùn)行以及功能測試;(5)了解服務(wù)器的部署問題,數(shù)據(jù)庫的存儲(chǔ)問題,以及數(shù)據(jù)庫與程序的交互問題。本文總結(jié)了當(dāng)前網(wǎng)絡(luò)考試系統(tǒng)的應(yīng)用領(lǐng)域和發(fā)展趨勢,分析了現(xiàn)今一些考試系統(tǒng)存在的問題,結(jié)合我們所使用的考試系統(tǒng)和使用環(huán)境,提出了本文設(shè)計(jì)網(wǎng)絡(luò)考試系統(tǒng)的必要性。同時(shí),根據(jù)系統(tǒng)需求與可行性分析完成了系統(tǒng)架構(gòu)的方案設(shè)計(jì)和管理員、學(xué)生用戶的功能分析以及各個(gè)功能的詳細(xì)實(shí)現(xiàn)。課題在具體內(nèi)容上首先詳細(xì)介紹了系統(tǒng)所使用的關(guān)鍵技術(shù),并對這些技術(shù)的相關(guān)知識(shí)進(jìn)行了詳細(xì)的介紹,緊接著對我的這個(gè)系統(tǒng)的結(jié)構(gòu)和還有模塊進(jìn)行了一些詳細(xì)的解釋,最后對這個(gè)系統(tǒng)的實(shí)現(xiàn)進(jìn)行分析和演示。
至此,本文所設(shè)計(jì)的網(wǎng)絡(luò)考試系統(tǒng)基本完成,但是本文所提出的僅僅是一個(gè)的畢業(yè)設(shè)計(jì),它所涉及的內(nèi)容和形式都非常有限,在許多功能的實(shí)現(xiàn)和完成方式上存在著諸多的不足,這將在今后的學(xué)習(xí)中得到改進(jìn)。
致謝
在這緊張而又對社會(huì)帶著新奇的大四下半學(xué)年,每天基本都與畢業(yè)設(shè)計(jì)和論文度過,我的每一天的進(jìn)步都跟我的畢設(shè)負(fù)責(zé)老師的耐心指導(dǎo)有著很大的關(guān)系,我的一點(diǎn)一點(diǎn)的進(jìn)步凝集著老師的責(zé)任心以及對學(xué)術(shù)研究的執(zhí)著。
在這里我想感謝幫助過我的所有老師,正是有了他們的耐心教導(dǎo)和積極的負(fù)責(zé)的工作態(tài)度,我的論文才能夠完成的稍微順利的完成。從我的論文選擇題目開始到大概完成論文的定稿都集聚著指導(dǎo)老師大量的智慧和心血。老師在修改我論文的過程中非常嚴(yán)謹(jǐn)、對待我論文中的問題讓我一句一句的修改、老師的學(xué)術(shù)功底也深深的影響著我,對我今后的學(xué)習(xí)有很大的幫助。在此向老師至以最衷心的感謝。
從大學(xué)剛來那一天,到現(xiàn)在馬上離開大學(xué)的校園,感觸頗深,有很多美好的記憶,也有很多的遺憾,畢業(yè)論文是最后的一段記憶,這四年中正是因?yàn)槊课粚I(yè)課老師的指導(dǎo)幫助,我現(xiàn)在的畢業(yè)論文才能完成的游刃有余,感謝每一位我遇到的老師。
最后還要對我的同學(xué)和朋友們說一聲謝謝,感謝他們在我對論文有問題時(shí)及時(shí)伸出的援助之手,給我講解一些程序的代碼,解決了一些比較重要的問題。在這里我要對那些幫助我的人說一聲謝謝。
[1] 李英杰. 基于JAVA技術(shù)的網(wǎng)絡(luò)考試管理系統(tǒng)的研究與開發(fā)[D]. 杭州: 同濟(jì)大學(xué),2007, (23):頁碼.
[2] 王添財(cái). 基于Java EE的在線考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 廣東:華南理工大學(xué),2014.
[3] 劉毅. 人工智能在自動(dòng)組卷建模中應(yīng)用研究[J]. 計(jì)算機(jī)仿真,2011.
[4] 郭琳. Java Web中錯(cuò)誤異常的處理方法分析[J]. 電子技術(shù)與軟件工程,2015.
[5] 關(guān)海偉. Java Web的云存儲(chǔ)技術(shù)研究[D]. 杭州:杭州電子科技大學(xué),2014,(23):頁碼.
[6] Renuka Kumar. Detection of Obfuscation in Java Malware[J]. 愛思唯爾期刊,2016.
[7] 鄭保平,郭榮寧. 數(shù)據(jù)庫技術(shù)研究綜述[J]. 軍事通信系統(tǒng),2003,(18): 頁碼.
[8] Ronald P .Anjard. The Basics of Database Management Systems[J]. Emerald期刊,1994.
[9] Sepideh Naghdi. Preventing database schema extraction by error message handing[J]. 愛思唯爾期刊, 2015.
[10] 朱少民. 軟件測試方法和技術(shù)[D]. 杭州:清華大學(xué)出版社,2010.
[11] 柳純錄. 軟件評測師教程[J]. 杭州:清華大學(xué)出版社,2005.
[12] 舒華峰. 自動(dòng)組卷系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 吉林:吉林大學(xué),2014,(15):頁碼.
附錄:
外文翻譯
The Real-Time Specification for Java
New languages, programming disciplines, operating systems, and software engineering techniques sometimes hold considerable potential for real-time software developers. A promising area of interest—but one fairly new to the real-time community—is object-oriented programming.
Java, for example, draws heavily from object orientation and is highly suitable for extension to real-time and embedded systems. Recognizing this fit between Java and real-time software development, the Real-Time for Java Experts Group (RTJEG) began developing the real-time specification for Java (RTSJ)1 in March 1999 under the Java Community Process.
The goal of the RTJEG, of which we are both members, was to provide a platform—a Java execution environment and application program interface (API)—that lets programmers correctly reason about the temporal behavior of executing software. Programmers who write real-time systems applications must be able to determine a priori when certain logic will execute and that it will complete its execution before some deadline. This predictability is important in many real-time system applications, such as aircraft control systems, military command and control systems, industrial automation systems, transportation, and telephone switches. We began our effort by looking at the Java language specification3 and the Java virtual machine specification.4 For each feature of the language or runtime code, we asked if the stated semantics would let a programmer determine with reasonable effort and before execution the temporal behavior of the feature (or of the things the feature controls) during execution. We idenThe RTSJ provides a platform that will let programmers correctly reason about the temporal behavior of executing software. Two members of the Real-Time for Java Experts Group explain the RTSJ’s features and the thinking behind the specification’s design. Greg Bollella IBM James Gosling Sun Microsystems tified three features—scheduling, memory management, and synchronization—that did not allow such determination. Requirements defined in a workshop sponsored by the National Institute of Science and Technology (NIST) combined with input from other industry organizations helped us identify additional features and semantics. We decided to include four of these additional features: asynchronous event handling, asynchronous control transfer, asynchronous thread termination, and access to physical memory.
These plus the three features from our review of the Java and JVM specifications gave us seven main areas for the RTSJ. We believe these seven areas provide a real-time software development platform suitable for a wide range of applications. The “How Well Does the RTSJ Meet Its Goals?” sidebar gives more background on the requirements and principles that drove RTSJ development. The “RTSJ Timetable” sidebar lists important milestones and contacts for those interested in reviewing the draft specification. The RTSJ completed public review in February 2000, but the Java Community Process mandates that we not finalize the specification until we complete the reference implementation and test suites. As the community gains experience with the RTSJ, small changes to the specification may occur. Our goal in writing this article is to provide insights into RTSJ’s design rationale—particularly how the NIST requirements and other goals affected it—and to show how this important specification fits into the overall strategic direction for defining an object-oriented programming system optimized for real-time systems development.
SCHEDULING The Java specification provides only broad guidance for scheduling: When there is competition for processing resources, threads with higher priority are generally executed in preference to threads with lower priority. Such preference is not, however, a guarantee that the highest priority thread will always be running, and thread priorities cannot be used to reliably implement mutual exclusion. Obviously, if you are writing software with temporal constraints, you need a stronger semantic statement about the order in which threads should execute. The typical way to define these semantics is through algorithms that determine how to choose the next thread for execution. The RTSJ specifies a minimum scheduling algorithm, which must be in all RTSJ implementations. Minimum requirements At the very least, all implementations must provide a fixed-priority preemptive dispatcher with no fewer than 28 unique priorities. “Fixed-priority” means that the system does not change thread priority (for example, by aging). There is one exception: The system can change thread priorities as part of executing the priority inversion avoidance algorithm (which preserves priority inheritance). Without exception, threads can change their own or another thread’s priorities.
The application program must see the minimum 28 priorities as unique; for example, it must know that a thread with a lower priority will never execute if a thread with a higher priority is ready. Thus, you cannot simplistically map 28 priorities into, say, a smaller number because of the underlying system. You can, however, implement the RTSJ on a platform that provides fewer than 28 native priorities. It would then be up to you to use whatever means available to provide the appearance of uniqueness. Why 28 priorities? We chose this number because real-time scheduling theory indicates that you can expect close to optimal schedulability with 32 priorities.5 We chose to leave four priorities for other tasks because the RTSJ will likely be only a part of the system, and some systems have only 32 native priorities. You can, of course, add scheduling algorithms to this minimum requirement. The RTSJ provides three classes—Scheduler, SchedulingParameters, and ReleaseParameters—and subclasses of these that encapsulate temporal requirements. These classes are bound to schedulable objects (threads or event handlers). The required scheduler, an instance of the class PriorityScheduler, uses the values set in these parameter objects.
Thread creation The RTSJ defines the RealtimeThread (RT) class to create threads, which the resident scheduler executes. RTs can access objects on the heap and therefore can incur delays because of garbage collection. Another option in creating threads is to use a subclass of RT, NoHeapRealtimeThread. NHRTs cannot access any objects on the heap, which means that they can run while the garbage collector is running (and thus avoid delays from garbage collection). NHRTs are suitable for code with a very low tolerance of nonscheduled delays. RTs, on the other hand, are more suitable for code with a higher tolerance for longer delays. Regular Java threads will do for code with no temporal constraints. MEMORY MANAGEMENT Garbage-collected memory heaps have always been considered an obstacle to real-time programming because the garbage collector introduces unpredictable latencies. We wanted the RTSJ to require the use of a real-time garbage collector, but the technology is not sufficiently advanced. Instead, the RTSJ extends the memory model to support memory management in a way that does not interfere with the real-time code’s ability to provide deterministic behavior. These extensions let you allocate both short- and long-lived objects outside the garbage-collected heap. There is also sufficient flexibility to use familiar solutions, such as preallocated object pools. Memory areas The RTSJ introduces the notion of a memory area— a region of memory outside the garbage-collected heap that you can use to allocate objects. Memory areas are not garbage-collected in the usual sense. Strict rules on assignments to or from memory areas keep you from creating dangling pointers, and thus maintain Java’s pointer safety. Objects allocated in memory areas may contain references to objects in the heap. Thus, the garbage collector must be able to scan memory outside the heap for references to objects within the heap to preserve the garbage-collected heap’s integrity. This scanning is not the same as building a reachability graph for the heap.
The collector merely adds any reference to heap objects to its set of pointers. Because NHRTs can preempt the collector, they cannot access or modify any pointer into the heap. The RTSJ uses the abstract class MemoryArea to represent memory areas. This class has three subclasses: physical memory, immortal memory, and scoped memory. Physical memory lets you create objects within memory areas that have particular important characteristics, such as memory attached to a nonvolatile RAM. Immortal memory is a special case. Figure 1 shows how object allocation using immortal memory compares to manual allocation and automatic allocation using a Java heap. Traditional programming languages use manual allocation in which the application logic determines the object’s life—a process that tends to be time-consuming and error-prone. The one immortal memory pool and all objects allocated from it live until the program terminates. Immortal object allocation is common practice in today’s hard real-time systems. With scoped memory, there is no need for traditional garbage collection and the concomitant delays. The RTSJ implements scoped memory through either the MemoryParameters field or the ScopedMemory.enter() method. Scoped memory Figure 1c shows how scoped memory compares to immortal memory and other allocation disciplines. Scoped memory, implemented in the abstract class ScopedMemory, lets you allocate and manage objects using a memory area, or syntactic scope, which bounds the lifetime of any objects allocated within it. When the system enters a syntactic scope, every use of “new” causes the system to allocate memory from the active memory area. When a scope terminates or the system leaves it, the system normally drops the memory’s reference count to zero, destroys any objects allocated within, and calls their finalizers. You can also nest scopes. When the system enters a nested scope, it takes all subsequent allocations from the memory associated with the new scope. When it exits the nested scope, the system restores the previous scope and again takes all subsequent allocations from that scope. Two concrete subclasses are available for instantiation as MemoryAreas: LTMemory (LT for linear time) and VTMemory (VT for variable time). In this context, “time” refers to the cost to allocate a new object. LTMemory requires that allocations have a time cost linear to object size (ignoring performance variations from hardware caches or similar optimizations).
You specify the size of an LTMemory area when you create it, and the size remains fixed. Although VTMemory has no such time restrictions, you may want to impose some restrictions anyway to minimize the variability in allocation cost. You build a VTMemory area with an initial size and specify a maximum size to which it can grow. You can also opt to perform real-time garbage collection in a VTMemory area, although the RTSJ does not require that. If you decide to do this, you can build the VTMemory object with a garbage collection object to specify an implementation-specific garbage-collection mechanism. However, if you implement VTMemory, NHRTs must be able to use it. Because, as Figure 1c shows, control flow governs the life of objects allocated in scoped memory areas, you must limit references to those objects. The RTSJ uses a restricted set of assignment rules that keep longer-lived objects from referencing objects in scoped memory, which are possibly shorter lived. The virtual machine must detect illegal assignment attempts and throw an appropriate exception when they occur. The RTSJ implements scoped memory in two separate mechanisms, which interact consistently: the ScopedMemory.enter() method and the memory area field of MemoryParameters. You specify either one when you create the threads. Thus, several related threads can share a memory area, and the area will remain active until the last thread has exited. This flexibility means that the application can allocate new objects from a memory area that has characteristics appropriate either to the entire application or to particular code regions. SYNCHRONIZATION In synchronization, the RTSJ uses “priority” somewhat more loosely than the conventional real-time literature. “Highest priority thread” merely indicates the most eligible thread—the thread that the scheduler would choose from among all the threads ready to run. It does not necessarily presume a strict priority-based dispatch mechanism. Wait queues The system must queue all threads waiting to acquire a resource in priority order.
These resources include the processor as well as synchronized blocks. If the active scheduling policy permits threads with the same priority, the threads are queued first-in, firstout. Specifically, the system Figure 1. How immortal and scoped memory differ from other methods of determining an object’s life. (a) The Java heap uses automatic allocation, in which the visibility determines the object’s life (if there are no references to the object, the system can deallocate it). Automatic allocation requires a garbage collector, however, which incurs delays. (b) In allocation using the RTSJ immortal memory, the object’s life ends only when the Java virtual machine (JVM) terminates. (c) RTSJ scoped memory uses syntactic scope, a special type of memory area outside the garbage-collected heap that lets you manage objects with well-defined lifetimes. When control reaches a certain point in the logic, the system destroys any objects within it and calls their finalizers.
Avoiding priority inversion The synchronized primitive’s implementation must have a default behavior that ensures there is no unbounded priority inversion. This applies to conventional Java code if it runs within the overall RTSJ implementation as well as to real-time threads. The priority inheritance protocol—a well-known real-time scheduling algorithm6—must be implemented by default. The specification also provides a mechanism by which you can override the default systemwide policy or control the policy to be used for a particular monitor, as long as the implementation supports that policy. The specification of monitor control policy is extensible, so future implementations can add mechanisms. A second policy, priority ceiling emulation (or highest locker), is also specified for systems that support it.6 Determinism Conforming implementations must provide a fixed upper bound on the time required for the application code to enter a synchronized block for an unlocked monitor. Sharing and communication among threads Implementers are most likely to use a combination of regular Java threads, RTs, and NHRTs. The RTSJ permits locking between different thread types—even in the most contentious case, which is between regular threads and NHRTs.
If an NHRT attempts to lock an object that either an RT or regular thread has already locked, priority inheritance happens as normal. There is one catch: The non-NHRT that has had its priority boosted cannot execute when the garbage collector is executing. Thus, if a garbage collection is in progress, the boosted thread is suspended until collection completes. This, of course, causes the NHRT to incur a delay because of the collection. To address this, the RTSJ provides mechanisms that allow NHRTs to communicate (a form of synchronization) with RTs and regular Java threads while avoiding garbage-collector-induced delays in the NHRTs. The RTSJ provides queue classes for communication between NHRTs and regular Java threads. Figure 2 shows a wait-free write queue, which is unidirectional from real-time to non-real-time. NHRTs typically use the write (real-time) operation; regular threads typically use the read operation. The write side is nonblocking (any attempt to write to a full queue immediately returns a “false”) and unsynchronized (if multiple NHRTs are allowed to write, they must synchronize themselves), so the NHRT will not incur delays from garbage collection. The read operation, on the other hand, is blocking (it will wait until there is data in the queue) and synchronized ( it allows multiple readers). When an NHRT sends data to a regular Java thread, it uses the wait-free enqueue operation, and the regular thread uses a synchronized dequeue operation. A read queue, which is unidirectional from nonreal-time to real-time, works in the converse manner. Because the write is wait-free, the arrival dynamics are incompatible and data can be lost within it. To avoid delays in allocating memory elements, class constructors statically allocate all memory used for queue elements, giving the queue a finite limit. If the regular thread is not removing elements from the queue at a high-enough rate, the queue may become full.
Java的實(shí)時(shí)規(guī)范
新語言、編程規(guī)程、操作系統(tǒng)和軟件工程技術(shù)有時(shí)對實(shí)時(shí)軟件開發(fā)人員具有相當(dāng)大的潛力。面向?qū)ο缶幊淌且粋€(gè)有希望的領(lǐng)域,但對實(shí)時(shí)社區(qū)來說,這是一個(gè)相當(dāng)新的領(lǐng)域。
例如,Java大量地從面向?qū)ο笾刑崛。⑶曳浅_m合于對實(shí)時(shí)和嵌入式系統(tǒng)的擴(kuò)展,在Java社區(qū)過程中,Java專家小組(RTJEG)在1999年3月開始開發(fā)Java(RTSJ)1的實(shí)時(shí)規(guī)范。
RTJEG的目標(biāo)是提供一個(gè)平臺(tái)——Java執(zhí)行環(huán)境和應(yīng)用程序接口(API)——讓程序員正確地推斷出執(zhí)行軟件的時(shí)間行為。編寫實(shí)時(shí)系統(tǒng)應(yīng)用程序的程序員必須能夠在某些邏輯執(zhí)行的時(shí)候確定一個(gè)先驗(yàn),并在某個(gè)期限之前完成它的執(zhí)行。這種可預(yù)測性在許多實(shí)時(shí)系統(tǒng)應(yīng)用中很重要,例如飛機(jī)控制系統(tǒng)、軍事指揮和控制系統(tǒng)、工業(yè)自動(dòng)化系統(tǒng)、交通和電話交換機(jī)。我們通過查看Java語言特異性和Java虛擬機(jī)規(guī)范來開始我們的工作。對于語言或運(yùn)行時(shí)代碼的每個(gè)特性,我們詢問聲明的語義是否會(huì)讓程序員在執(zhí)行過程中,在執(zhí)行之前,讓程序員以合理的努力來決定,然后執(zhí)行該特性(或特性控制的特性)的時(shí)間行為。RTSJ提供了一個(gè)平臺(tái),讓程序員能夠正確地推斷出執(zhí)行軟件的時(shí)間行為。Java專家小組的兩個(gè)實(shí)時(shí)成員解釋了RTSJ的特性以及規(guī)范設(shè)計(jì)背后的思想。Greg Bollella IBM的James Gosling Sun Microsystems公司整頓了三個(gè)特性——調(diào)度、內(nèi)存管理和同步——這并不允許這樣的決定。由國家科學(xué)技術(shù)研究院(NIST)主辦的研討會(huì)上定義的需求與其他行業(yè)組織的投入幫助我們確定了附加的特征和語義。我們決定將其中的四個(gè)附加特性包括:異步事件處理、異步控制傳輸、異步線程終止以及對物理內(nèi)存的訪問。
這些加上我們對Java和JVM規(guī)范的回顧,為RTSJ提供了七個(gè)主要區(qū)域。我們相信這七個(gè)領(lǐng)域提供了一個(gè)適合廣泛應(yīng)用的實(shí)時(shí)軟件開發(fā)平臺(tái)。“RTSJ如何達(dá)到它的目標(biāo)?”邊欄給出了驅(qū)動(dòng)RTSJ開發(fā)的需求和原則的更多背景。“RTSJ時(shí)間表”邊欄列出了那些有興趣審查草案的人的重要里程碑和聯(lián)系。RTSJ在2000年2月完成了公共審查,但是Java社區(qū)過程要求我們在完成參考實(shí)現(xiàn)和測試套件之前不確定規(guī)范。隨著社區(qū)獲得RTSJ的經(jīng)驗(yàn),對規(guī)范的微小更改可能會(huì)發(fā)生。我們寫這篇文章的目的是為了深入了解RTSJ的設(shè)計(jì)理念——特別是NIST的需求和其他的目標(biāo)是如何影響它的——并說明這個(gè)重要的規(guī)范是如何適應(yīng)于為實(shí)時(shí)系統(tǒng)開發(fā)優(yōu)化面向?qū)ο缶幊滔到y(tǒng)的總體戰(zhàn)略方向的。
調(diào)度Java規(guī)范只提供了對調(diào)度的廣泛指導(dǎo):在處理資源的競爭中,優(yōu)先級較高的線程通常優(yōu)先于低優(yōu)先級的線程。但是,這樣的首選項(xiàng)并不能保證優(yōu)先級最高的線程始終運(yùn)行,并且線程優(yōu)先級不能用于可靠地實(shí)現(xiàn)互斥。顯然,如果您正在編寫具有時(shí)間限制的軟件,那么您需要對線程執(zhí)行的順序有更強(qiáng)的語義聲明。定義這些語義的典型方法是通過確定如何選擇下一個(gè)線程執(zhí)行的算法。RTSJ指定了一個(gè)最小的調(diào)度算法,它必須在所有RTSJ實(shí)現(xiàn)中。至少,所有實(shí)現(xiàn)的最低要求必須提供一個(gè)固定優(yōu)先的優(yōu)先級調(diào)度程序,不少于28個(gè)獨(dú)特的優(yōu)先級?!肮潭▋?yōu)先級”意味著系統(tǒng)不改變線程優(yōu)先級(例如,通過老化)。有一個(gè)例外:系統(tǒng)可以將線程優(yōu)先級更改為執(zhí)行優(yōu)先級反轉(zhuǎn)規(guī)避算法的一部分(保留優(yōu)先級繼承)。如果沒有異常,線程可以更改自己或另一個(gè)線程的優(yōu)先級。
調(diào)度Java規(guī)范只提供了對調(diào)度的廣泛指導(dǎo):當(dāng)有處理資源的競爭時(shí),具有更高優(yōu)先級的線程通常會(huì)優(yōu)先選擇較低優(yōu)先級的線程。然而,這樣的優(yōu)先級并不能保證最高優(yōu)先級的線程總是在運(yùn)行,而線程優(yōu)先級不能用于可靠地實(shí)現(xiàn)互斥。顯然,如果您正在編寫帶有時(shí)間約束的軟件,那么您需要一個(gè)更強(qiáng)的語義語句來說明線程應(yīng)該執(zhí)行的順序。定義這些語義的典型方法是通過算法來決定如何選擇下一個(gè)線程來執(zhí)行。RTSJ指定最小調(diào)度算法,必須在所有RTSJ的實(shí)現(xiàn)。至少,所有的實(shí)現(xiàn)都必須提供一個(gè)固定優(yōu)先級的優(yōu)先級調(diào)度程序,它不少于28個(gè)唯一的優(yōu)先級?!皫讉€(gè)”意味著不改變系統(tǒng)線程優(yōu)先級(例如,通過老化)。有一個(gè)例外:系統(tǒng)可以改變線程優(yōu)先級的執(zhí)行優(yōu)先級反轉(zhuǎn)避免算法(保留優(yōu)先級繼承)。毫無例外,線程可以更改它們自己或其他線程的優(yōu)先級。
應(yīng)用程序必須將最小28個(gè)優(yōu)先級視為惟一;例如,它必須知道,如果具有更高優(yōu)先級的線程已經(jīng)準(zhǔn)備好,那么具有較低優(yōu)先級的線程將永遠(yuǎn)不會(huì)執(zhí)行。因此,您不能簡單地將28個(gè)優(yōu)先級映射為一個(gè)較小的數(shù)字,因?yàn)榈讓酉到y(tǒng)。但是,您可以在一個(gè)平臺(tái)上實(shí)現(xiàn)RTSJ提供少于28本地優(yōu)先級。然后,您就可以使用任何可用的方法來提供惟一性的外觀。為什么要有28個(gè)優(yōu)先事項(xiàng)?我們之所以選擇這個(gè)數(shù)字,是因?yàn)閷?shí)時(shí)調(diào)度理論表明,您可以期望有32個(gè)優(yōu)先級的接近最優(yōu)的調(diào)度能力。5我們選擇離開四個(gè)優(yōu)先級為其他任務(wù),因?yàn)镽TSJ可能只有一個(gè)系統(tǒng)的一部分,和一些系統(tǒng)只有32本地優(yōu)先級。當(dāng)然,您可以將調(diào)度算法添加到這個(gè)最低要求中。RTSJ提供了三個(gè)classes-Scheduler SchedulingParameters,ReleaseParameters-and這些封裝時(shí)間需求的子類。這些類綁定到可調(diào)度的對象(線程或事件處理程序)。所需的調(diào)度器,PriorityScheduler類的一個(gè)實(shí)例,使用這些參數(shù)中設(shè)定的值對象。
RTSJ線程創(chuàng)建定義RealtimeThread(RT)類來創(chuàng)建線程,居民調(diào)度程序執(zhí)行。RTs可以訪問堆上的對象,因此會(huì)因?yàn)槔占鴮?dǎo)致延遲。創(chuàng)建線程的另一種選擇是使用RT的子類,NoHeapRealtimeThread。nhrt不能訪問任何堆上的對象,這意味著它們可以運(yùn)行垃圾收集器運(yùn)行時(shí)從垃圾收集(從而避免延誤)。nhrt是適合代碼非常低公差的不定期的延遲。另一方面,RTs更適合于對較長時(shí)間延遲的更寬容的代碼。普通Java線程將為沒有時(shí)間限制的代碼進(jìn)行處理。內(nèi)存管理一直被認(rèn)為是垃圾收集內(nèi)存堆實(shí)時(shí)編程的一個(gè)障礙,因?yàn)槔占?引入了不可預(yù)測的延遲。我們希望RTSJ需要實(shí)時(shí)垃圾收集器的使用,但技術(shù)不夠先進(jìn)。相反,RTSJ擴(kuò)展內(nèi)存模型來支持內(nèi)存管理,不干擾實(shí)時(shí)代碼提供確定性行為的能力。這些擴(kuò)展讓你分配兩堆外的短期和長期存活的對象進(jìn)行垃圾回收。也有足夠的靈活性來使用熟悉的解決方案,例如預(yù)先分配的對象池。內(nèi)存區(qū)域RTSJ介紹內(nèi)存區(qū)域的概念——一個(gè)地區(qū)以外的內(nèi)存垃圾回收堆分配對象,您可以使用。內(nèi)存區(qū)域并不是通常意義上的垃圾收集。嚴(yán)格的對內(nèi)存區(qū)域的賦值規(guī)則可以防止您創(chuàng)建懸空指針,從而維護(hù)Java的指針安全性。在內(nèi)存區(qū)域中分配的對象可能包含對堆中的對象的引用。因此,垃圾收集器必須能夠掃描內(nèi)存堆中對象的引用的堆外保留堆垃圾收集的完整性。這種掃描與為堆構(gòu)建可達(dá)性圖不一樣。
收集器只是將堆對象的任何引用添加到它的指針集。因?yàn)閚hrt可以搶占收藏家,他們不能訪問或修改任何指針到堆。RTSJ使用抽象類MemoryArea代表內(nèi)存區(qū)域。這個(gè)類有三個(gè)子類:物理內(nèi)存、不朽內(nèi)存和作用域內(nèi)存。物理內(nèi)存允許您在具有特定重要特征的內(nèi)存區(qū)域內(nèi)創(chuàng)建對象,例如附加在非易失性RAM中的內(nèi)存。不朽的記憶是一個(gè)特例。圖1顯示了使用不朽內(nèi)存的對象分配如何與使用Java堆的手動(dòng)分配和自動(dòng)分配進(jìn)行比較。傳統(tǒng)的編程語言使用手動(dòng)配置的應(yīng)用程序邏輯決定了對象的導(dǎo)向的過程往往是耗時(shí)且容易出錯(cuò)。一個(gè)不朽的內(nèi)存池和從它分配的所有對象都將一直存在,直到程序終止。在當(dāng)今的硬實(shí)時(shí)系統(tǒng)中,不朽的對象分配是常見的做法。有了作用域內(nèi)存,就不需要傳統(tǒng)的垃圾收集和隨之而來的延遲。RTSJ實(shí)現(xiàn)通過MemoryParameters字段或作用域內(nèi)存ScopedMemory.enter()方法。作用域內(nèi)存圖1c顯示了作用域內(nèi)存與不朽內(nèi)存和其他分配規(guī)程的比較。作用域內(nèi)存,在抽象類中實(shí)現(xiàn)ScopedMemory,允許您使用內(nèi)存區(qū)域分配和管理對象,或語法范圍,范圍內(nèi)分配的任何對象的生命周期。當(dāng)系統(tǒng)進(jìn)入一個(gè)語法范圍時(shí),每次使用“new”都會(huì)導(dǎo)致系統(tǒng)從活動(dòng)內(nèi)存區(qū)域分配內(nèi)存。當(dāng)范圍終止或系統(tǒng)離開時(shí),系統(tǒng)通常會(huì)將內(nèi)存的引用計(jì)數(shù)降為0,破壞分配給內(nèi)部的任何對象,并調(diào)用它們的終結(jié)器。您也可以嵌套作用域。當(dāng)系統(tǒng)進(jìn)入一個(gè)嵌套的范圍時(shí),它將從與新作用域相關(guān)聯(lián)的內(nèi)存中獲取所有后續(xù)的分配。當(dāng)它退出嵌套范圍時(shí),系統(tǒng)將恢復(fù)先前的作用域,并再次從該范圍獲取所有后續(xù)的分配。兩個(gè)具體子類可用于實(shí)例化MemoryAreas:LTMemory(LT的線性時(shí)間)和VTMemory變量時(shí)間(VT)。在這種情況下,“time”指的是分配新對象的成本。LTMemory要求分配有一個(gè)時(shí)間成本的線性對象大小(忽略性能變化從硬件緩存或類似的優(yōu)化)。
當(dāng)您創(chuàng)建它時(shí),您指定了LTMemory區(qū)域的大小,并且它的大小仍然是固定的。雖然VTMemory沒有這樣的時(shí)間限制,您可能想要強(qiáng)加一些限制無論如何變化分配成本降到最低。你建立VTMemory區(qū)域初始大小和指定一個(gè)最大尺寸它可以生長。你也可以選擇執(zhí)行實(shí)時(shí)垃圾收集在VTMemory地區(qū),盡管RTSJ不要求。如果你決定這樣做,您可以構(gòu)建VTMemory對象的垃圾收集對象指定一個(gè)特定于實(shí)現(xiàn)的垃圾收集機(jī)制。然而,如果你實(shí)現(xiàn)VTMemory,nhrt必須能夠使用它。因?yàn)椋鐖D1c所示,控制流控制在作用域內(nèi)存區(qū)域中分配的對象的生命,您必須限制對這些對象的引用。RTSJ使用受限制的組分配規(guī)則,防止長期對象引用對象作用域內(nèi)存,可能短住。虛擬機(jī)必須檢測非法的分配嘗試,并在發(fā)生時(shí)拋出一個(gè)適當(dāng)?shù)漠惓?。RTSJ實(shí)現(xiàn)在兩個(gè)不同的作用域內(nèi)存機(jī)制,持續(xù)互動(dòng):ScopedMemory.enter()方法和內(nèi)存區(qū)域的MemoryParameters領(lǐng)域。您在創(chuàng)建線程時(shí)指定任何一個(gè)。因此,幾個(gè)相關(guān)的線程可以共享一個(gè)內(nèi)存區(qū)域,并且該區(qū)域?qū)⒈3只顒?dòng)狀態(tài),直到最后一個(gè)線程退出。這種靈活性意味著應(yīng)用程序可以從具有適合整個(gè)應(yīng)用程序或特定代碼區(qū)域的特征的內(nèi)存區(qū)域中分配新對象。同步的同步,RTSJ使用“優(yōu)先級”比傳統(tǒng)的更松散實(shí)時(shí)文學(xué)?!白罡邇?yōu)先級的線程”只是表示最合格的線程調(diào)度程序會(huì)選擇從所有的線程可以運(yùn)行。它不一定認(rèn)為嚴(yán)格的基于優(yōu)先級的調(diào)度機(jī)制。等待隊(duì)列系統(tǒng)必須排隊(duì)等待以優(yōu)先順序獲取資源的所有線程。
這些資源包括處理器和同步塊。如果活動(dòng)調(diào)度策略允許具有相同優(yōu)先級的線程,那么線程將首先在隊(duì)列中排隊(duì)。具體來說,系統(tǒng)圖1。不朽和作用域內(nèi)存與其他確定對象生命的方法是不同的。(一)Java堆使用自動(dòng)分配,可見性決定了對象的生活(如果沒有對象的引用,該系統(tǒng)可以釋放)。然而,自動(dòng)分配需要一個(gè)垃圾收集器,這會(huì)導(dǎo)致延遲。(b)在使用RTSJ不朽內(nèi)存分配,對象的生命結(jié)束只有當(dāng)Java虛擬機(jī)(JVM)終止。(c)RTSJ作用域內(nèi)存的使用語法范圍,一種特殊類型的內(nèi)存區(qū)域外的垃圾收集堆允許您管理對象定義良好的一生。當(dāng)控制到達(dá)邏輯的某個(gè)點(diǎn)時(shí),系統(tǒng)會(huì)破壞其中的任何對象,并調(diào)用它們的終結(jié)器。
為了避免優(yōu)先級反轉(zhuǎn),同步原語的實(shí)現(xiàn)必須有一個(gè)默認(rèn)的行為,以確保沒有無限的優(yōu)先級反轉(zhuǎn)。這適用于普通Java代碼如果它運(yùn)行在整個(gè)RTSJ實(shí)現(xiàn)以及實(shí)時(shí)線程。優(yōu)先級繼承protocol-a知名實(shí)時(shí)調(diào)度algorithm6-must默認(rèn)實(shí)現(xiàn)。該規(guī)范還提供了一種機(jī)制,您可以覆蓋默認(rèn)的系統(tǒng)范圍策略,或控制用于特定監(jiān)視器的策略,只要實(shí)現(xiàn)支持該策略。monitor控制策略的規(guī)范是可擴(kuò)展的,因此未來的實(shí)現(xiàn)可以添加機(jī)制。第二種策略,優(yōu)先級上限仿真(或最高存儲(chǔ)),也為支持它的系統(tǒng)指定。6決定論符合實(shí)現(xiàn)必須提供一個(gè)固定的上限為應(yīng)用程序代碼所需的時(shí)間進(jìn)入一個(gè)同步塊解鎖監(jiān)控。共享和線程間的通信實(shí)現(xiàn)人員最有可能使用普通Java線程的組合,RTs,nhrt。RTSJ允許鎖定不同線程之間types-even最有爭議的情況下,在常規(guī)線程和nhrt。
如果NHRT試圖鎖定一個(gè)RT或常規(guī)線程已經(jīng)鎖定的對象,那么優(yōu)先級繼承就會(huì)正常。有一個(gè)問題:non-NHRT有其優(yōu)先級提高不能執(zhí)行垃圾回收器執(zhí)行。因此,如果一個(gè)垃圾收集正在進(jìn)行中,那么這個(gè)被提升的線程將被掛起,直到收集完成。這當(dāng)然會(huì)導(dǎo)致NHRT因?yàn)槭占舆t。為了解決這個(gè)問題,RTSJ提供機(jī)制,允許nhrt通信(同步)的一種形式與RTs和普通Java線程,同時(shí)避免在nhrt garbage-collector-induced延遲。RTSJ提供隊(duì)列類nhrt和普通Java線程之間的通信。圖2顯示了一個(gè)無等待寫隊(duì)列,這是單向從實(shí)時(shí)、非實(shí)時(shí)。nhrt通常使用寫(實(shí)時(shí))操作;常規(guī)線程通常使用讀操作。寫端阻塞(任何試圖立即寫信給一個(gè)完整的隊(duì)列返回“false”)和同步(如果多個(gè)NHRT可以寫,他們必須同步),所以從垃圾收集NHRT不會(huì)造成延誤。讀操作,另一方面,阻塞(它會(huì)等待,直到有數(shù)據(jù)隊(duì)列)和同步(它允許多個(gè)讀者)。當(dāng)一個(gè)NHRT普通Java線程發(fā)送數(shù)據(jù),它使用無等待隊(duì)列操作,和常規(guī)的線程使用一個(gè)同步操作出列。一個(gè)讀隊(duì)列,它是單向的,從非實(shí)時(shí)到實(shí)時(shí)的,以相反的方式工作。因?yàn)閷憻o等待,動(dòng)力學(xué)是不相容的,數(shù)據(jù)可能會(huì)丟失。為了避免在分配內(nèi)存元素時(shí)出現(xiàn)延遲,類構(gòu)造函數(shù)靜態(tài)地分配用于隊(duì)列元素的所有內(nèi)存,從而使隊(duì)列具有有限的限制。如果常規(guī)線程沒有以足夠高的速率從隊(duì)列中刪除元素,那么隊(duì)列可能會(huì)滿。
關(guān)鍵詞:論文,實(shí)現(xiàn),考試,系統(tǒng),設(shè)計(jì),網(wǎng)絡(luò)