admin 管理员组

文章数量: 1087139


2024年3月7日发(作者:vb程序填空题及答案)

基于Java的在线测试系统的设计与实现韩冰,李桂香(浙江同济科技职业技术学院,浙江杭州311231)摘

要:在线测试系统的开发与实现,具有很重要的现实意义。教考分离以及考务工作的全自动化管理可以被实现,校

园网的软硬件资源可以有效地被利用。针对实际需要,基于Java和MySQL的基础上设计的在线测试系统,能更好的为学校的教

科研和管理服务,大规模考试可以得到实现和推广。关键词:在线测试;教考分离;全自动化中图分类号:TP311.1

文献标识码:A

文章编号:1672-0164

(2021)

02-0055-07加载用户功能实现、修改个人信息功能的实现、考试逻辑

1引言在线测试系统的产生是教育信息化的趋势。充分利用

与代码查阅功能实现、加载试题功能的实现、组卷和展示

部分的实现、上下题及定时器的实现、成绩的计算功能的

实现。学校现有的计算机软、硬件和网络资源实现无纸化考试,

与传统考试方式相比,在线测试渗入了更多的技术环节,

3在线测试系统的系统设计系统设计是在可行性研究及需求分析的基础上展开的

一系列概要设计和顶层规划。根据需求分析而得出的报告

对实现安全性的途径、方法也提出了更高的技术要求。利用JDK开发工具,开发了一个在线测试系统。系统

的主要功能是试题的录入、查询、浏览、修改、删除、出

题、组卷、学生成绩的导出等。其最大的特点是方便和灵

活。通过用户名和密码登录到系统的主界面,可以进行试

或结果测。3.1核心类的设计(1)

用户类一题的录入、删除、修改和查询,也可以进行试卷生成。利

用试题导入导出的功能,可以将固定格式的题目导入到题

在当前包中新建User类,按照实际需求定义五个私有

的成员变量,id、name、pwd、tel、email0依次表示:用

户ID、姓名、密码电话号码、邮箱。库中。管理员登陆到系统,可以对用户系统进行管理。2在线测试系统的需求分析需求分析所做的调查与分析是发生在系统设计之前以

及设计、开发过程中针对用户的需求所展开的,是系统设

然后定义公有化的getter和setter方法获取和设置变量

的值。用来获取用户对象的相关信息。对于用户类一的设计,本文在当前包中新建

User类,按照实际需求定义五个私有的成员变量,迅、

计、系统完善和系统维护的重要依据%name、pwd、tel、email□依次表示:用户ID、姓名、密

码、电话号码、邮箱。然后定义公有化的getter和setter方

在线测试系统应该实现下列功能:从界面设计来说,主要包括:欢迎界面的设计、登陆

法获取和设置变量的值。用来获取用户对象的相关信息。(2)

题目类—Question.]ava界面的设计、主界面设计、考试规则界面设计、考试界面设计。在当前包中新建Question类,表示试题的实体类。

从功能模块来说,主要包括:读取配置文件实现、Question类的一•个对象代表题库中的一•题。包括题干和四

个选项及正确答案。然后,在service中,通过loadquestionO

基金顶目:2020年度浙江省水利厅科技计划项目,编号RC2033;

方法把所有题目都导进来。对于题目类一的设计,本文在当前包中

省属高校基本科研业务费资助顶目,编号FRF20QN004

新建Question类,表示试题的实体类。Question类的一个

通信与信息技术2021年第2期(总第250期)|

55

2021

/

03

|

解决方案

I

Communication

&

Information Technology对象代表题库中的一题。包括题干和四个选项及正确答

案。然后,在service中,通过loadquestionO方法把所有题

目都导进来。(3)

题目信息类一当前包中新建Questioninfo类。当用户组卷后,一个

Questioninfo对象包含一个question对象、用户所做的答

案、试题的序号。对于题目信息类一的设计,本文当前

包中新建Questioninfo类。当用户组卷后,一■个Questioninfo

对象包含一个question对象、用户所做的答案、试题的

序号。(4) 用户格式的设计用户信息文件存在于一个中。使用纯文本的方

式来存放用户信息,每个用户的信息占用一行,各个字段

之间使用英文半角的冒号来进行分隔。本例中的用户信息

中,每个用户的信息包含五个字段,分别是:用户ID,姓

名,密码,手机号码和电子邮件。3.2相关信息格式设计(1)用户格式的设计用户信息文件存在于一个中。使用纯文本的方

式来存放用户信息,每个用户的信息占用一行,各个字段

之间使用英文半角的冒号来进行分隔。本例中的用户信息

中,每个用户的信息包含五个字段,分别是:用户ID,姓

名,密码,手机号码和电子邮件。其所包含属性具体如表1所示。*1用户属性表属性描述ED用户的IDname用户名pwd密码tel手机号码etnl邮箱(2)题库信息格式的设计题库是在线测试系统的基础。一个测试系统的题库应

能容纳足够数量的题目,这些题目在题库中的组织、分类

及其特征信息的确立与描述将直接影响系统的工作效率与

效果。题库中的题目都是按照测验目标精心筛选和校准的,

每一题目除了试题本身的内容外,还要具有答案。为了能

够进行计算机判卷,试题必须是标准化的,比如选择题、

判断题、填空题等,且允许用户在试题库中添加、修改、

删除试题。在此在线测试系统中,试题是存储在的文

本文件中:其中第1行以字符"@”开头,以英文逗号隔56开的三项对应分别存放题目答案、分数和难度级别。其余

部分为题干。其所包含属性具体如表2所示。表2题库属性表属性描述@answer正确答案的题号Score分数Level难度级别其他题干图1截取了corejava-txt中的部分内容,这一段信息代表

一个题目。每一项所代表的信息如下面箭头指向所示。其

中"@answer=l"为正确答案的题号为第一项。"score"

为分数。"level**为难度级别。共1-10,十个难度级别。正确答集跑题号

分数

难度级别@answer=l,score=5,level=lt

t

t

-下列属于不合法Java标识符的是〈)。_mem题干"12aMl

2・$12图1题库信息图33基本的数据结构设计在任何一个系统中前端调用数据和更新数据都需要数

据库支持,所以数据结构的设计是不可或缺的。只有数据

结构的设计完整了,系统所要完成的功能才能够实现%(1)用户存储数据结构用户信息的存储是以哈希表形式存储的。在哈希结构

的<key,value〉键值对中,key代表用户的ID。即:下图中

的l-n,n个用户。Value代表User对象。也就是,一个用户除ID外的其他

属性。包括:用户名、密码、手机号、邮箱。貝卩:图2中

用户ID1用户ID2用户ID3用户IDn图2用户借息存储结构图

的User对象1—User对象n。(2)题库存储数据结构在当前工程中定义了几个全局变量,就可以随时再次访问

这些窗体了,这样就能很方便地实现窗体之间的前进、返

回等操作了。题库信息的存储同样是以哈希表形式存储的。在哈希

结构的<key,value〉键值对中,key代表题库的难度等级

levelo共1-10,十个难度等级即图3中的levell-levellOoValue代表由同一难度级别的所有题目,它们组成了

public

class

FrameTool

{public

static

ExamFrameexamFrame;public

static

MenuFramemenuFrame;public

static

XLoginFramexLoginFrame;

public

static

RuleFrameruleFrame;一个链表。同一难度等级下,有多少道题目,就会有多少

个节点,即图3中的levell试题1-levell试题n。}4核心功能实现4.1登陆主界面的设计在线测试系统用户登陆界面设置"开始”"考试成

绩”"考试规则”"信息修改”等选项。4.3定义考试规则按钮侦听针对考试系统主界面进行对应修改,增加考试规则事

件侦听。代码如下所示。增加考试规则事件侦听。

iotiListeiier(new

ActionListenerO

{4.2新建保存信息的文件框架前面设计了考试系统分成登陆主界面、考试界面考试

@Overtidepublic

void

actionPerfbrmed(ActionEvent e)

{tty

{规则界面等多个界面。已经完成了考试系统登录主界面的

部分,如果依次使用这些界面,可以依次实例化它们,并

通过setVisible。方法来设置它们的显示和隐藏。但是如果

ame

=

new

RuleFrameQ;am,ible(true);

ible(£alse);要返回上一个界面,重新实例化一个窗体显然是不行的,

因为重新实例化的窗体不再是曾经使用过的那个界面。如

果要想返回上一个界面,就需要把实例化窗体的代码写在

}

catch

(IOException

el)

{//

TODO

Auto-generated

catch

block窗体类的作用域之外,并且,同一个用户(考生)登录进

el

.printStackTraceO;入系统之后,他所打开的每一个窗口都应该是和他有关

的,也就是说,这些窗体之间是互相关联的。}}});此时新建一个FrameTool类,将每一个界面类的一个

实例化的对象作为该类的静态成员属性,这样,就相当于

->

Levell

试题]讣―Levell试题2难度levell

13^……"3^……....Levell

试题n难度level2

->

Levd2

试题

1

十―

Level2

试题2Level2

试题n难度level3

->

Level3

试题]十―Level3试题2Levd3试题nA难度levd.4

->

Level4

试题]

十―

Level4

试题2"3^……"3^…….....Levd4试题n难度level5

->|

Level5

试题1十— Leveb试题2R……Leveb试题n难度levd.6

->

Level6

试题]

十―

Level6

试题2Levd6试题n难度levd.7

->

Level7

试题1十二Level7试题2Levd7试题n难度level8

->

Level8

试题]十—

Level8试题2"3^....."3^……讣―

.......Level8

试题nLevd9试题nLevdlO

试题ti难度levd.9

难度

levell0->

Level9

试题]

十―

Level9

试题2■>

Levell0

试题1

十―

Lev^O

试题2

图3题库信息存储结构图通信与信息技术2021年第2期(总第250期)|

57

2021

/

03

|

解决方案

I

Communication

&

Information Technology4.4修改个人信息功能的实现考生如果修改个人信息。必定在考试系统主界面中,

定义事件侦听。当考生点击按钮后,由事件侦听触发,打

开修改个人信息的界面,同时在该显示界面中包含修改按

钮,返回按钮。显示修改个人信息界面的同时,要隐藏系统主界面,

就意味着要将考生登录系统后的信息,保存,隐藏不显

示。当从修改个人信息返回时,复显考试系统主界面。修改个人信息界面中可以自行修改的内容包括:姓

名、密码、电话、邮箱。考号这个部分是不允许修改的。

修改姓名的JLabel中,姓名的内容来源于登陆用户1。與User.

getName。方祛。密码、电话、邮箱等JLabel代码类似。4.5考试逻辑与代码查阅功能实现从clientproperties中取来姓名、编号、考试时间等信

息。涉及到组卷、倒计时等功能、examService接口被实例

化。具体实现代码如下:public

Examlnfb

start。{if

(finished)

{throw

new

RuntimeExceptioii("考试已经结束'*);}〃组卷creatPaperQ;stionCount(。;

eLimt(eLimitO);

le(entityContextgefntleO);r(logifiUsei);return

examlnfb;}在这段代码中,分别经历了创建考卷、创建考试信

息对象、初始化考试信息对象、返回考试信息对象几个

过程。4.6加载试题功能的实现4.6.1试题文件的结构试题文件存放在文本文件中,该文件存放

位置在工程根目录下。在Eclipse中可以直接打开文本文档

查看内容,如果显示乱码,可以在文件图标的右键菜单中

选择"Properties”打开文件的属性对话框,设置文件的字

符编码(Text

file

encoding)为

*"Other:

,在Other后面

的文本框中输入"GBK”,即可正常显示中文字符。试题文件中存放着试题库,每个题目在文件中使用

6行存放:其中第1行以字符“@”开头,以英文逗号隔

开的三个键值对分别存放题目答案、分数和难度级别,

例如answer=l表示答案为四个中的第一个,score=5表示

此题分值5分,level"表示难度级别为1级(共有10级);

第2行是题目描述,即题干;第3、4、5、6行分别是四个

58备选答案。4.6.2保存试题和考生答案的Questioninfo类Question类中只存放了试题,若要将其展示在考试界

面,则需要给每个题目分配一个题号,如第1题、第2题

等。另外,还需要把考生回答问题的答案保存下来。在

此,新建一个类Questioninfo,把题目类Question的一个对

象作为其成员变量;然后定义一个int型的成员变量

questionindex用来存放题号,要注意的是这个题号是和其

对应的题目绑定的,一旦生成试卷之后,各题目的顺序不

再发生变化;然后定义一个列表型变量userAnswers用来存

放考生答题的答案,因为有多选题,答案可能不止一个,

所以定义成列表型。同时,为了实现该类的数据存储和传输,在定义类的

时候实现了Serializable接口。代码如下所示:

package exam_test;import

izable;

//导入支持包import

ist;

import

;public

class

Questionlnfb

implements

Serializable

{//定义Questionlnfo类并实现Serializable接口使其序列化

private

Question

question;//定义Question类型的变量,用于存放一道题目private

intquestionltidex;〃定义整型变量存放题目在试卷中的题号(第X题)

private List

user

Answers

二new

ArrayList

0;〃定义列表结构存放考生所回答的答案public

QuestionlnfbO

{〃定义无参的构造方法}public

Questionlnfb(tntquestionlndex,

Question

question)

{〃定义有参的构造方法初始化对象on

= question;

onlndex

= questionlndex;}public

Questionlnfo(intquestionlndex,Question

question, ListuserAnswers)

{〃重载有参的构造方法初始化对象

superO;on

= question;swers

=

userAnswers;

onlndex

= questionindex;}//实现Questionlnfb类成员属性的gettei和settet方法可自

动生成,此处省略

〃重写Object类的toSttiiigO方法返回该题目的输出形态

public

String

toStringO

{return

(questionindex

+

1)

+

+

ngO;}

}4.7读取试题文件并转存到试题库M即结构目前已经准备好了存放试题的类Question,存放试

题、题号和答案的类Questioninfo,以及试题库在内存中的

存储结构Map。接下来,在综合业务逻辑Service类中,增加

一些代码,用输入流的方式来读取试题文件corejavNtxt,并

将读取到的数据依次写入到一个个的Question对象中生成

一道道的试题,再把这些试题按照难度为键,放到试题库

Map的值链表中去,每一个"难度"和"此难度的试题链

表”作为一个键值对存放在试题库Map中。以上功能通过

定义不同的方法来实现。在Service类中增加读取试题文件

并转存到试题库Map的代码,核心代码如下所示。

public

dass

Service

{

//定义业务逻辑实现类//……前文中已实现的定义成员属性的代码省略……

public

static

Map

ArrayList>

questionMap —new

HashMap

AtrayList>

0;//定义_々HashMap集合来存放试题库,使用泛型指

定存放的数据类型public

static

ArrayList

paper

new

ArrayList

0;//定义一个ArrayLis瞎放试卷上的试题//……前文中已实现的定义成员方法的代码省略……

public

void loadQuestionsO

{

//定义加载试题库的方法

MyProperties

my

=

new

MyPropertiesO;

〃读取配置

信息try

{

〃异常处理BufferedReader

in

new

BufferedReader(new

InputS

treamReader(new

FilelnputStream

(stionFilePathO),

"gbk"));〃通过多层包装输入流将文件读取方式转换为按

行读入String

stt;

〃定义字符串型临时变量

while

((str

neO)

!二

null)

{〃定义循环直至文件结尾

〃去除字符串两端的空格

if(C")

|

|

With("#"))

{〃判断是否为空行或注释行,是则跳转到

下一行continue;}Question

question

=

patseQuestion(〃调用生成试题的方法,参数为一行

试题信息和接下来的五行信息〃试题文件中接下来的五行分别是题

干和四个选项str,

ne(),

ne(),

ne(),

ne(),

neO);addQuestion(question);

〃调用方法把该题目

加入到题目列表中去}}

catch

(Exception

e)

{//异常处理tackTraceO;}}private

void

addQuestion(Question

question)

{〃定义方法实现把题目加入同难度的题目列表

ArrayIistquestionLists

(elO);〃定义题目列表变量指向试题库Map中该题目的

难度所对应的题目列表if

(questionLists

==

null)

{//判断列表是否存在,若不存在则读取题目

难度,以难度为键新建题目列表questionLists

new

ArrayList

0;

(elQ,

questionLists);}(question);

//将题目加入列表}private

Question

parseQuestion(String

str,

String

tide,

String

opl,

String

op2,

String

op3,

String

op4)

{

〃定义生成试题的方法将读取到的试题文件中的

六行字符串放入Question类的对象StringO

data

(n

[@,]

[a-z]

+=n);〃调用字符串的split方法使用正则表达式将字符

串分割,得到几个值存放在数组中Question q

=

new QuestionO;

//定义Question类的变

量/**接下来调用QuesHon类的封装方法设置各成员变

量的值通信与信息技术2021年第2期(总第250期)|

59

2021

/ 03

|

解决方案

I

Communication

&

Information

Technology*/«/”分割并存放到数组中

wers(pafseA£iswet(data[l]));

//设置答案

re(tit(data[2]));

/

/设置分数

el(nt(data[3]));

/

/

设詈难度

e(title);

//设置题干

for

(String

s

:

data)

{//将数组中的元素依次加入到临时答案列表

中listadd(lnte^nt(s^);}

List

options

= new

ArrayList0;

〃定义选项列表(opl);//设置第一个选项(选项A)

(op2);

〃^3第二4^项(选项B)

(op3);

〃设置第三个选项(选项C)

(op4);

〃设置第四个选项(选项D)

return

list;//返回答案列表}

}4.8组卷和试题展示4.8.1组卷功能实现组卷部分是在线测试系统的核心功能模块。组卷离不

开题库,如何将题目从数据库或者题库数据文件中调出来

ons(options);

//®S^项列表

e(()

==

1

?形成一套试题,是组卷需要实现的内容。我们事先将题目

_SELECT[ON

:

QuestionJMULTl_SELECnON);〃使用三目运算符“?:”来设置题目的类型是

单选还是多选存储在数据文件中,题库中的题目由三部分组成:题目属

性、题干和选项。其中题目属性包含三个元素:answer、

score、levelo

Answer代表答案、score代表分数,level^示

出题的难度。每一道题目以@符号为开始,第一行为题目

tetutn

q;

〃返回Question类的对象属性的答案,分数,难度;第二行为题干;接下来是四个

选项。系统中保存题库的文件名为corejavaJxt,以记事本

}private

ListparseAiiswer(String

案列表List

list

=

new

ArrayList0;

{的类型存放的如图4所示。〃定义方法根据试题文件中的答案字符串生成答

@answer=1,score=5,leuel=1下列属于不合法Jaua标识符的是()。mem

12a

M12

$12图5单题结构图//定义懣为整型的列表临时变量存放答案

Stringl]

data

:

("/*');〃调用split。方法将参数传入的字符串以字符文侔緒氏©

仃❺opUan^Mcr-l escor*-5

・■

vl

•:T列厲于不合社•标识袴的理().nrnH12$12op

«ra(x)"4x«

・•

.“oy9魏据淡!HIM.

5"和double所占用内存字书数分刖是•

»»>««<下列不厲于山"运尊笛的是()•札壇.()•escore"5

j;辭臟『分配JU啲

内存大木.目勤版木JU就诃

•的方式运行J”

•字节耐.(Jan&vrr-3

score-5TfiXorifi句•存在编译伟逞的是()•

for(int

!-•;

1

<

forfftnt

1 -

j-•:

;!♦♦.!♦♦)<>

For(int

1 -

a;

1

<

i«)<>.

score«5

.,©uc»l・5下列数组声明语句中.错泯的規・()•

int(

]

nrv

int(

)0;int(]

^rr

new

lnt();int()

<>;图4趣文件60

组卷的流程如图6所示:〃组卷©•数据•文件0图6组卷流程图examInfb=xamO;examlnfbl

.setText^ngO);

cutrentQuestionInfb=(0);

釁updateView(cuffentQuestionlnfb);

//更新显示题目

〃更新按钮/题号7时间updateCountO;组卷的原理是读取题目数据文件,将文件

updateBtnQ;中的所有的题目全都读出来,然后将题目放入列表

startTimerO;}questionLists中。questionLists中的题目根据题目的难度

level属性进行分类,将相同属性的level题目放在一起,形

成链式结构。其中questionLists用到AcrayUst。Arraylist

是一个数组

}经过组卷后将第一题在考试界面中显示出来,更将计

数器,操作按钮做了初始化,这样就能完成第一题的试题

队列,相当于动态数组。与Java中的数组相比,它的容量

展示了。考试要想迸行下去,就需要做上一题和下一题的

能动态增长。它继承于AbstractiUst,实现了

List»

RandomAccess,

Goneable,

zable这些接口《

展示,同时要需要实现考试时间的控制即定时器人AtrayLis傩承了AbsttactList,实现了List。它是一个数组队

列,提供了相关的添加、删除、修改、遍历等功能。

Arraylist实现了RandmoAccess接口,即提供了随机访问功

參考文献⑴刘瑾,詹玲超.基于J2EE的网络考试系统的设

计与实现[J].电脑知识与披术,2016(4):6-7.能。RandmoAccess是java中用来被List实现,为Lis喘供快

速访问功能的。在ArrayList中,可以通过元素的序号快速

获取元素对象;这就是快速随机访问。ArrayDst实现了

Cloneable接口,即覆盖了函数clone。,能被克隆。4.8.2试题展示[2]

黑马程序员.Java基础入门[M].北京:清华大

学出版社,2018:56.[3]

王铉博,贾志淳.基于Java技术平台的办公管

本文通过对试题文件的读藤得了试题,并通过删

理系统设计与实现[J].信息技术与信息牝,2016

(07):

4-5.规则组卷得到了试题集。如何将这些通过组卷得到的试题

集,显示到我们系统的操作界面中,是本节我们重点介绍

[4] 徐绕山.Java

Web应用开发模式研究[J].信息

化研究,2012,38(3):1-2.的内容。在用户登录之后,试题已经加载,组卷成功之后,开

始考试后要将试题显示出来,需要先把试卷的第一题取出

来,显示到题目显示控件中。具体操作如实例下所示。

作者简介韩冰(1984-),女,硕士,讲师,主要研究方

向:web挖掘、无线传感黠。pubEc

ExamFfameO

{if(isFinish)

{}eke {李桂香(1976-)女,硕士,副教授,主要研究

方向:信息安全。initO;(上接第28贡)思考探究[J].数字通信世界,2020(10):

166-167.参考文献[4]闰冬,张僉.基于5G通信技术与广电光纤网络融

合发展分析[J].信息记录材料,2020,21

(10):

206-207.[1]

华勇.5G移动通信对广播电视的影响及对策

[J].数字通信世界,2021

(01):

161-162.[2]

罗梦字.浅谈广播电视如何借力5G技术[J].西

部广播电视,2020,41(19):

238-240.作者简介姚卫东(1976-),男,硕士,一级建造师,通

信工程师,主要研究方向:通信建设维护。[3]张慕凡.关于5G在未来广播电视技术中应用的通信与信息技术2021年第2期(总第25豳)|

61


本文标签: 题目 实现 系统 试题 用户