java考试系统.docx
《java考试系统.docx》由会员分享,可在线阅读,更多相关《java考试系统.docx(28页珍藏版)》请在冰点文库上搜索。
![java考试系统.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/cde500a2-7329-4d4e-baba-cbfbee0f0a1d/cde500a2-7329-4d4e-baba-cbfbee0f0a1d1.gif)
java考试系统
1目标
使用JAVA开发一个在线评测系统。
该系统主要包括:
用户登录、菜单选择、开始考试、分数统计四个功能模块。
2软件开发环境与技术简介
2.1技术简介
本系统使用JAVASWING技术,事件处理机制,文件流和泛型集合进行测评系统的设计,开发和功能实现,并综合运用多线程和网络编程技术。
2.2工具简介
MyEclipse是一个十分优秀的用于开发Java,J2EE的Eclipse插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。
MyEclipse目前支持JavaServlet,AJAX,JSP,JSF,Struts,Spring,Hibernate,EJB3,JDBC数据库链接工具等多项功能。
可以说MyEclipse几乎囊括了目前所有主流开源产品的专属eclipse开发工具。
2.3开发环境
1.操作系统:
MicrosoftWindowsXP或MicrosoftWindowsNTService/Workstation4.0或更高版本。
2.内存:
64MB内存以上。
3系统需求分析
3.1系统需求分析
系统的对象确定之后,应该对系统进行定性的分析,分析是为了了解系统应达到的目标和系统应具备的功能。
房地产销售管理系统由四大模块组成:
用户登录模块、通告信息菜单选择模块、考试功能模块以及分数统计模块。
3.1.1用户登录功模块
获取登录信息:
获取客户端输入用户ID和用户密码pwd。
登录响应:
根据登录校验的结果,显示相应的界面;若登录不成功,只在当前页面显示错误提示,若登录成功,关闭当前界面,显示菜单界面。
3.1.2菜单选择模块
更新用户信息:
将登录成功的用户信息显示到当前界面。
开始考试:
点击“开始”,关闭当前界面,显示考试界面。
查看分数:
点击“分数”,若还未开始,提示“考试未开启”,若已完成考试,显示分数结果。
查看考试规则:
点击“考试规则”,显示考试规则面板。
退出考试系统:
点击“离开”,退出系统。
3.1.3考试功能模块
装载用户信息:
现在用户身份、考试科目等相关信息。
装载题目信息:
将题目信息显示到面板上。
答题:
选择当前题目答案,并自动保存该答案数据到内存中。
上下翻题:
点击“上一题”“下一图”,可随意翻阅题目信息。
考试倒计时:
考试开始后,面板显示考试时间倒计时,时长为20分钟。
交卷保存答案:
点击“交卷”确认后,考试结束,保存当前试卷相关数据,关闭当前界面,显示菜单选择界面。
3.1.4分数统计模块
统计分数:
将答题结果与标准答案比对,计算分数。
分数显示:
查看分数或者交卷时,将计算出的分数显示到当前面板中。
4系统总体设计
4.1系统功能简介
该系统是一个简单的本地考试程序,可以实现用户的登录,抽取题库中内容,计算考试分数等功能。
具体的功能描述:
(1)用户利用默认的账号进行登录;
(2)登录成功后可以进行操作的选择;
(3)选择开始考试后,系统抽取题库中的内容,然后进行测试;
(4)提交试卷后可以显示分数;
(5)退出后可以查看考试结果。
4.2系统功能模块规划
提示用户信息
图4-1系统功能模块
5系统详细设计
5.1界面设计
5.1.1登录界面
登录界面采用borderlayout布局,分为北、中、南,北部添加一个标签,中部为用户信息录入的部分,南部利用flowlayout添加两个按钮。
具体代码设计:
1创建类LoginFrame继承于JFrame,登录窗口是一种具体的窗口
(1)创建供构造器,在构造器中调用init()方法
(2)init()方法用来初始化全部界面组件即是画界面
(3)添加centerFrame()用来居中界面
(4)创建LoginFrameTest用来为LoginFrame进行单元测试
2完成界面初始化代码
(1)创建方法createContentPane()用来初始化内容面板
(2)创建方法createBtnPane()初始化按钮面板
(3)创建方法createNamePwdPane()用来初始化输入框
登陆界面完成后如图所示:
图5-1登陆界面
5.1.2选择界面
选择界面采用borderlayout布局,北部添加图片,中部利用flowlayout添加4个选择按钮,南部添加一个标签。
具体代码设计:
1创建类MenuFrame继承于JFrame
(1)创建构造器构造器中调用init()方法
(2)init()方法用来初始化全部界面组件即是画界面
(3)添加centerFrame()用来居中界面
(4)创建MenuFrameTest用来为MenuFrame进行单元测试
2完成界面初始化代码
(1)创建方法createContentPane()用来初始化内容面板
(2)创建方法createCenterPane(),用来初始化中部面板
(3)创建方法createImageLabel(),用来初始化北部图片
选择界面完成后如图所示:
图5-2选择界面
5.1.3考试界面
考试界面同选择界面,北部添加图片,中部添加文本域,南部添加按钮和标签,具体代码设计:
1创建类ExamFrame继承于JFrame
(1)创建构造器构造器中调用init()方法
(2)init()方法用来初始化全部界面组件即是画界面
(3)添加centerFrame()用来居中界面
(4)创建ExamFrameTest用来为ExamFrame进行单元测试
2完成界面初始化代码
(1)创建方法createContentPane()用来初始化内容面板
(2)创建方法createCenterPane()用来初始化中部面板
(3)创建方法createBottomPane()用来初始化底部面板
考试界面完成后如图所示:
图5-3考试界面
5.2后台服务
后台服务包括用户登陆信息的验证、抽取试卷以及评价分数等。
首先创建ExamService.java类,用于编写考试相关的服务方法,其中核心的业务方法login(id,pwd)用于验证用户登陆。
然后设计了User类,代表软件中用户实体,用于获得和设置用户的信息,包括用户编号、用户姓名、用户密码、电话以及邮件。
最后定义类ClientContext代表客户端的控制器,用来处理用户界面请求,处理界面逻辑,根据用户的请求,访问业务对象(ExamService),根据业务对象的返回结果。
处理界面的转发及响应!
由于ClientContext依赖于ExamService采用构造器依赖方式。
通过构造器注入了ExamService实例。
由于控制器需要控制界面的转发和响应,所以为控制器增加了对LoginFrame的引用界面实例采用属性方式注入。
定义控制器处理界面响应的方法login()根据登录结果处理界面响应,定义了系统退出的方法,定义了软件界面的现实方法show()。
5.3数据处理
数据处理,包括提取用户信息、抽取试卷、保存用户答案等。
首先,为ExamService增加属性Listpaper代表考卷。
创建一个createPaper方法用来创建试卷,创建试卷时要求随机组卷,每个level选2道试题,一共20道题。
然后,在user实体中添加set和get方法,用于获取和设置用户的信息。
最后,实现交卷处理即保存用户的答案和评定分数。
更新ExamFrame增加按钮事件绑定,绑定交卷按钮,为ClientContext增加交卷功能先提交当前题的答案,然后将交卷工作委托给service完成。
service处理交卷业务,完成判分处理.。
5.4部分功能的实现
1增加欢迎信息
(1)将欢迎信息实例注入到ClientContext中;
(2)ClientContext中将闪屏显示1秒种以后关闭。
2实现显示登录用户信息
(1)更新控制器ClientContext中登录的方法,增加登录以后更新"菜单界面"(updateView());
(2)在ClientContext声明一个变量user保持当前登录用户的信息;
(3)实现菜单界面的updateView()方法。
3查看分数
(1)更新menuFrame界面增加实际绑定;
(2)ClientContext增加功能相应方法;
(3)软件业务层增加查询分数方法。
4增加切换试题功能
(1)更新ExamFrame增加按钮事件绑定;
(2)为ClientContext增加<<前一个,后一个>>方法;
(3)在服务方法方法添加sendUserAnswers()发送答案方法。
5显示考试规则
(1)新建一个rule类;
(2)创建一个面板包含一个文本域和一个关闭按钮;
(3)在文本域中添加考试规则,实现关闭按钮。
6测试与运行
6.1运行环境
在做系统的维护和测试时,首先必须要了解的是系统运行环境,该系统为Myeclipse8.5工具开发,开发环境为windowsXP。
6.2测试方法简介
黑盒测试:
黑盒测试是把程看成一个黑盒子,完全不考虑程序的内部结构和处理过程。
也就是说,黑盒测试是在程序接口进行的测试,它只是检查程序的功能是否按照规格说明书的规定正常使用,程序是否适当地接收输入数据产生正确的输出信息,并且保持外部信息(如,数据库或文件)的完整性。
黑盒测试又称为功能测试。
6.3测试过程及解决方法
6.3.1登陆测试
打开软件,显示欢迎界面后弹出登陆界面,在登陆界面可以看到有两个文本输入框,用于填写用户账号和密码,当填写完成后点击登陆按钮即可登陆。
当输入错误的用户信息时,点击登陆
当输入正确的用户信息时,登陆界面隐藏,弹出选择界面。
6.3.2选择菜单测试
进入选择菜单后,可以看到上部有显示用户的信息,中部有四个选项,从左至右依次为,开始考试,查看分数,考试规则和退出。
首先,在没有考试之前,点击查看分数按钮
点击查看考试规则按钮
6.3.3考试界面测试
点击开始考试按钮,进入考试界面
可以看到,用户信息,题库内容以及计时器正常工作。
然后,进行考试界面的测试
选择答案选项,然后点击下一题按钮
顺利切换到第二题,然后点击上一题按钮
可以看到,成功切换到上一题,并且上一题选择的答案有保存
答完全部题目后,点击交卷按钮,弹出提示,是否交卷
点击是,成功交卷,并且即时显示分数,然后弹回选择界面
这是可以在选择界面查看,自己的分数,点击查看分数按钮
如果在进行考试,会提示考试已经结束
最后,点击离开按钮,程序退出,并在进程工结束。
7总结
经过将近两个星期的努力,终于完成了这个考试评测系统,在完成这次课程设计的项目过程中遇到了不少困难也学到了不少知识。
在学习的过程中,我了解到对于一个项目,应该事先规划好项目的结构和模块,这样会在后面的设计流程中省下不少功夫。
在界面设计的过程中,一个美观的客户端界面是让人眼前一亮的,但是过于华丽的界面所带来的缺点就是程序的臃肿,因此在美观与简洁上需要一个平衡点,好在这课程设计老师为我们提前准备好了界面的图片,节省了我们不少时间。
在这个考试系统开发中,我遇到了不少难以解决的问题,比如经常遇到的Java.lang.NullPointerException空指针异常和ArrayIndexOutOfBoundsException数组下标越界异常。
不过在老师的帮助和网上查阅资料后顺利得到了解决。
对于一个大的系统开发,会涉及到很多的小知识点,我们可以从中复习到我们之前学到的很多小的知识点,另外,如果遇到一些没有学到过的知识,我们通过查阅资料,又获得了新的知识,我认为这样的学习过程对于我们知识的巩固具有很大的作用并且对于以后我们的工作也有很大的启发。
参考文献
[1](美)内格里诺,(美)史密斯.JavaScript基础教程(第7版)[M].北京:
人民邮电出版社,2009.
[2]温谦.HTML+CSS网页设计与布局从入门到精通[M].北京:
人民邮电出版社,2008.
[3]宗晔,方安宁.面向对象程序设计和设计技术的分析[J].浙江大学学报(工学版),1999,16
(2):
10-15.
附录:
核心代码
publicclassClientContext{
WelcomeWindowwelcomeWindow;//欢迎界面
LoginFrameloginFrame;//登录界面
MenuFramemenuFrame;//菜单界面
ExamFrameexamFrame;//考试界面
ExamServiceexamService;//考试服务处理
QuestionInfocurQuestion;//考试信息
UserloginUser;//用户登录
privateTimertimer=newTimer();//计时器
//构造方法
publicClientContext(WelcomeWindowwelcomeWindow,LoginFrameloginFrame,
MenuFramemenuFrame,ExamFrameexamFrame){
this.welcomeWindow=welcomeWindow;
this.loginFrame=loginFrame;
this.menuFrame=menuFrame;
this.examFrame=examFrame;
}
/**
*开始考试,首先进入欢迎界面和登录界面
**/
publicvoidstart(){
welcomeWindow.setVisible(true);
Timertimer=newTimer();
//显示欢迎界面
timer.schedule(newTimerTask(){
publicvoidrun(){
welcomeWindow.setVisible(false);
loginFrame.setVisible(true);
}
},1000);
}
//用户登录
publicvoidlogin(){
Useru;
try{
intuserId=loginFrame.getUserId();
StringuserPwd=loginFrame.getUserPwd();
u=examService.login(userId,userPwd);
loginUser=u;//登录成功将登录的用户赋值给loginUser
loginFrame.setVisible(false);
menuFrame.updateUserInfo(u.getName());
menuFrame.setVisible(true);
}catch(NumberFormatExceptione2){
JOptionPane.showMessageDialog(loginFrame,"请输入整数编号!
");
}catch(Exceptione3){
JOptionPane.showMessageDialog(loginFrame,"系统错误!
请联系系统管理员!
");
}
}
//开始考试
publicvoidstartExam(JFramesource){
//启动考试
try{
//完成考试则退出
if(examService.isFinish()){
JOptionPane.showMessageDialog(source,"考试已经结束!
");
return;
}
examService.startExam();
curQuestion=examService.getPaper().get(0);
examFrame.updateView(loginUser,curQuestion);
menuFrame.setVisible(false);
examFrame.setVisible(true);
examFrame.updateCount
(1);
startTimer();
}catch(Exceptione){
e.printStackTrace();
JOptionPane.showMessageDialog(source,"出错啦!
");
}
}
//下一题
publicvoidnext(JFramesource){
try{
intindex=curQuestion.getIndex();
if(index==0){
return;
}
//用户答案
Listanswers=examFrame.getUserAnswers();
intcurIndex=curQuestion.getIndex();
examService.sendUserAnswers(index,answers);
QuestionInfonextQuestion=examService
.findQuestionByIndex(curIndex+1);
curQuestion=nextQuestion;
//更新题号
examFrame.updateCount(curIndex+1);
//更新视图
examFrame.updateView(loginUser,curQuestion);
}catch(Exceptione){
e.printStackTrace();
JOptionPane.showMessageDialog(source,e.getMessage());
}
}
//上一题
publicvoidpre(JFramesource){
try{
intindex=curQuestion.getIndex();
if(index==0){
return;
}
//用户答案
Listanswers=examFrame.getUserAnswers();
intcurIndex=curQuestion.getIndex();
examService.sendUserAnswers(index,answers);
QuestionInfopreQuestion=examService
.findQuestionByIndex(curIndex-1);
curQuestion=preQuestion;
//更新题号
examFrame.updateCount(curIndex-1);
//更新视图
examFrame.updateView(loginUser,curQuestion);
}catch(Exceptione){
e.printStackTrace();
JOptionPane.showMessageDialog(source,e.getMessage());
}
}
//开始计时
privatevoidstartTimer(){
inttimeLimit=20;//考试时间
longstart=System.currentTimeMillis();//系统当前时间
finallongend=start+(timeLimit*60*1000);//结束时间
timer.schedule(newTimerTask(){
publicvoidrun(){
longnow=System.currentTimeMillis();
longlimit=end-now;
//显示时间
showTime(limit);
if(limit<=0){
//超时交卷
timeOut();
}
}
},0,1000);
}
//考试结束
protectedvoidtimeOut(){
JOptionPane.showMessageDialog(examFrame,"考试结束!
");
gameOver(examFrame);
}
//显示时间
protectedvoidshowTime(longlimit){
inth=(int)(limit/1000/60/60);//时
intm=(int)(limit/1000/60%60);//分
ints=(int)(limit/1000%60);//秒
Stringtime=h+":
"+m+":
"+s;//时间
Colorcolor=Color.blue;//标题颜色
if(limit<2*60*1000){
color=Color.red;
}
examFrame.updateTime(time,color);
}
publicQuestionInfogetQuestionInfo(){
returncurQuestion;
}
publicWelcomeWindowgetWelcomeWindow(){
returnwelcomeWindow;
}
publicvoidsetWelcomeWindow(WelcomeWindowwelcomeWindow){
this.welcomeWindow=welcomeWindow;
}
publicLoginFramegetLoginFrame(){
returnloginFrame;
}
publicvoidsetLoginFrame(LoginFrameloginFrame){
this.loginFrame=loginFrame;
}
publicMenuFramegetMenuFrame(){
returnmenuFra