基于java的在线考试系统
本科生毕业设计报告
课 题: 基于java的在线考试系统 作 者: 专 业: 班 级: 指导教师:
2012 年 04 月 02 日
摘 要
在线考试系统与传统考试相比,可以实现考务工作的全自动化管理,并有效地利用校园网的软硬件资源,实现考试的客观性和公证性;自动化组卷、阅卷、判分的流程更是大大的减轻教师的工作强度。在线考试系统旨在实现考试的无纸化管理,基于计算机和网络技术进行在线考试系统的使用,方便校方对考试的管理。
本程序是基于eclipse的在线考试系统,利用MVC架构编写,将功能分为3个模块,分别是视图,模型和控制器。将数据分为3个层次,分别为UI层,业务层,实体数据层,各层之间模块化,便于数据管理,易于系统维护 关键词:
Eclipse,MVC架构,Java语言,三层结构。
Abstract
Compared with the traditional test, online examination can realize the automation management work of the thesis, and effective use of the software and hardware of the campus network resources, realizing the objectivity of the exam and real; Automation group rolls, scoring, the process is the scores were greatly reduce teachers working strength. On-line examination system designed to achieve examination of the paperless management, based on the computer and network technology online examination system use, convenient to school examination management.
The program is based on the eclipse of the online examination system, with the MVC framework to write, will function is divided into three modules, respectively is the view, model and the controller. Data is divided into three levels, respectively UI layer, business layer, the entity data layer, between each layer DuLiHua module, facilitate data management, and is easy to maintain the system.
Keywords: Eclipse, MVC framework, Java language,the Three-tier Structure
大学本科生毕业设计(报告)
目 录
1. 序言 ....................................................................... 1
1.1 系统描述 ................................................................................................ 1 1.2 结构框图 ................................................................................................ 1
2. 所用开发工具简介 ..................................................... 2
2.1Eclipse简介 ............................................................................................ 2 2.2 Java 简介 ............................................................................................... 2 2.3 Java语言在Eclipse中的应用 ........................................................ 3
3. 系统总体设计 .......................................................... 4
3.1 系统需求分析 ....................................................................................... 4
3.2 系统概要设计 ....................................................................................... 4
3.2.1 系统结构设计 .......................................................................... 4 3.2.2 Swing设计 ................................................................................ 5
3.3 系统详细设计 ....................................................................................... 5
3.3.1 MVC架构 .................................................................................... 5
3.3.2对象依赖注入(IOC) ........................................................................ 6 3.3.3简单工厂方法 ................................................................................... 6
4. 系统应用程序设计 .................................................... 8
4.1 用户层界面的实现 ............................................................................ 8
4.1.1 布局的实现 .............................................................................. 9 4.1.2 welcomeWindow的实现 ......................................................... 9 4.1.3 loginFrame的实现 ................................................................. 10 4.1.4 menuFrom的实现 ................................................................. 19 4.1.5 examFrame的实现 ................................................................ 21
28
大学本科生毕业设计(报告)
4.1.6 clientContext的实现 ............................................................. 22
4.2 业务层界面的实现 ......................................................................... 23
4.2.1 ExamService的实现 .............................................................. 23 4.2.2 用户登录的实现 .................................................................... 24 4.2.3 开始考试的实现 .................................................................... 25 4.2.4 获得考卷的实现 .................................................................... 26
4.2.5 保存用户答案的实现 ......................................................................... 27
4.2.6 判分的实现 ............................................................................ 27
4.3 数据层的实现......................................................................................... 27
4.3.1 线性表HashMap .................................................................. 27
4.3.2 Users集合的实现 ................................................................... 27
4.3.3 Questions集合的实现 ........................................................................ 28
致谢 ......................................................................... 29 参考文献 ................................................................... 30
28
大学本科生毕业设计(报告)
1. 序言
1.1 系统描述
在线考试系统主要是学生通过客户机登陆自己的账号,然后完成课程科目的考试,提交,判分的过程。系统主要分成两个部分,分别是服务器端和客户端,两者通过线程的连接来完成考试的各项功能。
在服务器端,服务器先启动,读取配置文件,然后将试卷和学生的信息,包括学号,姓名,密码,读取到服务器中。这些信息的读取,会被封装在其他的类中,等待客户端发送数据连接请求,一旦发现有请求,就创建一个服务线程与之保持连接,等待考试完成的数据请求发送过来,再断开连接。过程中服务器是一直处于监听客户端请求连接的运行状态。
客户端部分,为了方便操作,应用到图形界面swing的技术,这里一共有三个部分的界面,第一个就是学生登录的界面,学生要输入学号和密码登录服务器;其次是学生选择考试科目的界面,要注意先将前面一个窗口销毁,然后再创建新的窗口;最后是学生考试界面的窗口,功能较多,设计也稍显复杂。最后用户点击交卷完成考试过程,并且显示得分,最后关闭窗口,服务器同时要断开连接,线程结束。
1.2 结构框图
图1
28
大学本科生毕业设计(报告)
2. 所用开发工具简介
2.1 Eclipse简介
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。
2.2 JAVA简介
Java是一种简单的,跨平台的,面向对象的,分布式的,解释的,健壮的安全的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言。当1995年SUN推出Java语言之后,全世界的目光都被这个神奇的语言所吸引。
Java 编程语言的风格十分接近C、C++语 言。Java是一个纯的面向对象的程序设计语言,它继承了 C++ 语言面向对象技术的核心,多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。
Java具有以下鲜明特点:
1.平台无关性 平台无关性是指Java能运行于不同的平台。Java引进虚拟机 原理,并运行于虚拟机,实现不同平台的Java接口之间。使用Java编写的程序能在世界范围内共享。
2.安全性 Java对程序提供了安全管理器,防止程序的非法访问。
3.面向对象 Java吸取了C++面向对象的概念,将数据封装于 类中,利用类的优点,实现了程序的简洁性和便于维护性。类的封装性、继承性等有关对象的特性,使程序代码只需一次编译,然后通过上述特性反复利用。程序员 只需把主要精力用在类和接口的设计和应用上。Java提供了众多的一般对象的类,通过继承即可使用父类的方法。
4.分布式 Java建立在扩展TCP/IP网络平台上。库函数提供了用HTTP和FTP协议传送和接受信息的方法。这使得程序员使用网络上的文件和使用本机文件一样容
28
大学本科生毕业设计(报告)
易。
5.健壮性 Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自己操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能,这些功能特征大大提高了开发Java应用程序的周期。并且Java还提供了Null指针检测、数组边界检测、异常出口、Byte code校验等功能。
6.动态 java程序的基本组成单元就是类,有些类是自己编写的,有些是从类库中引入的,而类又是运行 时动态装载的,这就使得Java可以在分部环境中动态的维护程序及分类,而不像C++那样,没档期类库升级以后,如果想让程序具有新类库提供的功能,就需 要修改程序,重新编译。
2.3 Java语言在Eclipse中的应用
Eclipse是Java语言的开发工具,通过Eclipse工具可以实现Java面向对象的思想,Java中的接口用于实际编程中,定义一定的接口,并用Java实现类来实现特定的接口。 具体步骤:
1、安装JDK,并在高级设置里面配置环境变量,打开Eclipse开发工具, 并在Eclipse里面讲安装好的JDK配置进去。
2、在Eclipse中新建一个Java Project,在src目录下新建包。(注意:包名一定要有意义。)在包里面新建类,同样的,类名声明也要有意义。
3、调试的时候要在main里面调试。
28
大学本科生毕业设计(报告)
3. 系统总体设计
3.1 系统需求分析
在传统的学校教学中,进行一场考试,要求老师刻试卷、印试卷、安排考试、监考、收集试卷、评改试卷、讲评试卷和分析试卷,这是一个繁杂的过程,需要大量人力、物力与时间的投入,已经越来越不适应学校信息化建设与现代教学的需要。因此,开发基于eclipse的在线考试系统。
3.2 系统概要设计
3.2.1 系统结构设计 三层架构(整体架构)
DataLayer-BisnussLayer-ViewLayer数据访问层-业务逻辑层—界面层,三层架构,是当今软件开发的一种流行架构,有点:使得数据与业务逻辑的分离,业务逻辑与用户界面的分离,但是三者相互依赖,用户界面层------依赖------业务逻辑层-----依赖------数据访问层。
1) 表现层(数据呈现/用户交互)
在ui包中 的 \"用户界面\"和\"控制器(ClientContext)\" 如:当点loginFrame的login按钮时,就会触发clientContext.login()方法,控制器就会处理由用户界面发来的请求。控制器会去业务层处理由用户界面发来的数据。
2) 业务层(业务模型),是软件的核心功能在service包中, 核心接口ExamService 如: 登录系统,开始系统。业务层是在线考试系统的核心功能,它主要是为了处理控制器传来数据。比如说登录功能,先要由控制器从用户界面的得到用户输入的id和password。然后就会调用ExamService的login方法。因为ExamService是接口,必须要有具体实现类来实现它,所以就定义了ExamServiceImpl来具体实现ExamService中的方法。而业务层的id和password是通过实体数据层得到的。 3) 数据管理层(数据持久化层),是提供数据的CRUD管理,增删改查
28
大学本科生毕业设计(报告)
数据管理层:只关心数据操作,不涉及业务功能
如: 查找用户。当业务层想实体数据层发送请求时,实体数据层就会寻找特定的id和password,若找到相应的id和password就将结果返回给业务层,业务层再将结果返回给用户界面。在entity包中, 核心类:EntityContext, 管理Users 和 Questions。
图.2 系统层次图
3.2.2 Swing设计
28
大学本科生毕业设计(报告)
1)AWT使java成功的技术:Applet AWT 具有强大的绘图功能
AWT 的应用控件很少(按钮, 菜单) AWT 时候开发图形,不适合开发应用
2) Swing 是利用AWT绘图功能, 完整的重新绘制了一套控件系统 包括:表格,Tree,等
JFrame 代表有框的窗口,中必须放置一个面板
JPanel 代表空白矩形区域面板, 在面板上可以添加控件/绘制图形
3.3 系统详细设计
3.3.1 MVC设计模式
MVC是三个单词的缩写,分别为:模型(Module),视图(View) 和控制Controller)。 MVC模式的目的就是实现Web系统的职能分工。 Model层实现系统中的业务逻辑。 View层用于与用户的交互,通常用JSP来实现。 Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示。Model-View-Control模型-视图-控制器。 MVC的优点:
1)低耦合性 2)高重用性和可适用性 3)较低的生命周期成本 4)可维护性分离
使得界面设计和业务逻辑分离。说的更通俗点就是,将前台设计和后台编码分离,便于美工和代码工的合作,已达到更能完善,用户体验好的软件设计。 1) Module 业务模型:软件核心功能的抽象,封装软件核心功能。 如:注册,登录,开始考试,交卷。
2) View 视图 (表现): 软件的界面视图, 用来呈现用户数据状态, 接受用户请求, 界面中只包含界面显示处理逻辑。
3) Controller(控制器):耦合界面与业务模型,响应处理用户请求, 将用户数据和请求转发给业务模型,根据业务模型的处理结果更新 转发视图界面。
4) MVC 请求流程:用户访问View,发起请求,请求由控制器处理, 控制器请求业务模型完成业务处理,控制器根据业务处理结果更新用户
28
大学本科生毕业设计(报告)
界面。
3.3.2 对象依赖注入(IOC)
依赖注入(IOC)这里注入的是loginFrame具体实例(汽油) 相当于汽车和汽油。创建控制器类ClientContext类,中添加界面对象引用和注入方法。 达到控制器能够操作这些对象的目的 ,以防空指针异常的出现。
用户界面创建对控制器的引用 。
如: private ClientContext clientContext;
public void setClientContext(ClientContext context) { this.clientContext = context;
}
在控制器引用创建的界面对象。
public void setLoginFrame(LoginFrame loginFrame){ this.loginFrame=loginFrame;
}
3.3.3 简单工厂模式
简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模
式的一个特殊实现。 工厂类是整个模式的关键,包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的。明确了各自的职责和权利,有利于整个软件体系结构的优化。
其实,简单工厂的核心思想就是并不在方法体内实现特定的方法,而是在方法外部实现了特定定义的方法,所以如果在调用该方法的时候,简单工厂就会实现方法。就是我给你一个方法名,你直接返回给我结果,我并不在这个方法内考虑结果是怎么来的。
总之,简单工厂方法就是用来封装复杂的对象创建过程, 提供简单的方法界面。
28
4. 系统应用程序设计
4.1 系统各窗体模块组成及实现
4.1.1 布局的实现
A 空布局 (绝对位置布局) 绝对布局管理, 是指定位置和宽高的布局 JFrame (w:574, H:390) |-- JPanel (W:568, H:357)
|-- JButton OK (x:369 ,y:327 , w:92 ,H:21 ) |-- JButton Cancel (x:466 ,y:327 , w:92 ,H:21 )
B 布局管理器(相对位置布局,组件的大小和位置有布局管理器控制) 1) BorderLayout (边框布局)
将一个面板,分为东南西北中,每个位置只能放一个控件 2)FlowLayout (流布局)
JPanel 的默认布局是FlowLayout,多个元素顺序排序,一行满了,再接着排下一行。
----------------------------
| [OK][OK][OK][OK][OK][OK] | | [OK][OK][OK] | | | ---------------------------- 3)GridLayout (表格布局)
指定行数、列数、元素按照等宽的行列表格进行布局,Swing界面是一层套一层实现的,先把要嵌入的元素声明出来,比如说JFrame(框架),JButton(按钮)。BorderLayout是实现布局管理器,
JFrame frame =new JFrame(\"布局实现\"); JPanel content=new JPanel(new BorderLayout()); JPanel bottom=new JPanel(new BorderLayout()); JPanel btnPanel=new JPanel(new FlowLayout()); JButton ok=new JButton(\"OK\"); JButton cancel=new JButton(\"Cancel\"); btnPanel.add(ok);
大学本科生毕业设计(报告)
btnPanel.add(cancel);
bottom.add(BorderLayout.WEST,btnPanel); content.add(BorderLayout.SOUTH,bottom); frame.setContentPane(content); frame.setSize(300,500); frame.setVisible(true);
4.1.2 包中资源的加载:
Class 实例获得:
a. String.class
b. str.getClass()
c. Class.forName(\"java.lang.String\")
1) 获得类的Class实例
2) 利用Class实例的方法 getResource() 方法获得资源 的URL, 可以进一步打开流。
如: 类 MenuFrame.class 的同包中有图片title.png URL url = getClass().getResourse(\"title.png\") URL url = MenuFrame.class.getResourse(\"title.png\") 其中\"title.png\" 表示相对路径访问, title.png和Class 在同一个包下, 如果参数以\"/\" 表示绝对路径,访问其中\"/\" CLASSPATH的根,如:\"/com/tarena/elts/gui/title.png\" 3) 打开图片 ImageIcon ico = new ImageIcon(url); 4) 可以利用InputStream in = url.openStream(); 打开为流 5) 从package(classpath 上)中 打开文本文件 new BufferedReader(new InputStreamReader( getClass().getReaource(\"test.txt\").openStream())) 4.1.3 loginFrame的实现
创建内容面板,在内容面板里面创建中间面板和Button面板,中间面板主要是显示用户名和密码框,是用来得到用户输入的。按钮面板上嵌入2个按钮,分别是login按钮,cancel按钮。
1)创建内容面板,在内容面板里面有中间面板和按钮面板,并用边框布局将面板
28
大学本科生毕业设计(报告)
放在特定的位置,边框布局的北边设置一个标签,用来显示用户界面的标题,中间面板放在边框布局的中间,按钮面板放在边框布局的南边。
private JPanel createContentPane(){
JPanel p=new JPanel(new BorderLayout());
p.setBorder(new EmptyBorder(8,8,8,8));//4个方向空白边框 p.add(BorderLayout.NORTH,(new
JLabel(\"
登
录
系
统
\
}
p.add(BorderLayout.CENTER,createCenterPane()); p.add(BorderLayout.SOUTH,createBtnPane()); return p;
2)实现在内容面板中定义的中间面板,先设置一个空白边框,并在边框布局的北边创建Id和Pwd面板,将登录得错误信息显示在边框布局的中间,最后将设置好的面板返回,用于用户操作。
private JPanel createCenterPane(){
}
3)实现在内容面板中定义的按钮面板,创建2个按钮,分别是Login和Cancel,login按钮是为了得到用户的登录请求, cancel按钮是为了得到用户的取消请求,将按钮添加到面板中。
JPanel p=new JPanel(new BorderLayout()); p.setBorder(new EmptyBorder(8,0,0,0));
p.add(BorderLayout.NORTH,createIdPwdPane()); message=new JLabel(\"\p.add(BorderLayout.CENTER,message); return p;
private JPanel createBtnPane(){
JPanel p=new JPanel(new FlowLayout()); JButton login=new JButton(\"Login\"); JButton cancel=new JButton(\"Cancel\"); getRootPane().setDefaultButton(login);
28
大学本科生毕业设计(报告)
p.add(login); p.add(cancel); this.idField=idField;
p.add(BorderLayout.CENTER,idField); return p; }
4)为登录界面增加方法,用来获取用户的ID(getUserId())和PWD(getPwd()),用
来判断是否在设备文件中。
private JTextField idField; private JPasswordField pwdField; private JLabel message; public int getUserId(){ }
public String getPassword(){ }
public void showMessage(String message){ }
5)若用户名或密码错误,设置错误提示消息,抛出自定义异常 IdOrPwdException,自定义异常的声明必须继承自它的父类Exception才能实现,原本的id:1002和pwd:1234,在这里输错密码,用于执行密码异常,最后将这个错误信息在边框布局的中间显示。(测试的Id:1002;pwd:3456)
this.message.setText(message); char[] pwd=pwdField.getPassword(); return new String(pwd);
return Integer.parseInt(idField.getText());
6)为loginFrame增加对控制器对象的引用, LoginFrame 界面增加 (ClientContext) 的引用和对象注入代码 。一定要这样做,不然会产生空指针异常。
private ClientContext clientContext;
public void setClientContext(ClientContext clientContext){
28
大学本科生毕业设计(报告)
this.clientContext=clientContext;
}
图.3 loginFrame窗体
4.1.4 menuFrame的实现
创建内容面板,在内容面板实现菜单面板,在菜单面板更新考试信息和创建按钮
面板,在按钮面板创建4个按钮,分别为开始按钮,分数按钮,消息按钮,退出按钮。
1)内容面板,内容面板里面有2个标签和一个菜单面板,其中,一个标签用来显示图片,另外一个标签用来显示版权信息,菜单面板的具体设置在另外一个面板实现,这里就实现了简单工厂的方法。不在这个面板具体实现,而是在别的面板声明,这个简单工厂的方法在别的窗体里面同样可以实现。另外,在菜单面板中创建一个标签,用来显示用户信息,因为当用户登录用户登录成功后,就会返回一个登录用户,将这个登录用户在界面上显示,用来表达友好的效果。其次,在菜单面板中在创建一个按钮面板,最后将创建好的按钮和标签返回给菜单面板。
private JPanel createContentPane(){
JPanel p=new JPanel(new BorderLayout()); ImageIcon
icon=new
ImageIcon(this.getClass().getResource(\"title.png\"));
p.add(BorderLayout.NORTH,new JLabel(icon)); p.add(BorderLayout.CENTER,createMenuPane());
p.add(BorderLayout.SOUTH,new JLabel(\"版权所有,违版必究!
\
return p;
}
private JPanel createMenuPane(){
28
大学本科生毕业设计(报告)
}
JPanel p=new JPanel(new BorderLayout()); userInfo=new JLabel(\"\p.add(BorderLayout.NORTH,userInfo); p.add(BorderLayout.CENTER,createBtnPane()); return p;
2)实现在菜单面板中定义的按钮面板,\"开始\"按钮是用来让用户考试的,当用户点击\"开始\"按钮的时候,就会跳到考试窗体具体考试;当用户点\"分数\"按钮的时候,就会用一个消息框显示用户考试的成绩,注意,只有当用户已经考完试了才会有具体的分数,这在业务逻辑里面具体判断;当用户点\"考试规则\"按钮的时候,就会用一个消息框来具体显示考试规则;当用户点\"退出\"按钮的时候,就会显示一个确定框提示用户,\"真的退出吗?\"。若用户点\"是\",则表示退出系统,若用户点\"否\",则表示用户需要停留在该页面,则保持页面不动。
private JPanel createBtnPane(){
JPanel p=new JPanel(new FlowLayout()); JButton start=createImgBtn(\"exam.png\开始\"); JButton result=createImgBtn(\"result.png\分数\"); JButton msg=createImgBtn(\"message.png\考试规则\"); JButton exit=createImgBtn(\"exit.png\退出\"); p.add(start); p.add(result); p.add(msg); p.add(exit);
getRootPane().setDefaultButton(start);
3)分别为start,result,msg,exit按钮添加触发事件,
当用户点\"开始\"按钮的时候,就去ClientContext调用start()方法 当用户点\"分数\"按钮的时候,就去ClientContext调用sresult()方法 当用户点\"考试规则\"按钮的时候,就去ClientContext调用msg()方法 当用户点\"退出\"按钮的时候,就去ClientContext调用exit()方法
start .addActionListener(new ActionListener(){
28
大学本科生毕业设计(报告)
});
public void actionPerformed(ActionEvent a){ }
clientContext.start();
result.addActionListener(new ActionListener(){
});
public void actionPerformed(ActionEvent e){ }
clientContext.result();
msg.addActionListener(new ActionListener(){
});
public void actionPerformed(ActionEvent e){ }
clientContext.msg();
4)更新用户界面
若登录成功,就会返回一个用户对象,务必将userInfo 引用到界面控件对象 用户显示当前是哪个用户在考试,显示欢迎界面,以达到有好的界面效果,更新用户界面信息,以便于用户考试。 private JLabel userInfo;
public void updateView(User user){
String str=\"欢迎\"+user+\"参加考试!\";
userInfo.setText(str);
}
JButton btn=new JButton(txt,icon);
btn.setVerticalTextPosition(JButton.BOTTOM); btn.setHorizontalTextPosition(JButton.CENTER);
5)为menuFrame添加对控制器对象的引用, LoginFrame 界面增加 控制器(ClientContext) 的引用和对象注入代码 。一定要这样做,不然会产生空指针异常。
private ClientContext clientContext;
public void setClientContext(ClientContext clientContext) {
28
大学本科生毕业设计(报告)
this.clientContext = clientContext; }
6)当用户关闭窗口是增加确定按钮
this.addWindowListener(new WindowAdapter(){
});
public void windowClosing(WindowEvent e){ }
clientContext.exit(LoginFrame.this);
图.4 menuFrame窗体
4.1.4 ExamFrame窗体
1)在考试的时候,若用户点关闭按钮,就会调用交卷方法,增加控制器响应按钮,而不是实际关闭,以保证业务的合理性。
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
28
大学本科生毕业设计(报告)
});
}
clientContext.send();
2)创建内容面板,其中包含考试面板和工具面板。首先,要用IamgeIcon类将图片显示,其中,考试面板是用于显示考题,选项;工具面板用来嵌套用户的需求,比如说,上一题,下一题,交卷等。同样的,它们都是用边框布局来布局的,分别用东、西、南、北4个方位来分布,最后将创建好的面板返回。
private JPanel createContentPane(){ }
3)创建考试面板,首先在考试面板边框布局的北边显示考试信息,比如说编号,姓名,考试时间,考试科目等;另外,在考试面板边框布局的中间创建一个考题面板;在考试面板边框布局的南边创建一个选项面板。最后,将创建好的对象返回,用于在考试界面显示。
private JPanel createExamPane(){
JPanel p=new JPanel(new BorderLayout()); examInfo=new JLabel(\"\p.add(BorderLayout.NORTH,examInfo);
p.add(BorderLayout.CENTER,createQuestionPane()); p.add(BorderLayout.SOUTH,createOptionsPane()); return p; }
JPanel p=new JPanel(new BorderLayout()); p.setBorder(new EmptyBorder(8,8,8,8));
ImageIcon icon=new ImageIcon(this.getClass().getResource(\"title.png\")); p.add(BorderLayout.NORTH,new JLabel(icon)); p.add(BorderLayout.CENTER,createExamPane()); p.add(BorderLayout.SOUTH,createToolsPane()); return p;
4)创建工具面板,
首先,在周围边框嵌入一个空白边框;
其次,在工具面板边框布局的西边加入题目数量标签;
28
大学本科生毕业设计(报告)
在工具面板边框布局的东面加入定时器标签; 在工具面板边框布局的中间创建按钮面板;
private JPanel createToolsPane(){
JPanel p=new JPanel(new BorderLayout()); p.setBorder(new EmptyBorder(0,10,0,10));
questionCount =new JLabel(\"\ timer =new JLabel(\"\");
p.add(BorderLayout.WEST,questionCount); p.add(BorderLayout.EAST,timer);
p.add(BorderLayout.CENTER,createBtnPane());
return p;
}
5)创建按钮面板,上一个按钮,下一个按钮,交卷按钮,并分别为上一个,下一个,交卷按钮增加触发事件。
private JPanel createBtnPane(){
JPanel p=new JPanel(new FlowLayout()); prev=new JButton(\"上一个\");
prev.addActionListener(new ActionListener(){ });
next=new JButton(\"下一个\");
next.addActionListener(new ActionListener(){ });
JButton send=new JButton(\"交卷\") ; send.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
28
public void actionPerformed(ActionEvent e){ }
clientContext.prev();
public void actionPerformed(ActionEvent e){ }
clientContext.next();
大学本科生毕业设计(报告)
}
});
}
clientContext.send();
p.add(prev); p.add(next); p.add(send); return p;
6)更新考试界面,当用户点击\"上一个\"或\"下一个\"按钮时,需要先得到当前用户的答案,然后在找到用户想要的特定题目的下标。
public void updateView(ExamInfo examInfo, QuestionInfo questionInfo) {
this.examInfo.setText(examInfo.toString()); this.questionArea.setText(questionInfo.toString());
this.questionCount.setText(\"题目:\"+examInfo.getQuestionCount()+\"的
\"+(questionInfo.getQuestionIndex()+1)+\"题\");
this.updateOptions(questionInfo.getUserAnswers());
this.updateQuestionCount(examInfo.getQuestionCount(),questionInfo.getQuestio
nIndex());
this.updateButtons(examInfo.getQuestionCount(),
questionInfo.getQuestionIndex());
7)得到用户答案,判断这个选项框是否被选中,若该选项框被选中,就把这个value写到UserAnswers集合中。
public List 28 List return ans; if(o.isSelected()) ans.add(o.value); 大学本科生毕业设计(报告) 图.5 examFrame的窗体 4.1.6 ClientContext控制器 ClientContext是非常重要的,它充当用户界面和业务层的桥梁,每当用户层有请求的时候,都是由控制器捕获请求,然后控制器在去业务层寻找特定的方法处理。等到业务层处理好数据后,也将结果返回给控制器ClientContext,并由控制器将用户请求的数据返回给用户层。 在ClientContext中最重要的就是对界面对象的引用,因为它们互相之间 是相互依赖的,如果不注意这个问题就会发生空指针异常。如: public void setLoginFrame(LoginFrame loginFrame){ } this.loginFrame=loginFrame; 1)处理用户层的登录请求,先调用业务层的登录方法,若登录成功,就以新用户更新菜单界面 (UpdateView),将登录界面显示为false,考试界面设置为true,这样做就是为了跳转到MenuFrame,并为MenuFrame界面增加更新用户信息的方法,加入try{}catch{}模块 public void login(){ try{ 28 大学本科生毕业设计(报告) int id=loginFrame.getUserId(); String pwd=loginFrame.getPassword(); User user=examService.login(id,pwd); menuFrame.updateView(user); loginFrame.setVisible(false); } 2)处理菜单界面的开始考试功能,更新考试界面,将menuFrame设置为不可见,将ExamFrame设置为可见,这样就可以显示考试界面了,当用户开始的时候,启动定时器,开始计时功能,提示用户考试时间。 public void start(){ menuFrame.setVisible(true); }catch(IdOrPwdException e){ e.printStackTrace(); loginFrame.showMessage(\"登录失败\"+e.getMessage()); //JOptionPane.showMessageDialog(loginFrame, e.getMessage()); }catch(NumberFormatException e){ loginFrame.showMessage(\"ID只能为数字\"); }catch(Exception e){ } e.printStackTrace(); loginFrame.showMessage(\"登录失败\"+e.getMessage()); try{ examInfo=examService.start(); QuestionInfo questionInfo=examService.getQuestions(0); this.currentQuestion=questionInfo; examFrame.updateView(examInfo,questionInfo); menuFrame.setVisible(false); examFrame.setVisible(true); startTimer(); }catch(Exception e){ 28 大学本科生毕业设计(报告) } } e.printStackTrace(); JOptionPane.showMessageDialog(menuFrame, e.getMessage()); 3)上一题,下一题的处理事件 当用户调用\"下一题\"按钮时,首先必须得到当前用户的答案,并将得到的答案用线性表保存;其次,保存用户答案,必须得到当前答案的下标和用户的答案;另外,将下标+1就得到下一题的下标;最后更新考试界面信息,将当前考题和考试信息传入,用户更新考试界面信息。 同理,上一个按钮也是同下一个按钮同样实现的,唯一不同的是,就是将当前考题的下标-1,而不是考题的下标-1; 最后,下一个方法调用时也有可能会有异常,所以也要加入try{} ... catch{}....模块。 public void next(){ } 4)交卷按钮的处理事件 当用户点击\"交卷\"按钮时,就会产生一个确认信息框,用来获取用户的真正需求;若用户点击\"是\",则表示退出,就会进行判分;若用户点击\"否\",则返回考试界面。 try{ int index=currentQuestion.getQuestionIndex(); List }catch(Exception e){ } e.printStackTrace(); JOptionPane.showMessageDialog(examFrame, e.getMessage()); public void send(){ 28 大学本科生毕业设计(报告) try{ int value=JOptionPane.showConfirmDialog(examFrame, \"您真的要交 吗?想清楚哦!\"); } if(value==JOptionPane.YES_OPTION) gameOver(); }catch(Exception e){ } e.printStackTrace(); JOptionPane.showMessageDialog(examFrame, e.getMessage()); 4.2 业务层界面的实现 4.2.1 ExamService的实现类 业务层是在线考试系统的核心,主要就是为了处理用户层的业务,所以用户的体验完全依赖与业务层的实现。 因为ExamService本身是一个接口,所以必须要有具体类来实现它。因此,ExamServiceImpl就是用来实现在接口中定义的方法。 4.2.2 用户登录功能的具体实现 因为当一个界面显示的时候,必须现有用户名和密码登录才可以,这样才比较符合业务逻辑。 自定义异常IdOrPwdExption,若用户输入的用户名和密码不符合实体数据层的用户名和密码,就会抛出异常。 public User login(int id,String pwd)throws IdOrPwdException{ User user=entityContext.findUsersById(id); if(user==null){ } if(user.getPasswd().equals(pwd)){ loginUser= user; return loginUser; 28 throw new RuntimeException(\"无用户!\"); 大学本科生毕业设计(报告) } } throw new IdOrPwdException(\"密码错误呀!\"); 4.2.3 开始考试功能的具体实现 主要功能:开始考试业务描述: 开始考试时候, 抽取考卷试题,每个level抽取2题,返回考试描述信息:ExamInfo。 首先,要判断用户是否已经考试,若已经考试,就不能重复考试,抛出异常; 其次,创建考卷,至于怎么创建考卷也是通过简单工厂方法实现的; 另外,从实体数据层得到考试时间,得到考试科目,得到考题数量,将登录用户传给考试考试信息,用于在考试界面上显示用户名。 public ExamInfo start(){ } if(finish){ } createPaper(); ExamInfo examInfo=new ExamInfo(); examInfo.setTimeLimit(entityContext.getTimeLimit()); examInfo.setTitle(entityContext.getTitle()); examInfo.setQuestionCount(entityContext.getQuestionCount()); examInfo.setUser(loginUser); finish=true; return examInfo; throw new RuntimeException(\"考试结束!\"); 4.2.4 创建考卷的实现 创建一个随机数,首先在实体数据层通过level找到考题,从这个考题里面根据level随机抽取2道,为了保证数据的唯一性,抽一道,就把这道考题删除,用同样的方法抽取2次,并把考题添加到考卷集合中。最后,其实考卷就是考题的线性集合。 private void createPaper(){ Random r=new Random(); int i=0; 28 大学本科生毕业设计(报告) } for(int level=Question.LEVEL1;level<=Question.LEVEL10;level++){ } List 4.2.4 保存用户答案的具体实现 得到当前考题的下标,将所有的用户答案都添加到集合中 public void saveUserAnswers(int index,List QuestionInfo info=paper.get(index); info.getUserAnswers().clear(); info.getUserAnswers().addAll(userAnswers); 4.2.5 判分的具体实现 先得到标准答案,在得到用户答案,把用户的答案和标准答案比较,若相等,就加5分;反之,不加分。 private int score; public int send(){ if(finish){ } score=0; for(QuestionInfo info:paper){ Question q=info.getQuestion(); List List score+=q.getScore(); 28 throw new RuntimeException(\"考试结束!\"); 大学本科生毕业设计(报告) } } } finish=true; return score; 4.3 数据层的实现 4.3.1 散列表HashMap HashMap(关键字:值),关键字key是唯一不重复的,查找表。 1) key可以是任何对象,Value可以任何对象。 2) key:value 成对的放置到集合中。 3) 重复的key算一个, 重复添加是替换操作。 4) 根据key检索查找value值。 4.3.2 Users用户集合 在这里key是Id,value是user对象代表系统登录用户,当用户登录成功后,就会把当前用户设置为登录用户,这是符合业务逻辑的。 1、Users集合 1)loadUsers(String name)从文件装载用户,利用文件流读取,因为文件读取可能会有异常,所以就用try{}....catch()模块抛出异常。 2)将读取的字符缓冲流转换成User对象,这是就需要简单工厂方法用parseUser(String str)直接转换。利用split()方法读取,并给user对象设置Id,Name,Passwd,Phone,Email,并将user返回。 3)将返回的user对象添加到users集合中。 public void loadUsers(String name){ try{ BufferedReader in=new BufferedReader(new InputStreamReader(new FileInputStream(name),\"GBK\")); String str; while((str=in.readLine())!=null){ str=str.trim(); 28 大学本科生毕业设计(报告) } if(str.startsWith(\"#\") || str.equals(\"\")){ } User user=parseUser(str); users.put(user.getId(), user); continue; }catch(Exception e){ }} e.printStackTrace(); throw new RuntimeException(e); 4.3.2 Questions集合 与users一样,也是采用HashMap存储的,装载考题集合,类似于装载用户集合,都是利用字符缓冲流读取,但是考题集合比较复杂,因为需要读取答案,分数,等级,题目,选项。 public void loadQuestions(String name) throws IOException{ try{ BufferedReader in=new BufferedReader(new InputStreamReader(new BufferedInputStream(new FileInputStream(name)),\"GBK\")); String str; while((str=in.readLine())!=null){ } str=str.trim(); if(str.equals(\"\")|| str.startsWith(\"#\")){ continue; } //解析流信息到 Question 对象 Question q=parseQuestion(str, in); //添加到集合 addQuestion(q); }catch(Exception e){ e.printStackTrace(); throw new RuntimeException(e);}} 28 大学本科生毕业设计(报告) 致 谢 在毕业论文结束,毕业设计完成之际,首先向在这段时间给予我帮助的毕业设计指导老师老师和项目经理屠郎致以深深的谢意。师在教学任务繁忙的情况下,抽出时间帮助纠正我在设计当中出现的问题,并耐心地为我的论文作校正。老师对我的支持,不仅是技术上的,还是心理上的鼓励和督促,他的指导和建议使我受益非浅,没有他的帮助和指导,就不会有我今天的成果。 感谢我的父母在我做毕业设计这段期间给予我很大的精神支持。 最后向关心和支持我学习的所有领导、同学和朋友们表示真挚的谢意!感谢他们对我的关心、关注和支持! 28 大学本科生毕业设计(报告) 参考文献 1) 王克宏 著.Java技术教程(基础篇).北京:高等教育出版社,2002.04 2) 洪维恩 何嘉.Java2面向对象程序设计[M].北京:中国铁道出版社,2005.01 3) 都志辉 著.Java3D编程实践. 北京:清华大学出版社,2002.11 4) 汪孝宜等 著.JSP数据库开发实例精粹 电子工业出版社,2005.05 5) Roger Garside,John Mariani 著.Java教程(英文版.第2版).北京:机械工业出版社,2003.08 6) Elliote Rusty Harold,DavidFlanagan 著.Java Network Programming. O'Reilly,1997.06 7) Cornel,Horstmann 著.Core Java第版.Prentice-Hall,1997 8) Bruce Eckel 著.Java编程思想.北京:机械工业出版社,2004.01 3 28 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务