五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計與實現(xiàn)(論文+PPT+源碼)

2022-12-16 23:39 作者:ChatGPT云炬學(xué)長  | 我要投稿


網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計與實現(xiàn)

摘 要

科技在進(jìn)步,人們生活和工作的方式正發(fā)生著改變,不僅體現(xiàn)在人們的衣食住行,也體現(xiàn)在與時俱進(jìn)的考試形式上。以前的考試需要組織者投入大量的時間和精力,需要對考試的試題進(jìn)行篩選,對后期的考卷進(jìn)行批閱,這么多的步驟影響了整個考試執(zhí)行的效率。因此,本文提出了一種網(wǎng)絡(luò)考試系統(tǒng),用于解決上述的一些問題。

本文描述的網(wǎng)絡(luò)考試系統(tǒng)主要是利用瀏覽器作為界面,利用B/S模式,即用戶可利用瀏覽器直接訪問本站點。主要用到的技術(shù)是采用JavaWeb技術(shù)和MySql數(shù)據(jù)庫等設(shè)計出了各種功能。該系統(tǒng)主要有用戶管理、功能管理、角色權(quán)限管理、學(xué)生網(wǎng)絡(luò)考試、試題管理、錯題管理、自動組卷等功能。

本文提供了一些該系統(tǒng)的部分代碼跟截圖幫助介紹該系統(tǒng),對系統(tǒng)的總體設(shè)計、詳細(xì)設(shè)計以及測試都給出了一些介紹,還對運行截圖以及代碼作出了相應(yīng)的解釋。該網(wǎng)絡(luò)考試系統(tǒng)基本上可以滿足一些簡單的考試,運行良好,基本可以滿足設(shè)計要求。

關(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è)計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 錯題解析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è)計1313

第5章 系統(tǒng)詳細(xì)設(shè)計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 錯題解析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)計等過程,這幾個過程有著很強(qiáng)的先后次序,不能順序顛倒。這些過程中,又以出卷、閱卷和統(tǒng)計最為復(fù)雜,當(dāng)一次考試涉及的人數(shù)眾多時,老師需要批閱非常多的卷子,重復(fù)的批閱卷子浪費了大量的時間,此外,不僅效率底下,同時大量的閱卷工作也讓老師疲于應(yīng)付,最后導(dǎo)致閱卷的準(zhǔn)確率下降。即便閱卷完成之后,工作還沒結(jié)束,還需要對這些卷子進(jìn)行分?jǐn)?shù)登記、成績統(tǒng)計以及對各個題目進(jìn)行錯誤率統(tǒng)計,這些工作消耗時間非常多,因此效率也是非常低的。此外,從學(xué)生角度出發(fā),每次做卷都要準(zhǔn)備筆和草稿紙,麻煩且不符合環(huán)保的要求,從老師的角度出發(fā),如果能夠減少出卷、閱卷和統(tǒng)計的時間,那么可以騰出更多的時間用在其他的地方。因此本文基于JavaWeb技術(shù)希望開發(fā)一套網(wǎng)絡(luò)考試系統(tǒng)來解決出卷、閱卷、統(tǒng)計花費時間過多的問題,同時為學(xué)校教務(wù)信息化作出一份貢獻(xiàn)。

本文開發(fā)的網(wǎng)絡(luò)考試系統(tǒng)具有一定的現(xiàn)實意義,主要是解決教師在出卷、閱卷和統(tǒng)計上花費時間過多的問題。開發(fā)一個系統(tǒng)需要考慮很多方面的問題,比如說時效性和高效性這是兩個最最常見的因素,因為時效性關(guān)系到你的系統(tǒng)在投入使用時是不是真的能夠解決當(dāng)前所存在的這些問題,網(wǎng)絡(luò)考試系統(tǒng)在國內(nèi)雖然已經(jīng)初具規(guī)模,一些學(xué)校也在使用這種方式考試,但我覺得目前的考試系統(tǒng)還存在著一些未解決的問題,還需進(jìn)一步完善。同時高效性也是一個非常重要的因素,如果你的系統(tǒng)用了以后還不如不用那么你的系統(tǒng)必定是一個不成功的產(chǎn)品這也是我們開發(fā)需要考慮的一個重要問題。本系統(tǒng)目前只可以實現(xiàn)對一門科目的客觀題的考試,基本上還不是特別成熟的一個系統(tǒng),我還需要考慮如何進(jìn)行多科目的主客觀題型的考試是我以后研究的方向。因此是本系統(tǒng)的開發(fā)具有很重要的實際意義,能在當(dāng)前的發(fā)展?fàn)顟B(tài)下為學(xué)生和教師提供適當(dāng)?shù)膸椭耐瑫r也為今后此類軟件的發(fā)展提供一定的基礎(chǔ)。

1.2 研究開發(fā)現(xiàn)狀分析

國內(nèi)考試系統(tǒng)的信息化發(fā)展比較緩慢,在廣泛化應(yīng)用的過程中,開發(fā)者一方面不斷投資購建各種硬件、系統(tǒng)軟件和網(wǎng)絡(luò),另一方面也不斷開發(fā)實施了各類教學(xué)軟件、數(shù)據(jù)統(tǒng)計、信息記錄等應(yīng)用系統(tǒng),形成了一定規(guī)模的信息化建設(shè)體系??墒?,由于目前國內(nèi)的系統(tǒng)還不是很完善,比如一門考試就需要一個系統(tǒng)去支持,這樣成本太高,而且我國集體信息化水平有些落后,資金短缺等因素。我國的網(wǎng)絡(luò)考試系統(tǒng)還沒有很好地完全自如的融入到我們的學(xué)習(xí)生活中,比其他國家有一定的差距。國外的管理與國內(nèi)完全不同,不但在線考試化建設(shè)早,而且他們有堅強(qiáng)的技術(shù)團(tuán)隊來提供技術(shù)基礎(chǔ)。

1.3 研究的內(nèi)容

本系統(tǒng)的研究目的在于實現(xiàn)網(wǎng)絡(luò)考試系統(tǒng),實現(xiàn)該系統(tǒng)要完成的工作包括如下幾個方面:

(1)了解全球的網(wǎng)絡(luò)考試系統(tǒng)的發(fā)展歷程和現(xiàn)狀。深入解析其工作流程。

(2)根據(jù)該系統(tǒng)的工作流程設(shè)計其總體結(jié)構(gòu),繪制其結(jié)構(gòu)圖。

(3)設(shè)計系統(tǒng)的功能模塊,如:后臺系統(tǒng)運行維護(hù)模塊。包括試題的錄入、篩選、刪除,隨機(jī)生成,提交,打分等功能。前臺考試模塊,包括題的分發(fā)、時間的記錄等功能。教師組題模塊,具有考題的生成、選擇、分?jǐn)?shù)評判的等能力。設(shè)計并實現(xiàn)教師考前出題的組題功能模塊。包括題類型,數(shù)量,每個題考分的設(shè)定等。

(4)熟練地運用和掌握J(rèn)avaWeb技術(shù)和MySql數(shù)據(jù)庫編程,進(jìn)行考試系統(tǒng)的程序代碼編寫、調(diào)試運行以及功能測試。

(5)了解電腦服務(wù)器的運行問題以及原理;大數(shù)據(jù)庫的儲存;以及大數(shù)據(jù)庫與程序的互相交流問題。

本網(wǎng)絡(luò)考試系統(tǒng)運用了很多的開發(fā)工具以及以java為基礎(chǔ)的開發(fā)語言,在后臺的代碼編寫中主要運用了Java、J2EE;前臺的設(shè)計中運用了JavaScript、JQuery、css等一些開發(fā)語言;通過eclipse來編寫這些程序;用mysql進(jìn)行數(shù)據(jù)庫的設(shè)計與分析;另外該網(wǎng)絡(luò)考試系統(tǒng)的部署容器為tomcat,當(dāng)需要進(jìn)行考試時,只需要配置tomcat服務(wù)器,便可進(jìn)行考試。

2.1 JAVA簡介

Java作為一種計算機(jī)編程語言,其在企業(yè)網(wǎng)絡(luò)和Internet環(huán)境的應(yīng)用更是十分廣泛,現(xiàn)在已成為Internet中最受歡迎、最有影響的編程語言之一。其最大的特點就是面向?qū)ο螅@種面向?qū)ο蟮某绦蛟O(shè)計更接近我們的思維方式,相對于面向過程的程序設(shè)計,它最大的優(yōu)點就是可擴(kuò)展性和可維護(hù)性,這也使我們的代碼更健壯。

我們都知道面向?qū)ο笾饕兴拇筇匦裕悍庋b、抽象、繼承和多態(tài)。

封裝:在面向?qū)ο笳Z言中,封裝特性最為直接的體現(xiàn)在類中,類即現(xiàn)實生活中的實體的抽象,我們將其所擁有的屬性和方法封裝到類中,對外部我們提供相應(yīng)的接口,通過實例化的對象可以調(diào)用類中封裝好的屬性和方法,并且在使用這些方法時并不用知曉其內(nèi)部的具體實現(xiàn),這是面向?qū)ο蟮姆庋b特性;

抽象:抽象就是將一類實體的所共同擁有的特性抽象出來,封裝在一個抽象類中,抽象在面向?qū)ο笳Z言中是由抽象類來體現(xiàn)的。抽象類描述的是一類事物共有的東西,而并非特指某種事物,所以在Java編程語言中體現(xiàn)為抽象類不能實例化;

繼承:繼承就是指子類可以繼承父類或者接口,從而可以實現(xiàn)代碼重用,其實繼承體現(xiàn)的是單繼承關(guān)系,父類和子類本質(zhì)上還是一類實體。

多態(tài):Java中的多態(tài)具有多重含義。首先多態(tài)最為直白的體現(xiàn)就是父類對象引用不同的子類對象實例,調(diào)用不同的子類重寫的方法從而表現(xiàn)出不同的行為。多態(tài)能夠提高代碼重用,還可為程序提供更好的可擴(kuò)展性。

2.2 J2EE

J2EE是一項目架構(gòu)標(biāo)準(zhǔn)主要用于網(wǎng)頁的開發(fā)通過這個標(biāo)準(zhǔn)可以制定出一些應(yīng)用于企業(yè)的網(wǎng)站。嚴(yán)格地來說,J2EE并不屬于一種產(chǎn)品而是一種約束或者是標(biāo)準(zhǔn)。有的人把它稱開發(fā)的規(guī)范,因此,不管是哪一家公司他們只要在這個架構(gòu)下進(jìn)行開發(fā)都可以開發(fā)出一款比較實用的高級應(yīng)用程序。J2EE從開發(fā)到設(shè)計,再到最后的綜合管理可以構(gòu)成一套完整的開發(fā)體系,J2EE是由oracle軟件公司跟其他多數(shù)享譽(yù)盛名的科技公司共同努力發(fā)明并且應(yīng)用起來的。J2EE是軟件開發(fā)的一項標(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是一個公司級平臺。它用來給那些在公司經(jīng)營項目中遇到的研發(fā)、設(shè)計、系統(tǒng)管控有關(guān)難題進(jìn)行簡化。

J2EE可以說這一項技術(shù)是根據(jù)JAVA標(biāo)準(zhǔn)升級而成而不是憑空獨創(chuàng)的,J2EE不斷的更新和發(fā)展最終形成了現(xiàn)在的約束和規(guī)范。J2EE技術(shù)首先要不違背它所繼承的技術(shù)和規(guī)范標(biāo)準(zhǔn),比如說對數(shù)據(jù)庫的訪問以及良好的跨平臺性質(zhì),以及分布式的應(yīng)用。同時,還要適用于各種各樣的使用人群。除此之外必須還要為其他的網(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)大的伸縮性。那么最終的一個目的就是要使得程序開發(fā)人員在開發(fā)過程中盡量少使用市場上的一些現(xiàn)有的框架,從而規(guī)范一個正確的開發(fā)體系。那么,他是利用一種開發(fā)模型,此模型呈現(xiàn)分布式。以此來完成對所有應(yīng)用的開發(fā)。在開發(fā)過程中主要根據(jù)系統(tǒng)的各個功能進(jìn)行劃分,也可將這些功能劃分為不同的組件。不同的組件會存放在不同的服務(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ù)據(jù)庫。MySQL提供了許多的技術(shù)支持其中包括了多操作系統(tǒng)的支持也包括了多線程的支持,同時也提供多種資源的支持,除此之外,還可以提供多種的數(shù)據(jù)庫連接方法解決數(shù)據(jù)庫并發(fā)和大量數(shù)據(jù)操作的問題 。使用MySQL的人都會認(rèn)為這個數(shù)據(jù)庫特別實用。由于它是完全開源和免費的,在使用成本上也不會有太大的損失,因此是目前中小型公司主要使用的數(shù)據(jù)庫之一。從數(shù)據(jù)庫關(guān)系來看他是一款關(guān)系型數(shù)據(jù)庫具有很多優(yōu)點比如說用的內(nèi)存空間較小用戶界面簡單操作起來十分便捷并且不需要太多繁瑣的安裝步驟。MySQL是由MySQL公司開發(fā)而成,那么這個公司是一個什么公司呢?從歷史數(shù)據(jù)來看它是一個非常有商業(yè)眼光的公司,也是非常成功的一個公司,它所開發(fā)的產(chǎn)品都受到了人們的青睞。MySQL本身的特性也非常的突出,他能夠兼容多種操作系統(tǒng),同時也能兼容多種的編程語言,比如說Linux環(huán)境下使用,也同時能夠支持多種編程語言并為這些編程語言提供他們所要使用的用戶接口。在性能方面具有處理大數(shù)據(jù)高并發(fā)的處理能力,并且不會占用太多的主機(jī)內(nèi)存,這一點相對其他的數(shù)據(jù)庫要好很多。MySQL的架構(gòu)應(yīng)用圖如2-1所示:

圖2-1 Mysql架構(gòu)服務(wù)圖

MySQL使用了好幾種軟件進(jìn)行測試,保證這個可用性;它支持好多種操作系統(tǒng);支持多線程,提供了很多資源;也提種了很多數(shù)據(jù)庫連接方法;它還可以處理很多比較大的數(shù)據(jù)庫。大部分使用這個軟件的人就會有很大的幫助了,而且還因為其他開放源碼軟件,也還大大降低總體擁有成本了。

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ì)分,讀取速度和靈活性就會提高。MySQL數(shù)據(jù)庫是真正做到了多線程、多用戶的SQL數(shù)據(jù)庫[9]。它使用最常用標(biāo)準(zhǔn)化語言去訪問數(shù)據(jù)庫。MySQL數(shù)據(jù)庫以其成本低、體積小、速度快和源碼開發(fā)的優(yōu)點,開發(fā)中小型的網(wǎng)站都選用MySQL數(shù)據(jù)庫作為數(shù)據(jù)庫。

在大學(xué)期間,MySQL做為我們最先接觸和理解的數(shù)據(jù)庫其基礎(chǔ)應(yīng)用相對廣泛,此次畢業(yè)設(shè)計我也選用MySQL做為后臺數(shù)據(jù)庫。

MySQL數(shù)據(jù)庫的實現(xiàn)是以一個客戶機(jī)/服務(wù)器結(jié)構(gòu)[13]的形式,它是很多不同的客戶程序和庫和一個服務(wù)器守護(hù)程序組合而成的。

MySQL數(shù)據(jù)庫主要是快度速、比較健壯和易于使用。我們需要這樣一個SQL服務(wù)器,它能基于不昂貴的基礎(chǔ)上,處理數(shù)據(jù)速度快,加之可視化插件、軟件的使用可以使其數(shù)據(jù)操作更加方便。

可以總結(jié)出MySQL具有以下幾個特性:

  1. 支持AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統(tǒng);

  2. 為多種編程語言提供了API;

  3. 支持多線程,充分利用CPU資源;

  4. 通過優(yōu)化的SQL語句算法,有效地增進(jìn)了查詢速度;

  5. 能夠作為單獨的應(yīng)用程序為客戶端服務(wù)器網(wǎng)絡(luò)環(huán)境提供數(shù)據(jù)支持,也能夠作為庫而嵌入到其他的軟件,完成相關(guān)的數(shù)據(jù)存儲作用;

  6. 提供多種語言支持,數(shù)據(jù)表名和數(shù)據(jù)列名都可以使用多種編碼方式如中文的GB 2312、BIG5,日文的Shift_JIS等;

  7. 提供多種用于管理數(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ā),也可以用于移動應(yīng)用的開發(fā),其主要特點是功能強(qiáng)大,應(yīng)用廣泛,并且支持很多開源的產(chǎn)品,應(yīng)用前景非常廣發(fā)。

MyEclipse是由Eclipse通過對插件的集成而來,是對IDE的拓展,可以用來開發(fā)網(wǎng)頁等應(yīng)用,可以實現(xiàn)程序的開發(fā),調(diào)試,發(fā)布等,能極大的提高開發(fā)效率,能完美支持HTML、STRUTS等,可以說集成后的MyEclipse包含了當(dāng)前所有主流的開源產(chǎn)品。MyEclpise也經(jīng)歷了很多代的產(chǎn)品,從最開始的到后來的2014版本,2015版本等都說明了它在發(fā)展歷程中的變化。

MyEclipse的配置使用也非常智能,不需要使用者懂太多的知識,只需要在自己使用的功能中進(jìn)行了解即可,在完成項目開發(fā)之后,也可以直接通過MyEclipse進(jìn)行項目部署,可以將網(wǎng)頁項目進(jìn)行選中,直接運行在Tomcat中,也可以將項目打包通過導(dǎo)出功能將項目全部導(dǎo)出,然后將項目發(fā)布到tomcat中,通過對配置文件的設(shè)置,完成布置,布置完項目以后可以在瀏覽器中進(jìn)行查看??梢哉f,有了MyEclipse之后,基本就能支持所有的web開發(fā),就能使用快捷的編譯工具進(jìn)行快速的開發(fā),也能在各種各樣的服務(wù)器上進(jìn)行代碼測試。在其他方面,MyEclispe也有很多的開發(fā)前景,比如在云開發(fā)領(lǐng)域,在移動端開發(fā)領(lǐng)域,在企業(yè)級開發(fā)領(lǐng)域等等,因此,MyEclipse的應(yīng)用場景非常的廣泛。

2.5 JavaScript

JavaScript看樣子和Java很像,但是,實際上它們之間并沒有直接聯(lián)系,只是大家都以Java開頭而已。目前互聯(lián)網(wǎng)上最重要的語言是什么?不是Java,不是.Net,也不是PHP,而是JavaScript,它是互聯(lián)網(wǎng)上最重要的語言。它不僅能跨平臺、跨瀏覽器,它還能跨后端語言。在WEB2.0時代,JavaScript語言像橋一樣,將前端頁面和后端服務(wù)器連接了起來,這樣前端頁面不用知道服務(wù)器那里是用什么語言編寫的,也不用知道是如何編寫的,而服務(wù)器那頭也不用知道前端是用什么語言寫的,只需要知道前端會傳過來一些固定格式的數(shù)據(jù)信息。JavaScript編寫的程序是在瀏覽器中運行的,它不會在服務(wù)器那頭運行,一定程度上減少了服務(wù)器那頭的壓力。JavaScript語言在網(wǎng)頁完全加載完畢后,可以與網(wǎng)頁產(chǎn)生互動來完成一些操作,利用這個特性,我們經(jīng)常將JavaScript運用在驗證表單、修改HTML元素和存儲用戶數(shù)據(jù)等方面上。這些功能,F(xiàn)lash和Silverlight都能完成,但是Flash和Silverlight都要單獨的安裝插件,使用門檻比較高,而且針對不同的瀏覽器,插件也不一樣,在一堆插件中,用戶很難選擇正確的插件進(jìn)行安裝。而JavaScript不同,它不需要額外的安裝什么東西,只要是個瀏覽器,就能支持。JavaScript的語法與C的語法類似,語句通過在最后加上“;”符號來表示結(jié)束,同樣的大小寫敏感,注釋也是“//”開始。因此學(xué)習(xí)過C語言的人能夠很快的上手JavaScript的開發(fā)工作。

2.6 JQuery

如果把開發(fā)人員扔回石器時代,那么JavaScript就是一堆繩子、木頭和石頭,通過用這些工具,人類就可以在石器時代活下來,同樣的,開發(fā)人員也能用JavaScript做任何事。但是,如果說我們把繩子、木頭和石頭組裝起來,做成榔頭,做成弓箭,那么無論是打獵還是耕作,效率都會有很大的提升。jQuery就是這里的榔頭和弓箭。jQuery是由JavaScript寫的,它封裝了一些我們在創(chuàng)作網(wǎng)頁時候常用的操作,比如對DOM的修改、AJAX等操作,這些操作如果讓開發(fā)人員自己用JavaScript編寫,那么可能要花幾十行代碼,復(fù)雜的甚至要上百行,同時考慮到這些操作比較頻繁,那么一個頁面上你會看到很多很多的JavaScript代碼,開發(fā)成本和維護(hù)成本都會很高,代碼也不容易讀。在jQuery,這些操作只需要少數(shù)幾行代碼甚至一行代碼就能完成,減少了開發(fā)人員的負(fù)擔(dān),也讓后期維護(hù)更加簡單。繩子、木頭和石頭可以組裝成榔頭、弓箭等,同樣的,JavaScript也能組裝成許多和jQuery類似的工具,但是我們?yōu)槭裁催x擇jQuery,而不選擇其他的呢?一方面是因為jQuery功能強(qiáng)大且容易學(xué)習(xí),另一方面,jQuery從發(fā)行到現(xiàn)在,經(jīng)歷了許多版本的迭代,不僅穩(wěn)定,而且網(wǎng)上相關(guān)的資料也更齊全,遇到問題也能更容易的解決。此外,在jQuery的支持下,還誕生一大批基于jQuery的插件,比如UI插件、彈窗、選項卡、導(dǎo)航菜單、在線客服、瀑布流、3D、時間軸等等的插件,這些插件不僅簡化了開發(fā),還使網(wǎng)頁更加美觀,用戶交互體驗更加好?;谏鲜鲈颍旁诒姸喙ぞ咧?,采用了jQuery。

2.7 CSS3

Cascading Style Sheets(CSS),中文叫層疊樣式表?,F(xiàn)在來說我們已經(jīng)進(jìn)入了WEB2.0的時代,WEB2.0下的網(wǎng)站不僅需要好看的外觀,同時還要用戶體驗良好的界面。CSS2標(biāo)準(zhǔn),從現(xiàn)在的大環(huán)境下去看,顯然已經(jīng)不能滿足日益增長的用戶需求和開發(fā)需求。因此CSS3標(biāo)準(zhǔn)應(yīng)運而生。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ù)器上加載字體文件,換句話說,即便你的電腦上沒有這種字體,你也能正常的訪問用了這個字體的頁面。可見CSS3賦予了更大的靈活性。除了@Font-face特性外,CSS3還引入了包括Word-wrap & Text-overflow樣式、文字渲染、多列布局、漸變、陰影、反射、盒子模型、Transforms 和 Animation Transitions等等新特性,這些新特點的引進(jìn),降低了創(chuàng)造者的開發(fā)難度,也提高了體驗。

2.8 JSP

JSP(Java Script Pages)是由Sun公司建立的一種動態(tài)網(wǎng)頁技術(shù),它是建立在HTML文件基礎(chǔ)上的。在傳統(tǒng)的網(wǎng)頁HTML文件(*.htm,*.html)中加入Java程序。

首先JSP是跨平臺的,因為Java就是可移植跨平臺的,而JSP技術(shù)是建立在Java平臺之上,所以使用JSP開發(fā)的Web應(yīng)用也是跨平臺的。

JSP頁面不僅可以使用普通網(wǎng)頁一樣使用標(biāo)準(zhǔn)標(biāo)記語言的元素(如HTML標(biāo)記)以外,還可以使用其獨有的JSP標(biāo)記。JSP可以直接向數(shù)據(jù)庫中獲取或?qū)懭霐?shù)據(jù),所以通過JSP,我們可以在網(wǎng)頁中加入更多動態(tài)內(nèi)容。

JSP有如下優(yōu)點:

(1)一次編寫,到處運行。除了系統(tǒng)之外,代碼不用做任何更改。

(2)JSP具有多平臺支持??梢栽谌我馄脚_上的任意環(huán)境中開發(fā),在任意環(huán)境中進(jìn)行系統(tǒng)的部署和擴(kuò)展。相比JSP的多平臺支持相比ASP/.net的局限性是顯而易見的。

(3)具有可伸縮性。不論是只有一個小的Jar文件就可以運行的Servlet/JSP,還是由多臺服務(wù)器進(jìn)行集群和負(fù)載均衡,亦或者由多臺Application來事務(wù)處理,Java顯示了其廣闊的應(yīng)用范圍和巨大的生命力。

(4)功能強(qiáng)大的多樣化的開發(fā)工具支持。Java已經(jīng)有了許多非常優(yōu)秀的開發(fā)工具,其中大部分可以免費得到,并且其中大多都能運行在多平臺下。

選取JSP的原因

JSP通過其獨有的標(biāo)簽庫,使靜態(tài)HTML網(wǎng)頁技術(shù)向動態(tài)網(wǎng)頁技術(shù)完善。通過其在網(wǎng)絡(luò)編程中的使用,可以利用嵌入Java代碼使其充分利用Java語言的上手容易,跨平臺,運行效率高等優(yōu)點。具備一定程序設(shè)計的基本知識,學(xué)習(xí)JSP也十分容易。

首先JSP是一種動態(tài)網(wǎng)頁編程語言,再加上JSP具有跨平臺、運行效率高、易學(xué)易用等特點和優(yōu)勢,做簡單界面比較容易,故選用JSP來實現(xiàn)網(wǎng)絡(luò)考試系統(tǒng)。

2.9 Tomcat服務(wù)器

Tomcat 服務(wù)器是Apache組織的一個開源子項目。具備基本的web服務(wù)的功能,是中小型系統(tǒng)首選的服務(wù)器,更是開發(fā)和調(diào)試JSP 程序的首選。因為Tomcat 技術(shù)不僅免費而且性能穩(wěn)定,我們在本科階段的很多web項目中也多為使用Tomcat作為服務(wù)器,其也成為目前比較流行使用的Web 應(yīng)用服務(wù)器。

如果配置正確,Tomcat 服務(wù)器實際上在運行JSP 頁面和Servlet容器。此外,Tomcat和其他Web服務(wù)器一樣,都具有基于處理HTML頁面的功能,另外它還是一個Servlet和JSP容器。獨立的Servlet容器是Tomcat服務(wù)器的默認(rèn)模式。目前Tomcat服務(wù)器最新版本為8.0.0,本次畢設(shè)我使用的也是Tomcat8。

此外,Tomcat 服務(wù)器運行時占用的系統(tǒng)資源較小,可擴(kuò)展性良好,支持郵件服務(wù)和負(fù)載平衡等開發(fā)應(yīng)用系統(tǒng)常用的功能。因此利用Tomcat服務(wù)器作為網(wǎng)絡(luò)考試系統(tǒng)的Web應(yīng)用服務(wù)器。

3.1 可行性分析

可行性分析是用最小的代價在最短的時間內(nèi)確定問題是否能夠解決。我首先需要進(jìn)一步對上一章節(jié)目前考試系統(tǒng)現(xiàn)狀的分析。之后初步的確定項目的規(guī)模跟目標(biāo),確定項目的約束跟限制,必須分析幾種可能解法的利弊,從而判定原定系統(tǒng)的目標(biāo)和規(guī)模是否能夠?qū)崿F(xiàn),系統(tǒng)完成后帶來的效益是否能夠達(dá)到最大值??傊?,只有認(rèn)真的進(jìn)行了可行性分析,才會避免或者減輕項目開發(fā)后期可能出現(xiàn)的困境。

1. 經(jīng)濟(jì)可行性

經(jīng)濟(jì)可行性的重要方面是研究成本,其中包含畢業(yè)設(shè)計所需的開發(fā)成本,對開發(fā)成本是不是會大于開發(fā)項目前期預(yù)計利潤進(jìn)行預(yù)算。在結(jié)合上述所有情況的分析下,我覺得自己的畢設(shè)課題是經(jīng)濟(jì)可行性好的。首先開發(fā)此次畢設(shè)軟件不要前期的投入資金,其次是自己設(shè)計的,最多是自己去圖書館找書,在實驗室做項目,通過老師教導(dǎo),同學(xué)幫助,這些都是免費的,再有就是需要一臺電腦,這些都是能接受的,成本很小的同時我也可能夠提升我在編碼方面的實現(xiàn)能力。

2. 技術(shù)可行性

本課題使用的是Java技術(shù),開發(fā)平臺選用Eclipse,Eclipse有著完整配備的功能,便于初學(xué)者使用還有代碼提示,讓我使用更加得心應(yīng)手。在決定了編程框架后,再說用Java語言編碼的優(yōu)點:快,精簡,可用性高等。同時,使用的數(shù)據(jù)庫是MySQL,開源的MySQL增添了可視化和穩(wěn)定化的優(yōu)點,而且安全方面也做得很好,更別說它的強(qiáng)大的保存數(shù)據(jù)功能以及查詢數(shù)據(jù)功能。

  1. 操作可行性

該網(wǎng)絡(luò)考試系統(tǒng)部署容器為tomcat,當(dāng)需要進(jìn)行考試時,只需要配置tomcat服務(wù)器,便可進(jìn)行考試。本系統(tǒng)采用jsp技術(shù),利用網(wǎng)絡(luò)就能夠進(jìn)行訪問和操作,且界面簡單易操作,用戶只要有電腦,都能進(jìn)行訪問和操作。本系統(tǒng)具有易操作、易管理、交互性好的特點,在操作上是非常簡單的。因此本系統(tǒng)可以進(jìn)行開發(fā)。

3.2 需求分析

一.功能需求分析

網(wǎng)絡(luò)考試系統(tǒng)主要用于實現(xiàn)高校在線考試,基本功能包括:自動組卷、試卷發(fā)布、試卷批閱、試卷成績統(tǒng)計等。本系統(tǒng)結(jié)構(gòu)如下:

(1)學(xué)生端:

登錄模塊:登錄功能;

網(wǎng)絡(luò)考試模塊:可參加考試,并查看考試結(jié)果,提交試卷后老師允許的情況下查看錯題;

(2)超級管理員端:

登錄模塊:實現(xiàn)管理員登錄功能;

用戶管理模塊:實現(xiàn)用戶信息的增加、修改、查看功能;

角色權(quán)限管理模塊:實現(xiàn)角色的增加、修改、查看功能;

試卷管理模塊:實現(xiàn)試卷信息的增加、修改、查看功能;

試題管理模塊:實現(xiàn)試題信息的增加、修改、查看功能;

  1. 試題管理員端(老師):

試卷管理模塊:實現(xiàn)試卷信息的增加、修改、查看功能;

試題管理模塊:實現(xiàn)試題信息的增加、修改、查看功能;

二.非功能需求分析

1、整個系統(tǒng)的設(shè)計中,系統(tǒng)必須滿足以下要求:

(1)數(shù)據(jù)安全性

存儲有關(guān)隱私權(quán)的網(wǎng)絡(luò)考試等問題的系統(tǒng)數(shù)據(jù),需要確保數(shù)據(jù)的安全性,在網(wǎng)站設(shè)計時必須要采取安全防范措施,以解決潛在的安全問題,比如如何防止學(xué)生上網(wǎng)查答案。

(2)易用性

在用戶權(quán)限范圍內(nèi),可在一個統(tǒng)一風(fēng)格的界面內(nèi)即可完成相關(guān)的所有業(yè)務(wù)流程操作或者獲取所有相關(guān)信息,大大提高操作員的工作效率和易用性,靈活應(yīng)用本系統(tǒng)。

(3)柔軟性

由于這個網(wǎng)絡(luò)考試系統(tǒng)涉及到范圍廣泛的業(yè)務(wù),設(shè)計出的系統(tǒng)必須能夠處理接受變化的能力。

(4)擴(kuò)展性

隨著互聯(lián)網(wǎng)管理業(yè)務(wù)管理需求的不斷變化,老師管理系統(tǒng)必然涉及到業(yè)務(wù)更新及擴(kuò)展,這就要求在設(shè)計之初就應(yīng)該考慮良好的可擴(kuò)展性方案。

第4章 系統(tǒng)總體設(shè)計

4.1. 系統(tǒng)概要功能圖

本系統(tǒng)所開發(fā)的網(wǎng)絡(luò)考試系統(tǒng)主要分成了三個模塊的主要功能,系統(tǒng)功能、考試功能和學(xué)生功能,每個功能都包含了幾個子功能,子功能主要包括:對于系統(tǒng)功能方面的管理、角色的管理、用戶方面的管理、對于試題管理、對于的試卷管理、學(xué)生答題、總結(jié)出錯題庫與得分。系統(tǒng)的概要功能圖如圖4-1所示:

圖4-1 系統(tǒng)概要功能圖

4.2 系統(tǒng)基本功能

系統(tǒng)功能的劃分方式可以分成很多種類,前面是按照功能模塊進(jìn)行劃分,將系統(tǒng)分成三個模塊,本章節(jié)依據(jù)網(wǎng)絡(luò)考試系統(tǒng)的系統(tǒng)角色不同,可以分成用戶端和管理員端。用戶端包括:登錄功能、學(xué)生答題、答題得分以及考完試之后的錯題解析。管理員端包括:登錄功能、系統(tǒng)功能管理、用戶管理、角色管理、題目管理、試卷管理。下面本節(jié)主要對各個基本的功能進(jìn)行一個簡介。(此處沒有對試題管理員進(jìn)行詳細(xì)介紹,因為管理員的題目管理跟試卷管理的功能就是他的功能)

4.2.1 登錄功能

登錄功能是一個系統(tǒng)的重要組成部分,也是一個系統(tǒng)重要的門戶功能,登錄功能主要實現(xiàn)了使用者對系統(tǒng)的登錄,在本文所設(shè)計的體系中,登錄主要分成了兩種身份:學(xué)生用戶和管理員。兩種身份登陸,能細(xì)分系統(tǒng)的功能模塊,實現(xiàn)更加方便的操作和管理。

4.2.2 系統(tǒng)答題

系統(tǒng)答題模塊是本系統(tǒng)的一個重要功能,可以實現(xiàn)讓用戶的答題操作。系統(tǒng)答題功能主要是學(xué)生用戶登錄以后操作的,學(xué)生用戶在輸入正確的用戶名和密碼以后能開始系統(tǒng)答題,系統(tǒng)答題的題目均來自數(shù)據(jù)庫。

4.2.3 答題得分

答題得分功能實現(xiàn)了學(xué)生用戶在答題結(jié)束以后對自己得分情況的查看,該功能就實現(xiàn)了登錄系統(tǒng)的學(xué)生用戶在完成自己的試卷以后,點擊體提交就能看到自己的得分,因此該功能是一個展示性質(zhì)的功輔助能。

4.2.4 錯題解析

錯題解析功能是系統(tǒng)答題功能的一個輔助或者說優(yōu)化的功能,只有學(xué)生用戶在登錄系統(tǒng)完成答題以后在老師允許的情況下才能進(jìn)行該功能的操作,學(xué)生答題可能存在一定的錯誤,對錯誤題目的查看成為考試系統(tǒng)的子功能。因此本文所設(shè)計的錯題解析功能,能讓學(xué)生迅速發(fā)現(xiàn)正確或者錯誤題目,以及解析過程。這樣方便自學(xué)和改進(jìn)。學(xué)生功能結(jié)構(gòu)圖,如圖4-2所示:

圖4-2學(xué)生系統(tǒng)結(jié)構(gòu)圖

4.2.5 系統(tǒng)功能管理

系統(tǒng)功能管理主要實現(xiàn)了對系統(tǒng)的其他功能進(jìn)行管理,主要包括對新功能的添加和,對現(xiàn)有功能的添加和修改,同時能對現(xiàn)有的功能進(jìn)行子功能的和修改,修改后的功能可以在系統(tǒng)中被查看。

4.2.6 用戶管理

用戶管理是一個系統(tǒng)的重要功能之一,對用戶的管理可以實現(xiàn)對系統(tǒng)使用者的了解和查看,能讓使用者更加方便的使用本系統(tǒng),用戶的種類分為多種,本文主要體現(xiàn)在學(xué)生用戶和管理者兩種用戶上面,可以對用戶的信息進(jìn)行添加修改等。

4.2.7 角色管理

角色管理主要是針對用戶來設(shè)計的,不同的用戶擁有不同的權(quán)力。換句話說就是操作的權(quán)限是不同的。學(xué)生賬號只能進(jìn)行答題等行為,而不能進(jìn)行后臺的管理員操作。管理員賬號也擁有不一樣的權(quán)利。這些權(quán)力體現(xiàn)在對賬號的操作,試卷和題目的管理上,因此對權(quán)限的管理能很好的控制系統(tǒng)用戶的行為,有利于系統(tǒng)更加穩(wěn)定的運行。

4.2.8 題目管理

題目管理主要是針對管理員的功能,該功能面向系統(tǒng)中試卷所使用的題目庫,在本系統(tǒng)中,管理員能通過對題目的添加和修改對題目進(jìn)行管理,可以查看現(xiàn)有的題目,同時也能對新的題目進(jìn)行添加,為試卷的生成提供更多題目的選擇。

4.2.9 試卷管理

試卷管理是本系統(tǒng)的核心功能,主要實現(xiàn)的是對學(xué)生用戶考試答題的試卷進(jìn)行管理,通過系統(tǒng)隨機(jī)抽取的題目自動生成試卷并且能將試卷存入數(shù)據(jù)庫,供學(xué)生考試時進(jìn)行選擇。管理員功能結(jié)構(gòu)圖,如圖4-3所示:

圖4-3 管理員功能結(jié)構(gòu)圖

4.3 數(shù)據(jù)庫設(shè)計

數(shù)據(jù)庫的設(shè)計十分重要,下面將對本文所使用的數(shù)據(jù)表進(jìn)行逐一的介紹。

1. 用戶表及ER圖

表4.1用戶表

用戶表ER圖,如圖4-4所示:

圖4-4 用戶表ER圖

用戶id:每一個登陸的用戶都有一個特有的編號;

角色id:學(xué)生、超級管理員、試題管理員,三個角色分別對應(yīng)一個編號;

賬號:登錄時需要用到的;

密碼:密碼對應(yīng)相應(yīng)的賬號;

姓名:用戶的真實姓名;

狀態(tài):1為正常,0為禁用。

2. 角色表

表4.2角色表

角色id:學(xué)生、超級管理員、試題管理員,三個角色分別對應(yīng)一個編號;

角色名:學(xué)生、超級管理員、試題管理員;

角色狀態(tài):1為正常,0為禁用。

3. 功能表ER圖

表4.3功能表

功能表ER圖,如圖4-5所示:

圖4-5 功能表ER圖

功能id:每個功能對應(yīng)的編號;

功能名:分別有系統(tǒng)功能管理、角色管理、用戶管理、題目管理、試卷管理等;

功能地址:每個功能對應(yīng)一個地址,用于管理;

頂層功能id:系統(tǒng)功能包括系統(tǒng)功能管理、角色管理、用戶管理,試題管理包括題目管理、試卷管理;

狀態(tài):1為正常,0為禁用。

4. 權(quán)限表ER圖

表4.4權(quán)限表

權(quán)限表ER圖,如圖4-6所示:

圖4-6 權(quán)限表ER圖

角色權(quán)限id:每個角色所擁有的權(quán)限對應(yīng)的編號;

功能id:每個功能對應(yīng)的編號;

5. 試題表ER圖

表4.5試題表

試題表ER圖,如圖4-7所示:

圖4-7 試題表ER圖

試題id:每道題對應(yīng)的編號;

題干:題目的內(nèi)容;

6. 試卷表ER圖

表4.6試卷表

試卷表ER圖,如圖4-8所示:

圖4-8 試卷表ER圖

試卷ID:每套試卷對應(yīng)的編號;

試卷名:試卷對應(yīng)的名字;

試題id:每道題對應(yīng)的編號;

7. 學(xué)生試卷表ER圖

表4.7學(xué)生試卷表

學(xué)生試卷表ER圖,如圖4-9所示:

圖4-9 學(xué)生試卷表ER圖

試卷ID:每套試卷對應(yīng)的編號;

用戶id:每一個登陸的用戶都有一個特有的編號;

角色id:學(xué)生、超級管理員、試題管理員,三個角色分別對應(yīng)一個編號;

學(xué)生答案:學(xué)生做試卷后的結(jié)果;

試題答案:每道題的正確答案;

本章主要介紹網(wǎng)絡(luò)考試系統(tǒng)的詳細(xì)設(shè)計,分別從用戶端和管理員端介紹各個功能模塊的實現(xiàn)情況和運行截圖。下面首先介紹用戶端,然后介紹管理員端。

5.1 學(xué)生用戶端

在這個系統(tǒng)中使用者主要是分為管理員和學(xué)生,我在這里先介紹學(xué)生用戶系統(tǒng)的運行情況。以下是學(xué)生用戶從登陸到錯題解析的整個運行流程情況將在下面的論文中進(jìn)行展示。

5.1.1 學(xué)生用戶登錄

學(xué)生用戶登陸,先到這個界面。 如圖5-1所示:

圖5-1用戶登錄運行界面

在進(jìn)入登錄界面以后選擇學(xué)生登錄,再輸入正確的用戶名和正確的密碼,就可以登錄。如圖5-2所示:

圖5-2用戶登錄輸入界面

用戶正確完成登錄輸入以后,系統(tǒng)會根據(jù)用戶所輸入的信息,通過功能代碼實現(xiàn)與數(shù)據(jù)庫中存儲數(shù)據(jù)的對比,從而判別該登錄用戶是否合法,如果不合法將提示輸入正確的登錄信息,輸入正確則登錄系統(tǒng),進(jìn)入系統(tǒng)的主界面。

5.1.2 主界面

學(xué)生用戶正確登錄系統(tǒng)之后會跳轉(zhuǎn)到學(xué)生用戶端的界面,主界面如圖5-3所示:

圖5-3學(xué)生用戶主界面

學(xué)生用戶的主界面主要包含了試卷列表和查看錯題兩個功能,試卷列表中羅列了所有考試的試卷,學(xué)生可以根據(jù)老師的要求選擇對應(yīng)的的試卷進(jìn)行考試,考試結(jié)束以后還可以進(jìn)行錯題查看功能。

5.1.3 系統(tǒng)答題

學(xué)生用戶登錄系統(tǒng)以后選擇試卷列表中的試卷進(jìn)行考試答題,答題界面如圖5-4所示:

圖5-4學(xué)生用戶答題界面

學(xué)生要在一定的時間內(nèi),完成試卷上的所有題目,然后進(jìn)行提交,答題的進(jìn)度和時間的限制可以系統(tǒng)會給出提示,運行界面如圖5-5所示:

圖5-5學(xué)生用戶答題進(jìn)度界面

5.1.4 答題得分

學(xué)生在規(guī)定的時間內(nèi)完成答題,完成以后提交系統(tǒng),提交系統(tǒng),系統(tǒng)會根據(jù)題庫對比得到考試成績,成績界面如圖5-6所示:

圖5-6學(xué)生用戶答題成績界面

計時器(到時自動交卷)功能,交卷時判斷試卷是否有未答題、計算得分等功能都在paper.jsp中用javascript來實現(xiàn)

// 交卷功能

判斷是否有未答題目

function?unAnswer(){

if(unanswer != 0){

layer.open({

title:’警告’,

content: “還有”+unanswer+”道題目未做!”,

icon:2,

end:function(){

postAnswer();

}

});

}else{

postAnswer();

}

}

計算得分

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’);

}

})

}

倒計時功能

//小于10的數(shù)字前面補(bǔ)0

function?p(n){

return?n<10?’0’+n:n;

}

//獲取當(dāng)前時間

var?now=new?Date();

//獲取結(jié)束時間

var?endDate=new?Date();

//設(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)+’時’+p(m)+’分’+p(s)+’秒’);

if(countDown<=0){

document.getElementById(‘time’).innerHTML=’考試結(jié)束’;

layer.open({

title:’警告’,

content: ‘考試時間到,試卷已經(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 錯題解析

學(xué)生用戶能對自己的答題試卷中錯誤的題進(jìn)行查看,并且能看到錯題的解析,但是此功能只是一個輔助優(yōu)化功能,必須是在交卷之后老師同意的情況下,才能查看。錯題的解析界面如圖5-8所示

圖5-8學(xué)生用戶錯題解析界面

學(xué)生能根據(jù)數(shù)據(jù)庫中給出的正常答案,對比自己的錯誤選項進(jìn)行研究和學(xué)習(xí),達(dá)到考試提升能力的效果。

5.2 管理員端

管理員端的功能主要為了更好的管理系統(tǒng),讓學(xué)生用戶能順利考試,因此管理員功能在實現(xiàn)的時候需要考慮的因素和功能會比較多,下面對管理員如何在這個系統(tǒng)中操作進(jìn)行演示。試卷管理員(老師)的功能包括在其中。

5.2.1 管理員登錄

管理員登錄和學(xué)生用戶登錄使用的是同一個登錄界面,區(qū)別在于登錄時選取的身份是管理員身份,登錄界面如圖5-9所示:

圖5-9管理員登錄界面

5.2.2 管理員主界面

管理員正確輸入信息后會跳轉(zhuǎn)到管理員的主界面,主界面如圖5-10所示:

圖5-10管理員主界面

在管理員主界面上,我們可以看到管理員端主要分成了兩個部分的功能,第一個是系統(tǒng)功能,第二個是試卷管理功能,下面將對這兩個功能下的子功能進(jìn)行逐一介紹。

5.2.3 系統(tǒng)功能管理

系統(tǒng)功能管理實現(xiàn)了所有的父功能和子功能之間的聯(lián)系,能讓管理員更方便得查看各個功能的實現(xiàn)情況。系統(tǒng)功能管理的界面如圖5-11所示:

圖5-11系統(tǒng)功能管理界面

功能之間存在著主次關(guān)系,可以通過新建實現(xiàn)新的功能,也可以通過來實現(xiàn)功能間的聯(lián)系,新建功能如圖5-12所示:

圖5-12系統(tǒng)新建功能界面

系統(tǒng)子功能如圖5-13所示:

圖5-13系統(tǒng)功能管理子功能界面

5.2.4 用戶管理

實現(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 角色管理

角色管理主要把各個角色之間的權(quán)限管理實現(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 題目管理

題目的管理主要實現(xiàn)對所有考試題目得新增和。題目管理界面如圖5-21所示:

圖5-21題目管理界面

實現(xiàn)對現(xiàn)有題目的如圖5-22所示:

圖5-22題目界面

除了對現(xiàn)有題目的修改,還能實現(xiàn)對新題目的添加,新增新題目的界面如圖5-23所示:

圖5-23題目新增界面

5.2.7 試卷管理

試卷的管理是學(xué)生考試的關(guān)鍵功能,試卷管理界面如圖5-24所示:

圖5-24試卷管理界面

試卷的種類分為很多種,要想從試卷中找到相關(guān)的試卷可以啟動搜索功能,搜索界面如圖5-25所示:

圖5-25試卷搜索界面

可以隨機(jī)抽取題目生成試卷。生成試卷的界面如圖5-26所示:

圖5-26試卷新增界面

在DAO層,利用隨機(jī)函數(shù),(設(shè)置試卷題目和插入題目數(shù)量)實現(xiàn)自動組卷

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ù)庫交互實現(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)測試一個很主要的任務(wù)便是檢查系統(tǒng)中所存在的一些不足和需要改進(jìn)的方面,以此來提高整個系統(tǒng)的可靠性。而系統(tǒng)建設(shè)的一個更主要的目的是檢測整個系統(tǒng)的“執(zhí)行如何”。這其中可以把它分為三大步,分別是對于模塊測試、組裝測試以及對于驗證的測試。而模塊測試即是要測試整個程序的正確與否,裝測試便是測試程序的接口正確與否,最后的驗證測試是使用者是否滿足整個系統(tǒng)軟件的功能和性能的關(guān)鍵。一旦經(jīng)過系統(tǒng)檢測測試出所存在的一系列問題的時候就需要經(jīng)過不斷的調(diào)試,從而找出具體的錯誤所存在的位置在哪里,以便更好的改正。黑盒測試要根據(jù)系統(tǒng)整體需求說明書,應(yīng)該全面覆蓋到系統(tǒng)聯(lián)合部件。系統(tǒng)檢測是對整個系統(tǒng)進(jìn)行一系列檢測,進(jìn)一步看看它是否符合需求規(guī)格的定義。在與需求規(guī)格定義不吻合或者是產(chǎn)生矛盾的地方要做進(jìn)一步的修改。我們進(jìn)行的軟件測試主要是包括功能測試和兼容性測試。

6.1 功能測試

為了確保程序的正常運行為了保證每個功能都能實現(xiàn)既定的任務(wù),在程序開發(fā)結(jié)束時應(yīng)該對整個系統(tǒng)進(jìn)行功能測試。就像我們所知道的功能測試就是對我們所開發(fā)的產(chǎn)品的各個功能進(jìn)行逐一驗證確保只能夠完成我們所設(shè)計的功能。在功能測試的過程中我們需要用到一些測試用例對每一項功能足以測試從而可以檢查我們所設(shè)計的系統(tǒng)能不能達(dá)到我們當(dāng)時所期望的所有功能。功能測試從另一個方面來講也可以叫做黑盒測試或者數(shù)據(jù)驅(qū)動測試,因為在黑盒測試和數(shù)據(jù)驅(qū)動測試系功能測試中我們只需要考慮的是每一個獨立功能而不需要考慮整個代碼的功能。一般來講我們可以從系統(tǒng)的每一個小功能開始測試,比如說在本文中體現(xiàn)的就是登陸功能和發(fā)表評論功能,通過對這兩個小功能的測試我們可以得出結(jié)論我們的系統(tǒng)是否滿足我們所期望的功能需求的。

我們所接觸的功能測試一般也叫黑盒測試,我們部隊底層代碼或者其他因素進(jìn)行測試,我們只對各個功能進(jìn)行測試。我們首先會對整個界面的各個功能進(jìn)行測試,然后逐步深入,對每一個子功能進(jìn)行測試,這個就是我們預(yù)期的目標(biāo)。我們需要對所有功能進(jìn)行測試以確保我們的設(shè)計和我們的實現(xiàn)是一致的,這樣我們的功能說明說才是真實有效的。

我們進(jìn)行程序的功能測試主要是對功能完整性進(jìn)行測試,但是不是做完這些就可以了,我們還要對其他的部分進(jìn)行測試,這就好比:判斷條件的測試,輸入的測試等。功能測試如表5.1所示。

表6.1 功能測試表

6.2 兼容性測試

兼容性測試是一個系統(tǒng)是否能在各種情況下正常運行的關(guān)鍵,測試的環(huán)境主要在各個操作系統(tǒng)和各個瀏覽器上展開,軟件測試中的兼容性測試很重要,如果說一個B/S系統(tǒng)與大多數(shù)的主瀏覽器都不是很兼容,那么這個系統(tǒng)將不能在市場上穩(wěn)定的運行。在本設(shè)計中,我們所提出的系統(tǒng)雖然不用考慮過多的商業(yè)因素但是也必須將兼容性測試后考慮在其中,這樣能讓系統(tǒng)在以后的使用中更加穩(wěn)定的運行。因此對系統(tǒng)進(jìn)行一次兼容性測試是很有用的一個檢測方式。

6.3 測試的方法

軟件測試的常用方法基本有兩種:靜態(tài)測試和動態(tài)測試。

1.靜態(tài)測試主要是指在不運行程序的前提下,通過人工評審程序源代碼和程序有關(guān)的說明文檔以及其他各類資料,來發(fā)現(xiàn)軟件中存在的邏輯錯誤和代碼錯誤,但是該類方法有一定的局限性;

2.動態(tài)測試顧名思義就是要運行測試程序,檢查運行結(jié)果和預(yù)期結(jié)果的差異,并分析運行效率和健壯性等屬性,動態(tài)測試的關(guān)鍵就是測試用例的構(gòu)建。目前,大部分公司的測試方式主要是動態(tài)測試,動態(tài)測試中設(shè)計測試用例的方法是白盒法與黑盒法;

白盒測試:也稱之為結(jié)構(gòu)測試,是將軟件看成了一個透明的白盒子,并按照程序的內(nèi)部結(jié)構(gòu)與處理邏輯來選定測試用例,對軟件的邏輯路徑及過程進(jìn)行測試,檢查它與設(shè)計是否相符。白盒測試:是通過程序的源代碼進(jìn)行測試而不使用用戶界面。這種類型的測試需要從代碼句法發(fā)現(xiàn)內(nèi)部代碼在算法,溢出,路徑,條件等等中的缺點或者錯誤,進(jìn)而加以修正。

黑盒測試:也稱功能測試,數(shù)據(jù)驅(qū)動測試或基于規(guī)格說明的測試,是通過使用整個軟件或某種軟件功能來嚴(yán)格地測試, 而并沒有通過檢查程序的源代碼或者很清楚地了解該軟件的源代碼程序具體是怎樣設(shè)計的。測試人員通過輸入他們的數(shù)據(jù)然后看輸出的結(jié)果從而了解軟件怎樣工作。將軟件看作黑盒子,在完全不考慮程序的內(nèi)部結(jié)構(gòu)和特性的情況下,測試軟件的外部特性。根據(jù)軟件的需求規(guī)格說明書設(shè)計測試用例,從程序的輸入和輸出特性上測試是否滿足設(shè)定的功能。

這篇論文主要講述了一個網(wǎng)絡(luò)考試系統(tǒng),在實現(xiàn)網(wǎng)絡(luò)考試系統(tǒng)的時候,我重點完成了以下幾點內(nèi)容:(1)認(rèn)識國內(nèi)外網(wǎng)絡(luò)考試系統(tǒng)的發(fā)展情況,深入思考該系統(tǒng)的工作流程;(2)按照該考試系統(tǒng)的工作流程設(shè)計該系統(tǒng)的總體結(jié)構(gòu),繪制結(jié)構(gòu)圖;(3)設(shè)計系統(tǒng)的功能模塊,如:后臺系統(tǒng)維護(hù)模塊,其中包含試題的錄入、整理、刪除等功能;前臺考試模塊,其中包括考試題的抽取、考試時間的倒計時等一些功能;教師組題模塊,包括考試題的生成、題目形式的選擇、每道題分值的設(shè)置等功能;設(shè)計并完成老師在考試前把題目整理出來功能模塊,包括考題類型、數(shù)量、每個題分?jǐn)?shù)的設(shè)置等;(4)熟練地運用和掌握J(rèn)avaWeb技術(shù)和MySql數(shù)據(jù)庫編程,進(jìn)行考試系統(tǒng)的程序代碼編寫、調(diào)試運行以及功能測試;(5)了解服務(wù)器的部署問題,數(shù)據(jù)庫的存儲問題,以及數(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è)計網(wǎng)絡(luò)考試系統(tǒng)的必要性。同時,根據(jù)系統(tǒng)需求與可行性分析完成了系統(tǒng)架構(gòu)的方案設(shè)計和管理員、學(xué)生用戶的功能分析以及各個功能的詳細(xì)實現(xiàn)。課題在具體內(nèi)容上首先詳細(xì)介紹了系統(tǒng)所使用的關(guān)鍵技術(shù),并對這些技術(shù)的相關(guān)知識進(jìn)行了詳細(xì)的介紹,緊接著對我的這個系統(tǒng)的結(jié)構(gòu)和還有模塊進(jìn)行了一些詳細(xì)的解釋,最后對這個系統(tǒng)的實現(xiàn)進(jìn)行分析和演示。

至此,本文所設(shè)計的網(wǎng)絡(luò)考試系統(tǒng)基本完成,但是本文所提出的僅僅是一個的畢業(yè)設(shè)計,它所涉及的內(nèi)容和形式都非常有限,在許多功能的實現(xiàn)和完成方式上存在著諸多的不足,這將在今后的學(xué)習(xí)中得到改進(jìn)。

致謝

在這緊張而又對社會帶著新奇的大四下半學(xué)年,每天基本都與畢業(yè)設(shè)計和論文度過,我的每一天的進(jìn)步都跟我的畢設(shè)負(fù)責(zé)老師的耐心指導(dǎo)有著很大的關(guā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è)課老師的指導(dǎo)幫助,我現(xiàn)在的畢業(yè)論文才能完成的游刃有余,感謝每一位我遇到的老師。

最后還要對我的同學(xué)和朋友們說一聲謝謝,感謝他們在我對論文有問題時及時伸出的援助之手,給我講解一些程序的代碼,解決了一些比較重要的問題。在這里我要對那些幫助我的人說一聲謝謝。

[1] 李英杰. 基于JAVA技術(shù)的網(wǎng)絡(luò)考試管理系統(tǒng)的研究與開發(fā)[D]. 上海: 同濟(jì)大學(xué),2007, (23):頁碼.

[2] 王添財. 基于Java EE的在線考試系統(tǒng)的設(shè)計與實現(xiàn)[D]. 廣東:華南理工大學(xué),2014.

[3] 劉毅. 人工智能在自動組卷建模中應(yīng)用研究[J]. 計算機(jī)仿真,2011.

[4] 郭琳. Java Web中錯誤異常的處理方法分析[J]. 電子技術(shù)與軟件工程,2015.

[5] 關(guān)海偉. Java Web的云存儲技術(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] 舒華峰. 自動組卷系統(tǒng)的設(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.


Java的實時規(guī)范

新語言、編程規(guī)程、操作系統(tǒng)和軟件工程技術(shù)有時對實時軟件開發(fā)人員具有相當(dāng)大的潛力。面向?qū)ο缶幊淌且粋€有希望的領(lǐng)域,但對實時社區(qū)來說,這是一個相當(dāng)新的領(lǐng)域。

例如,Java大量地從面向?qū)ο笾刑崛?,并且非常適合于對實時和嵌入式系統(tǒng)的擴(kuò)展,在Java社區(qū)過程中,Java專家小組(RTJEG)在1999年3月開始開發(fā)Java(RTSJ)1的實時規(guī)范。

RTJEG的目標(biāo)是提供一個平臺——Java執(zhí)行環(huán)境和應(yīng)用程序接口(API)——讓程序員正確地推斷出執(zhí)行軟件的時間行為。編寫實時系統(tǒng)應(yīng)用程序的程序員必須能夠在某些邏輯執(zhí)行的時候確定一個先驗,并在某個期限之前完成它的執(zhí)行。這種可預(yù)測性在許多實時系統(tǒng)應(yīng)用中很重要,例如飛機(jī)控制系統(tǒng)、軍事指揮和控制系統(tǒng)、工業(yè)自動化系統(tǒng)、交通和電話交換機(jī)。我們通過查看Java語言特異性和Java虛擬機(jī)規(guī)范來開始我們的工作。對于語言或運行時代碼的每個特性,我們詢問聲明的語義是否會讓程序員在執(zhí)行過程中,在執(zhí)行之前,讓程序員以合理的努力來決定,然后執(zhí)行該特性(或特性控制的特性)的時間行為。RTSJ提供了一個平臺,讓程序員能夠正確地推斷出執(zhí)行軟件的時間行為。Java專家小組的兩個實時成員解釋了RTSJ的特性以及規(guī)范設(shè)計背后的思想。Greg Bollella IBM的James Gosling Sun Microsystems公司整頓了三個特性——調(diào)度、內(nèi)存管理和同步——這并不允許這樣的決定。由國家科學(xué)技術(shù)研究院(NIST)主辦的研討會上定義的需求與其他行業(yè)組織的投入幫助我們確定了附加的特征和語義。我們決定將其中的四個附加特性包括:異步事件處理、異步控制傳輸、異步線程終止以及對物理內(nèi)存的訪問。

這些加上我們對Java和JVM規(guī)范的回顧,為RTSJ提供了七個主要區(qū)域。我們相信這七個領(lǐng)域提供了一個適合廣泛應(yīng)用的實時軟件開發(fā)平臺?!癛TSJ如何達(dá)到它的目標(biāo)?”邊欄給出了驅(qū)動RTSJ開發(fā)的需求和原則的更多背景?!癛TSJ時間表”邊欄列出了那些有興趣審查草案的人的重要里程碑和聯(lián)系。RTSJ在2000年2月完成了公共審查,但是Java社區(qū)過程要求我們在完成參考實現(xiàn)和測試套件之前不確定規(guī)范。隨著社區(qū)獲得RTSJ的經(jīng)驗,對規(guī)范的微小更改可能會發(fā)生。我們寫這篇文章的目的是為了深入了解RTSJ的設(shè)計理念——特別是NIST的需求和其他的目標(biāo)是如何影響它的——并說明這個重要的規(guī)范是如何適應(yīng)于為實時系統(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)先級的線程。但是,這樣的首選項并不能保證優(yōu)先級最高的線程始終運行,并且線程優(yōu)先級不能用于可靠地實現(xiàn)互斥。顯然,如果您正在編寫具有時間限制的軟件,那么您需要對線程執(zhí)行的順序有更強(qiáng)的語義聲明。定義這些語義的典型方法是通過確定如何選擇下一個線程執(zhí)行的算法。RTSJ指定了一個最小的調(diào)度算法,它必須在所有RTSJ實現(xiàn)中。至少,所有實現(xiàn)的最低要求必須提供一個固定優(yōu)先的優(yōu)先級調(diào)度程序,不少于28個獨特的優(yōu)先級?!肮潭▋?yōu)先級”意味著系統(tǒng)不改變線程優(yōu)先級(例如,通過老化)。有一個例外:系統(tǒng)可以將線程優(yōu)先級更改為執(zhí)行優(yōu)先級反轉(zhuǎn)規(guī)避算法的一部分(保留優(yōu)先級繼承)。如果沒有異常,線程可以更改自己或另一個線程的優(yōu)先級。

調(diào)度Java規(guī)范只提供了對調(diào)度的廣泛指導(dǎo):當(dāng)有處理資源的競爭時,具有更高優(yōu)先級的線程通常會優(yōu)先選擇較低優(yōu)先級的線程。然而,這樣的優(yōu)先級并不能保證最高優(yōu)先級的線程總是在運行,而線程優(yōu)先級不能用于可靠地實現(xiàn)互斥。顯然,如果您正在編寫帶有時間約束的軟件,那么您需要一個更強(qiáng)的語義語句來說明線程應(yīng)該執(zhí)行的順序。定義這些語義的典型方法是通過算法來決定如何選擇下一個線程來執(zhí)行。RTSJ指定最小調(diào)度算法,必須在所有RTSJ的實現(xiàn)。至少,所有的實現(xiàn)都必須提供一個固定優(yōu)先級的優(yōu)先級調(diào)度程序,它不少于28個唯一的優(yōu)先級。“幾個”意味著不改變系統(tǒng)線程優(yōu)先級(例如,通過老化)。有一個例外:系統(tǒng)可以改變線程優(yōu)先級的執(zhí)行優(yōu)先級反轉(zhuǎn)避免算法(保留優(yōu)先級繼承)。毫無例外,線程可以更改它們自己或其他線程的優(yōu)先級。

應(yīng)用程序必須將最小28個優(yōu)先級視為惟一;例如,它必須知道,如果具有更高優(yōu)先級的線程已經(jīng)準(zhǔn)備好,那么具有較低優(yōu)先級的線程將永遠(yuǎn)不會執(zhí)行。因此,您不能簡單地將28個優(yōu)先級映射為一個較小的數(shù)字,因為底層系統(tǒng)。但是,您可以在一個平臺上實現(xiàn)RTSJ提供少于28本地優(yōu)先級。然后,您就可以使用任何可用的方法來提供惟一性的外觀。為什么要有28個優(yōu)先事項?我們之所以選擇這個數(shù)字,是因為實時調(diào)度理論表明,您可以期望有32個優(yōu)先級的接近最優(yōu)的調(diào)度能力。5我們選擇離開四個優(yōu)先級為其他任務(wù),因為RTSJ可能只有一個系統(tǒng)的一部分,和一些系統(tǒng)只有32本地優(yōu)先級。當(dāng)然,您可以將調(diào)度算法添加到這個最低要求中。RTSJ提供了三個classes-Scheduler SchedulingParameters,ReleaseParameters-and這些封裝時間需求的子類。這些類綁定到可調(diào)度的對象(線程或事件處理程序)。所需的調(diào)度器,PriorityScheduler類的一個實例,使用這些參數(shù)中設(shè)定的值對象。

RTSJ線程創(chuàng)建定義RealtimeThread(RT)類來創(chuàng)建線程,居民調(diào)度程序執(zhí)行。RTs可以訪問堆上的對象,因此會因為垃圾收集而導(dǎo)致延遲。創(chuàng)建線程的另一種選擇是使用RT的子類,NoHeapRealtimeThread。nhrt不能訪問任何堆上的對象,這意味著它們可以運行垃圾收集器運行時從垃圾收集(從而避免延誤)。nhrt是適合代碼非常低公差的不定期的延遲。另一方面,RTs更適合于對較長時間延遲的更寬容的代碼。普通Java線程將為沒有時間限制的代碼進(jìn)行處理。內(nèi)存管理一直被認(rèn)為是垃圾收集內(nèi)存堆實時編程的一個障礙,因為垃圾收集器,引入了不可預(yù)測的延遲。我們希望RTSJ需要實時垃圾收集器的使用,但技術(shù)不夠先進(jìn)。相反,RTSJ擴(kuò)展內(nèi)存模型來支持內(nèi)存管理,不干擾實時代碼提供確定性行為的能力。這些擴(kuò)展讓你分配兩堆外的短期和長期存活的對象進(jìn)行垃圾回收。也有足夠的靈活性來使用熟悉的解決方案,例如預(yù)先分配的對象池。內(nèi)存區(qū)域RTSJ介紹內(nèi)存區(qū)域的概念——一個地區(qū)以外的內(nèi)存垃圾回收堆分配對象,您可以使用。內(nèi)存區(qū)域并不是通常意義上的垃圾收集。嚴(yán)格的對內(nèi)存區(qū)域的賦值規(guī)則可以防止您創(chuàng)建懸空指針,從而維護(hù)Java的指針安全性。在內(nèi)存區(qū)域中分配的對象可能包含對堆中的對象的引用。因此,垃圾收集器必須能夠掃描內(nèi)存堆中對象的引用的堆外保留堆垃圾收集的完整性。這種掃描與為堆構(gòu)建可達(dá)性圖不一樣。

收集器只是將堆對象的任何引用添加到它的指針集。因為nhrt可以搶占收藏家,他們不能訪問或修改任何指針到堆。RTSJ使用抽象類MemoryArea代表內(nèi)存區(qū)域。這個類有三個子類:物理內(nèi)存、不朽內(nèi)存和作用域內(nèi)存。物理內(nèi)存允許您在具有特定重要特征的內(nèi)存區(qū)域內(nèi)創(chuàng)建對象,例如附加在非易失性RAM中的內(nèi)存。不朽的記憶是一個特例。圖1顯示了使用不朽內(nèi)存的對象分配如何與使用Java堆的手動分配和自動分配進(jìn)行比較。傳統(tǒng)的編程語言使用手動配置的應(yīng)用程序邏輯決定了對象的導(dǎo)向的過程往往是耗時且容易出錯。一個不朽的內(nèi)存池和從它分配的所有對象都將一直存在,直到程序終止。在當(dāng)今的硬實時系統(tǒng)中,不朽的對象分配是常見的做法。有了作用域內(nèi)存,就不需要傳統(tǒng)的垃圾收集和隨之而來的延遲。RTSJ實現(xiàn)通過MemoryParameters字段或作用域內(nèi)存ScopedMemory.enter()方法。作用域內(nèi)存圖1c顯示了作用域內(nèi)存與不朽內(nèi)存和其他分配規(guī)程的比較。作用域內(nèi)存,在抽象類中實現(xiàn)ScopedMemory,允許您使用內(nèi)存區(qū)域分配和管理對象,或語法范圍,范圍內(nèi)分配的任何對象的生命周期。當(dāng)系統(tǒng)進(jìn)入一個語法范圍時,每次使用“new”都會導(dǎo)致系統(tǒng)從活動內(nèi)存區(qū)域分配內(nèi)存。當(dāng)范圍終止或系統(tǒng)離開時,系統(tǒng)通常會將內(nèi)存的引用計數(shù)降為0,破壞分配給內(nèi)部的任何對象,并調(diào)用它們的終結(jié)器。您也可以嵌套作用域。當(dāng)系統(tǒng)進(jìn)入一個嵌套的范圍時,它將從與新作用域相關(guān)聯(lián)的內(nèi)存中獲取所有后續(xù)的分配。當(dāng)它退出嵌套范圍時,系統(tǒng)將恢復(fù)先前的作用域,并再次從該范圍獲取所有后續(xù)的分配。兩個具體子類可用于實例化MemoryAreas:LTMemory(LT的線性時間)和VTMemory變量時間(VT)。在這種情況下,“time”指的是分配新對象的成本。LTMemory要求分配有一個時間成本的線性對象大小(忽略性能變化從硬件緩存或類似的優(yōu)化)。

當(dāng)您創(chuàng)建它時,您指定了LTMemory區(qū)域的大小,并且它的大小仍然是固定的。雖然VTMemory沒有這樣的時間限制,您可能想要強(qiáng)加一些限制無論如何變化分配成本降到最低。你建立VTMemory區(qū)域初始大小和指定一個最大尺寸它可以生長。你也可以選擇執(zhí)行實時垃圾收集在VTMemory地區(qū),盡管RTSJ不要求。如果你決定這樣做,您可以構(gòu)建VTMemory對象的垃圾收集對象指定一個特定于實現(xiàn)的垃圾收集機(jī)制。然而,如果你實現(xiàn)VTMemory,nhrt必須能夠使用它。因為,如圖1c所示,控制流控制在作用域內(nèi)存區(qū)域中分配的對象的生命,您必須限制對這些對象的引用。RTSJ使用受限制的組分配規(guī)則,防止長期對象引用對象作用域內(nèi)存,可能短住。虛擬機(jī)必須檢測非法的分配嘗試,并在發(fā)生時拋出一個適當(dāng)?shù)漠惓!TSJ實現(xiàn)在兩個不同的作用域內(nèi)存機(jī)制,持續(xù)互動:ScopedMemory.enter()方法和內(nèi)存區(qū)域的MemoryParameters領(lǐng)域。您在創(chuàng)建線程時指定任何一個。因此,幾個相關(guān)的線程可以共享一個內(nèi)存區(qū)域,并且該區(qū)域?qū)⒈3只顒訝顟B(tài),直到最后一個線程退出。這種靈活性意味著應(yīng)用程序可以從具有適合整個應(yīng)用程序或特定代碼區(qū)域的特征的內(nèi)存區(qū)域中分配新對象。同步的同步,RTSJ使用“優(yōu)先級”比傳統(tǒng)的更松散實時文學(xué)?!白罡邇?yōu)先級的線程”只是表示最合格的線程調(diào)度程序會選擇從所有的線程可以運行。它不一定認(rèn)為嚴(yán)格的基于優(yōu)先級的調(diào)度機(jī)制。等待隊列系統(tǒng)必須排隊等待以優(yōu)先順序獲取資源的所有線程。

這些資源包括處理器和同步塊。如果活動調(diào)度策略允許具有相同優(yōu)先級的線程,那么線程將首先在隊列中排隊。具體來說,系統(tǒng)圖1。不朽和作用域內(nèi)存與其他確定對象生命的方法是不同的。(一)Java堆使用自動分配,可見性決定了對象的生活(如果沒有對象的引用,該系統(tǒng)可以釋放)。然而,自動分配需要一個垃圾收集器,這會導(dǎo)致延遲。(b)在使用RTSJ不朽內(nèi)存分配,對象的生命結(jié)束只有當(dāng)Java虛擬機(jī)(JVM)終止。(c)RTSJ作用域內(nèi)存的使用語法范圍,一種特殊類型的內(nèi)存區(qū)域外的垃圾收集堆允許您管理對象定義良好的一生。當(dāng)控制到達(dá)邏輯的某個點時,系統(tǒng)會破壞其中的任何對象,并調(diào)用它們的終結(jié)器。

為了避免優(yōu)先級反轉(zhuǎn),同步原語的實現(xiàn)必須有一個默認(rèn)的行為,以確保沒有無限的優(yōu)先級反轉(zhuǎn)。這適用于普通Java代碼如果它運行在整個RTSJ實現(xiàn)以及實時線程。優(yōu)先級繼承protocol-a知名實時調(diào)度algorithm6-must默認(rèn)實現(xiàn)。該規(guī)范還提供了一種機(jī)制,您可以覆蓋默認(rèn)的系統(tǒng)范圍策略,或控制用于特定監(jiān)視器的策略,只要實現(xiàn)支持該策略。monitor控制策略的規(guī)范是可擴(kuò)展的,因此未來的實現(xiàn)可以添加機(jī)制。第二種策略,優(yōu)先級上限仿真(或最高存儲),也為支持它的系統(tǒng)指定。6決定論符合實現(xiàn)必須提供一個固定的上限為應(yīng)用程序代碼所需的時間進(jìn)入一個同步塊解鎖監(jiān)控。共享和線程間的通信實現(xiàn)人員最有可能使用普通Java線程的組合,RTs,nhrt。RTSJ允許鎖定不同線程之間types-even最有爭議的情況下,在常規(guī)線程和nhrt。

如果NHRT試圖鎖定一個RT或常規(guī)線程已經(jīng)鎖定的對象,那么優(yōu)先級繼承就會正常。有一個問題:non-NHRT有其優(yōu)先級提高不能執(zhí)行垃圾回收器執(zhí)行。因此,如果一個垃圾收集正在進(jìn)行中,那么這個被提升的線程將被掛起,直到收集完成。這當(dāng)然會導(dǎo)致NHRT因為收集而延遲。為了解決這個問題,RTSJ提供機(jī)制,允許nhrt通信(同步)的一種形式與RTs和普通Java線程,同時避免在nhrt garbage-collector-induced延遲。RTSJ提供隊列類nhrt和普通Java線程之間的通信。圖2顯示了一個無等待寫隊列,這是單向從實時、非實時。nhrt通常使用寫(實時)操作;常規(guī)線程通常使用讀操作。寫端阻塞(任何試圖立即寫信給一個完整的隊列返回“false”)和同步(如果多個NHRT可以寫,他們必須同步),所以從垃圾收集NHRT不會造成延誤。讀操作,另一方面,阻塞(它會等待,直到有數(shù)據(jù)隊列)和同步(它允許多個讀者)。當(dāng)一個NHRT普通Java線程發(fā)送數(shù)據(jù),它使用無等待隊列操作,和常規(guī)的線程使用一個同步操作出列。一個讀隊列,它是單向的,從非實時到實時的,以相反的方式工作。因為寫無等待,動力學(xué)是不相容的,數(shù)據(jù)可能會丟失。為了避免在分配內(nèi)存元素時出現(xiàn)延遲,類構(gòu)造函數(shù)靜態(tài)地分配用于隊列元素的所有內(nèi)存,從而使隊列具有有限的限制。如果常規(guī)線程沒有以足夠高的速率從隊列中刪除元素,那么隊列可能會滿。


網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計與實現(xiàn)(論文+PPT+源碼)的評論 (共 條)

分享到微博請遵守國家法律
龙川县| 武鸣县| 启东市| 万荣县| 宣威市| 繁昌县| 汉寿县| 太仆寺旗| 赤城县| 鸡泽县| 环江| 义乌市| 旌德县| 利津县| 噶尔县| 东阿县| 磐安县| 平阴县| 兰考县| 克什克腾旗| 云南省| 武冈市| 满洲里市| 昌都县| 永兴县| 奉化市| 武平县| 仙游县| 柳河县| 保山市| 喀喇沁旗| 叙永县| 澎湖县| 泰宁县| 香河县| 卢氏县| 弥渡县| 凉山| 五大连池市| 长武县| 阿巴嘎旗|