资源描述
在线考试系统的设计与实现毕业设计
毕业论文
在线考试系统的设计与实现
摘要:本在线考试系统是利用Sun Microsystems公司倡导的JSP 和SQL2005数据库,利用了目前比较热门的JSP技术的JDBC与数据库连接和JSP+Servlet访问数据库,实现了在线考试系统的出卷,在线答题,在线批改和创建题库等四项基本的在线考试功能。该系统有应用简单、升级和部署方便、扩展性强等特点。并且对考生参加考试的设备要求很低,只需支持Web服务器访问就可以了。
关键词:JSP, 考试系统,在线考试系统
目 录
第一章 前言 1
1.1 关于在线考试 1
1.2 在线考试系统的发展趋势 1
1.3 相关知识介绍 2
1.3.1 JSP、JavaBean 、ervlet、JDBC的概述 2
第二章 系统的分析与设计 3
2.1需求分析 3
2.2总体设计 3
2.3功能设计 4
第三章 数据库设计 4
第四章 系统实现 7
4.1出卷模块的实现 7
4.2 在线考试模块的实现 13
4.3 在线批改模块的实现 24
4.4题库模块的实现 26
第五章 开发技巧 30
第六章 系统测试 31
6.1 系统测试 31
第七章 结束语 32
参考文献 33
第一章 前言
1.1 关于在线考试
随着网络技术的飞速发展,现在很多国外的大学和社会其他部门都已经开设了远程教育,通过计算机网络实现异地教育和培训。现在,计算机硬件技术的发展已经达到了相当高的水平。但是,远程教育软件的开发目前还处于起步阶段,随着这项技术的不断深入发展,就要求有更好、更完善的软件系统应用到远程教育当中去,这就给软件设计人员提出了更高的设计要求。
远程教育包括很多环节,例如教学系统、答疑系统和考试系统等等。其中很重要的一个环节就是在线考试系统,同时它也是最难实现的环节。在我国,虽然远程教育已经蓬勃地发展起来,但是目前学校与社会上的各种考试大都采用传统的考试方式,在此方式下,组织一次考试至少要经过五个步骤,即人工出题、考生考试、人工阅卷、成绩评估和试卷分析。显然,随着考试类型的不断增加及考试要求的不断提高,教师的工作量将会越来越大,并且其工作将是一件十分烦琐和非常容易出错的事情,可以说传统的考试方式已经不能适应现代考试的需要。
1.2 在线考试系统的发展趋势
随着计算机应用的迅猛发展,网络应用不断扩大,如远程教育和虚拟大学的出现等等,且这些应用正逐步深入到千家万户。人们迫切要求利用这些技术来进行在线考试,以减轻教师的工作负担及提高工作效率,与此同时也提高了考试的质量,从而使考试更趋于公证、客观,更加激发学生的学习兴趣。例如目前许多国际著名的计算机公司所举办的各种认证考试绝大部分采用这种方式。
在线考试是现阶段研究开发的一个热点。它是建立在国际互联网上的应用系统,客户端的配置可以极为简单,使考试不受地域的局限。一个完备的在线考试系统可以使用户在网上学习过后及时检验自己的学习效果,已发现自己的不足,使得学习效率得到很大提高。在线考试系统中题目的生成、试卷的提交、成绩的批阅等都可以在网络上自动完成。只要形成一套成熟的题库就可以实现考试的自动化。这样一来,教师所要做的只是精心设计题目、维护题库,而不是组织考试,从而大大减轻了教师的负担,这表明其经济性是相当可观的。为了适应新形势的发展,我进行了这一系统的初步设计工作,也可以说是做一个初步的探索,希望它能够在各类考试中发挥高效、便捷的作用,把老师从繁重的工作中解脱出来
目前,网络应用软件运行的模式主要有二类:Client/server模式,Browser/Web模式。前者主要的缺点是维护、升级较麻烦,后者是近几年伴随Internet迅速发展起来的一种技术,它与客户/服务器方式类似,客户端是一个标准的浏览器,服务器端是Web Server ,而Web Server与数据库和应用服务器的紧密结合,使得这种模式的应用范围不断扩大,它已不仅仅用于网上查询,有很多部门的业务系统、企业的MIS系统纷纷采用这种模式,它的主要优点是便于扩充应用、升级维护简便。
另外,考试系统的软件也必将不断的更新;同时软件产品本身就要经过一个不断自我完善的过程。
基于上述考虑,用JSP设计考试系统比较合适,现实了动态页面与静态页面的分离,脱离了硬件平台的束缚以及编译后运行等方式,大大提高了其执行效率而逐渐成为Internet上的主流工具。在美国,EJB+Servlet+JSP几乎成了电子商务的开发标准,而在我国也正逐渐兴起,不少网站都采用JSP技术。
1.3 相关知识介绍
该在线考试系统主要采用Microsoft .net Framework、JSP、 SQL Server数据库、My Eclipse7.5、Dreamweaver CS、Tomcat6.0等技术和工具,整体设计遵循软件工程的方法,经过需求分析、总体设计、文档和代码的编制、模块测试和系统实现几个阶段.
1.3.1 JSP、JavaBean 、ervlet、JDBC的概述
◆JSP的概述:
JSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。 Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库,重新定向网页以及发送E-mail等,这就是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传给客户端仅仅是结果,对客户浏览器的要求最低。在Java的基础上开发的JSP实现了动态页面与静态页面的分离,脱离了硬件平台的束缚以及编译后运行等方式,大大提高了其执行效率而逐渐成为了Internet上的主流开发工具。在美国,EJB+Servlt+JSP几乎成为了电子商务的开发标准,而在我国也正逐渐兴起,不少网站都采用了JSP技术。
◆JavaBean的概述:
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 属性。
用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。
◆Servlet的概述:
Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。
■Servlet的工作模式
1. 客户端发送请求至服务器
2. 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
3. 服务器将响应返回客户端
4. JDBC是通用的SQL Server(结构化查询语言)数据库存取框架,带有 简单且功能强大的应用程序接口 (AP I)。利用JDBC API,Java 开发人 员可以在单一的标准化功能库中编码,生成独立 于数据库管理系统(D BMS) 的Java 应用系统。兼容JDBC的应用程序 可利用JDBC驱动器模块,反过来与后端数据源通信。 这些元件化的JDBC驱动器可换入换出,以适应不同的数据库后端设备。
第二章 系统的分析与设计
2.1需求分析
在线考试系统主要包括自动出卷,在线答题,在线批改和题库等功能。基本上包括了在线考试系统应该聚有的基本功能,。
根据在线考试系统的基本需求,系统需要完成以为的具体任务。
(1)自动出卷:一个完整的在线考试系统首先必须具有能够满足用户需要的试卷,并且针对不同的用户要有不同的试卷,自动出卷模块就能够满足用户的这个需求,可以由系统管路员对试卷格式进行设置,然后由系统自动从题库中选择题目生成试卷。
(2)在线答题:试卷生成以后,用户能够在系统中选择一份试卷进行答题。
(3)在线批改:用户答题完成以后,把试卷提交给系统,系统能够在线批改,并及时的把结果返回给用户。
(4)题库:题库是生成试卷的基础,把所有收集到的题目分类存入题库中,生成试卷时随机的从题库中取出题目,组合成 一张试卷。
图1.1 在线考试用例图
自动出卷
在线考试
在线批改
题库
2.2总体设计
2.2.1 UML业务逻辑图
在线考试系统主要的操作:
图2.1 在线考试系统逻辑图
选择试卷
自动出卷
在线考试
在线批改
返回成绩
2.2.2 系统结构
表2.2 系统结构表
出卷模块
考试模块
批改模块
Chujuan.jsp
Chujuan1.jsp
Shijuanbianhao.jsp
Kaoshi.jsp
Xuanzeti.jsp
Xuanzeti_view.jsp
Panduanti.jsp
Kaosh1.jsp
2.3功能设计
根据系统的需求分析,明确系统的功能主要包括以为4个部分。
(1)出卷,该模块实现试卷的生成功能。鉴于主观题的主观性,目前无法实现系统自动判卷,所以本系统只作客观题部分。一般情况下,单选题往往在四个供选的答案A、B、C、D中选择唯一正确的答案;
(2)在线考试。该模块是用户考试的窗口,用户在此部分进行答题,并提交。
(3)在线批改。该模块实现答题正误的判断和对试卷进行评分的功能。
(4)题库。系统用该模块来存储考试试题,以备出卷时调用。
第三章 数据库设计
依据系统分析,数据库主要由以下几张表组成。
◆ 试卷信息表(shijuan).表名为shijuan,存放试卷题目的信息。
表3.1 试卷信息表
字段
说明
类型
备注
Shijuanbiaohao
试卷编号
int
timu
题目
varchar(800)
题目内容
fenzhi
分值
int
题目的分值
timuleixing
题型
varchar 10
不可为空
id
题目的ID
int
外键
kaoshishijuan
考试时间
int
单位:分
创建试卷信息表的代码:
CREATE TABLE [shijuan] (
[shijuanbiaohao] [int] NULL,
[timu] [varchar] (800) COLLATE chinese_ PRC_CI_AS NULL,
[fenzhi] [int] NULL,
[timuleixing] [varchar] (10) COLLATE chinese _PRC_CI_AS NULL,
[id] [varchar] (10) COLLATE chinese _PRC_CI_AS NULL,
[kaoshishijuan] [int] NULL
)
◆ 选择题题库信息表(xuanzeti).表名为xuanzeti,存放选择题题库信息。
表3.2 选择题题库信息表
字段
说明
类型
备注
id
题目id
int
主键
timn
题目
varchar(800)
不可为空
daan
正确答案
varchar(200)
不可为空
zhang
章节
int
题目所属章节
a
A选项
varchar (50)
不可为空
b
B选项
varchar(50)
不可为空
c
C选项
varchar(50)
不可为空
d
D选项
varchar(50)
不可为空
nandu
难度系数
int
创建选择题题库信息表的代码:
CREATE TABLE [xuanzeti] (
[id] [int] NOT NULL,
[tigan] [varchar] (800) COLLATE chinese_PRC_CI_AS NOT NULL,
[daan] [varchar] (200) COLLATE chinese_PRC_CI_AS NOT NULL,
[zhang] [int] NOT NU LL,
[a] [varchar] (50) COLLATE chinese_PRC_CI_AS_ NOT NULL,
[b] [varchar] (50) COLLATE chinese_PRC_CI_AS_ NOT NULL,
[c] [varchar] (50) COLLATE chinese_PRC_CI_AS_ NOT NULL,
[d] [varchar] (50) COLLATE chinese_PRC_CI_AS_ NOT NULL,
[nandu] [int] NULL,
CONSTRAINT [pk_xunazeti] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
)
◆判断题题库信息表(panduanti).表名为panduanti,存放判断题题库信息。
表3.3 判断题题库信息表
字段
说明
类型
备注
id
题目id
Int
主键
timn
题目
varchar(800)
不可为空
daan
正确答案
varchar(200)
不可为空
zhang
章节
int
题目所属章节
nandu
难度系数
int
创建判断题题库信息表的代码:
CREATE TABLE [panduanti] (
[id] [int] NOT NULL,
[tigan] [varchar] (800) COLLATE chinese_PRC_CI_AS_ NOT NULL,
[daan] [varchar] (200) COLLATE chinese_PRC_CI_AS_ NOT NULL,
[zhang] [int] NULL,
[nandu] [int] NULL,
CONSTRAINT [pk_panduanti] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
)
◆ 主观题题库信息表(zhuguanti).表名为zhuguanti,存放主观题题库信息。
表3.4主观题题库信息表
字段
说明
类型
备注
id
题目id
Int
主键
timn
题目
varchar(800)
不可为空
daan
正确答案
varchar(200)
不可为空
zhang
章节
int
题目所属章节
nandu
难度系数
int
创建主观题题库信息表的代码:
CREATE TABLE [panduanti] (
[id] [int] NOT NULL,
[tigan] [varchar] (800) COLLATE chinese_PRC_CI_AS_ NOT NULL,
[daan] [varchar] (200) COLLATE chinese_PRC_CI_AS_ NOT NULL,
[zhang] [int] NULL,
[nandu] [int] NULL,
CONSTRAINT [pk_zhuguantiti] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
)
◆ 用户考试信息表(students_xuanze)。表名为students_xuanze,存放用户考试信息。
表3.5 用户考试信息表
字段
说明
类型
备注
id
用户ID
Int
主键
uid
用户名
varchar(10)
zhang
章节
int
rightcount
正确题数
int
dayntime
考试时间
varchar(30)
创建用户考试信息表的代码:
CREATE TABLE [students xuanze] (
[id] [int] IDENTITY (1,1) NOT NULL,
[uid] [varchar] (10) COLLATE chinese PRC CI AS NULL,
[zhang] [int] NULL,
[rightcount] [int] NULL,
[dayntime] [varchar] (30) COLLATE chinese_PRC_CI_AS NULL
)
第四章 系统实现
本系统是一个JSP,后台数据库用的是SQL Server,用Tomcat做Web 服务器,本系统实现了在线考试中的核心功能,程序在Windows环境下经过测试能够运行。
4.1出卷模块的实现
该模块有chujuan.jsp和chujuan1.jsp两个JSP页面来实现,其中chujuan.jsp页面主要负责出卷表单的填写和提交,chujuan1.jsp负责把chujuan.jsp页面提交的数据进行处理后插入数据库。
1. chujuan.jsp
chujuan.jsp页面的界面。
图4.1 chujuan.jsp页面的界面
程序说明:出卷信息输入页面。
程序模块名称:chujuan.jsp。
相关数据库:无。
chujuan.jsp页面的代码
chujuan.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>出卷</title>
<style type="text/css">
<!--
.style2 {font-size: small}
-->
</style>
</head>
<body>
<form name="form1" method="post" action="chujuan1.jsp">
<table width="714" border="1" bordercolor="#33CC99">
<tr>
<td width="51" height="44"> </td>
<td width="156" class="style2"><div align="right">选择题数目:</div></td>
<td width="168"><input type="text" name="xuanzeshumu"></td>
<td width="129" class="style2">每一题分值:</td>
<td width="127"><select name="xuanzefenzhi">
<option value="1">1</option>
<option value="2">2</option>
<option value="3" selected>3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select></td>
</tr>
<tr>
<td height="48"><p align="left"> </p></td>
<td><div align="right" class="style2">判断题数目:</div></td>
<td><p>
<input type="text" name="panduanshumu">
</p>
</td>
<td class="style2">每一题分值:</td>
<td><select name="panduanfenzhi">
<option value="1">1</option>
<option value="2" selected>2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select></td>
</tr>
<tr>
<td height="37"> </td>
<td><div align="right" class="style2">主观题数目:</div></td>
<td><p>
<input type="text" name="zhuguanshumu">
</p></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><div align="right">考试时间:</div></td>
<td colspan="2"><input type="text" name="kaoshishijian"> 分钟</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><div align="right" class="style2">试卷编号:</div></td>
<td colspan="2"><select name="shijuanbianhao">
<option value="1" selected>1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select></td>
<td> </td>
</tr>
</table>
<p> </p>
<p align="center">
<input name="Submit" type="submit" class="style2" value="提交">
</p>
</form>
</body>
</html>
单击chujuan.jsp页面的“提交”按钮,提交数据,然后由chujuan1.jsp进行处理。chujuan1.jsp页面的工作原理是根据chujuan.jsp提交的参数,从不同的题库中随机选出题目组成一份试卷。最后把选出的结果插入数据库。
2. chujuan1.jsp
程序明白:出卷结果提交页面。
程序模块名称:chujuan1.jsp。
相关数据库:试卷表shijuan。
chujuan1.jsp页面的代码。
<SCRIPT language="javascript">
function backward()
{
history.back();
}
function teacher()
{
window.location="UntitledFrameset-5.htm";
}
</SCRIPT>
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>添加成功</title>
</head>
<body>
<%!
void randomNum(int a[],int i,int j)
{
a[i]=1+(int)(Math.random()*j);
for(int c=i-1;c>=0;c--)
{
if(a[i]==a[c])
randomNum(a,i,j);
}
}
%>
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String driver = "jdbc:odbc:try";
String user="jsp";
String password="820728";
Connection conn = DriverManager.getConnection(driver,"sa","sa");
Statement stmt = conn.createStatement();
//读取表单内容
int shijuanbianhao=Integer.parseInt(request.getParameter("shijuanbianhao"));
System.out.println('1');
String sql="SELECT * FROM shijuan where shijuanbianhao="+shijuanbianhao;
System.out.println('2');
ResultSet rs=stmt.executeQuery(sql);
System.out.println('3');
if(rs.next())
{%>
<p>本试卷编号已经存在,请重新选择填写编号。</p>
<p><input type="button" name="fafa" value="返回上一步" onclick="backward()"></p>
<%}
else{
int xuanzeshumu=Integer.parseInt(request.getParameter("xuanzeshumu"));
int xuanzefenzhi=Integer.parseInt(request.getParameter("xuanzefenzhi"));
int panduanshumu=Integer.parseInt(request.getParameter("panduanshumu"));
int panduanfenzhi=Integer.parseInt(request.getParameter("panduanfenzhi"));
int zhuguanshumu=Integer.parseInt(request.getParameter("zhuguanshumu"));
int zhuguanfenzhi=0;
int kaoshishijian=Integer.parseInt(request.getParameter("kaoshishijian"));
int i=0;
int j[]=new int [30];
System.out.println('4');
for(i=0;i<xuanzeshumu;i++)
{
randomNum(j,i,30);
sql="SELECT * from xuanzeti where id="+j[i];
rs=stmt.executeQuery(sql);
// while(rs.next()){
rs.next();
int id=Integer.parseInt(rs.getString("id"));
String timu=rs.getString("tigan");
System.out.println(timu);
String timuleixing="xuanzeti";
String sql1="insert into shijuan values('"+shijuanbianhao+"','"+timu+"','"+xuanzefenzhi+"','"+timuleixing+"','"+id+"','"+kaoshishijian+"')";
stmt.executeUpdate(sql1);
//}
}
System.out.println('5');
for(i=0;i<panduanshumu;i++)
{
randomNum(j,i,20);
sql="SELECT * from panduanti where id="+j[i];
rs=stmt.executeQuery(sql);
rs.next();
int id=Integer.parseInt(rs.getString("id"));
String timu=rs.getString("tigan");
String timuleixing="panduanti";
String sql1="insert into shijuan values('"+shijuanbianhao+"','"+timu+"','"+panduanfenzhi+"','"+timuleixing+"','"+id+"','"+kaoshishijian+"')";
stmt.executeUpdate(sql1);
}
System.out.println('6');
for(i=0;i<zhuguanshumu;i++)
{
randomNum(j,i,20);
sql="SELECT * from zhuguanti where id="+j[i];
rs=stmt.executeQuery(sql);
// while(rs.next()){
rs.next();
int id=Integer.parseInt(rs.getString("id"));
String timu=rs.getString("tigan");
String timuleixing="zhuguanti";
zhuguanfenzhi=(100-xuanzefenzhi*xuanzeshumu-panduanfenzhi*panduanshumu)/zhuguanshumu;
String sql1="insert into shijuan values('"+shijuanbianhao+"','"+timu+"','"+zhuguanfenzhi+"','"+timuleixing+"','"+id+"','"+kaoshishijian+"')";
stmt.executeUpdate(sql1);
}
System.out.println('7');
//rs.close();
stmt.close();
conn.close();
System.out.println('8');
}
%>
<p></p>
</body>
</html>
4.2 在线考试模块的实现
该模块主要由shijuanbiao.jsp和kaoshi.jsp两个页面来实现。shijuanbiao.jsp页面是试卷选择页面,在IE中输入http://localhost:8080/test/shijuanbiao.jsp,进入试卷选择页面,选择一份试卷,程序把试卷编号提交给kaosh.jsp页面,kaosh.jsp根据提交的试卷编号显示出试卷内容,考生即可进行考试了。
1. kaosjh.jsp
程序说明:考试页面。
程序模块名称:kaoshi.jsp。
相关数据库:试卷表shijuan、题目类型表timuleixing.
kaoshi.jsp页面的代码:
<%@ page contentType="text/html; charset=gb2312" language="java"
import = "java.sql.*,MyBean.dbcon" errorPage=""
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>在线考试</title>
</head>
<body>
<%
request.setC
展开阅读全文