admin 管理员组

文章数量: 1086019


2024年6月14日发(作者:vs安装教程详解)

专业资料参考

毕业设计说明书

基于Web的网络在线考试系统的

设计与实现

word格式整理

专业资料参考

基于Web的网络在线考试系统的设计与实现

摘 要:

随着信息技术的飞速发展,依赖计算机互联网技术的在线考试系统也蓬勃

发展。在线考试系统旨在实现考试的无纸化管理,基于计算机和网络技术进行在线

考试系统的使用,既方便了校方对考试的管理,也方便了考生,尤其适合考生分布

广,不易集中的远程教育。因此,利用在线考试系统,可以帮助教育培训机构进行

更系统、更科学的管理。在线考试系统作为一种崭新的、有着极大优越性的教学评

价手段,正日益成为数据库管理技术广泛应用的一个热点研究方向。

在线考试系统实现了系统管理、考生管理、在线考试、在线制作试卷、控制学

生考试、试卷审批等基本功能。系统提出了网络在线考试系统的完整解决方案,实

现了题目分类的特殊原则:考试题目,试题类型,难度,分数等由命题人自己定制。

系统可以完成试卷的定制,试卷的自动生成,并可以对试卷进行修改。

系统采用B/S开发模式,以Java作为开发平台,结合JSP、JavaScript、Html等

语言,以Tomcat为服务器和SQL Server 2000为后台数据库。整个系统层次结构简单,

操作容易,并具备一定的安全性。考生借助此系统,可以随时随地的进行课程结业

考试。同样,老师使用该系统能更高效、更便捷的组织在线考试。

关键词

:在线考试系统;B/S模式;SQL Server 2000数据库

word格式整理

专业资料参考

The Design and Implementation of the Web-based Online

Examination System

Abstract:

With the advent of information technology, the online examination

system which rely on the Internet technology grows rapidly. The online

examination system aims at achieving the paperless examination management.

The online examination system, which bases on computer and network technology,

is convenience for the exam management, but also for the students.

Simultaneously, such a system is absolutely suitable for the students in

distance education who are dispersive and difficult to concentrate on the

course. So, utilize the online examination system can help education and

training organizations to carry on more systematic, more scientific

management. As a kind of new teaching method that with great superiority,

the online examination system is becoming a hotspot of database management

gradually.

The online examination system implements the following functions: system

management, examinee management, online examinations, online production of

the papers,control examinations and paper processing. The system puts forward

the complete settlement scheme of online examination system of cross-domain

communication, and realized the classified special principle of title: the

fractions etc are had something made to order by proposition person oneself

degree of difficulty examination questions type examination title. The system

can accomplish having something made to order of examination paper, the

voluntarily formation of examination paper, and can revise.

The system bases on B/S development model, using Java as a development

platform, which utilizes JSP, JavaScript, and Html language as well. The web

server is Tomcat. Database server is SQL Server system structure

is simple, easy and safe. Examinee can exam at any time by using the system.

Simultaneously teachers can use the system to organize online examination

word格式整理

专业资料参考

more efficiently and conveniently.

Key words:

The online examination system; B/S pattern; SQL Server 2000

Database

word格式整理

专业资料参考

目 录

1 概述 ............................................................. 1

1.1

课题背景与意义 ................................................. 1

1.1.1 课题开发背景 ................................................. 1

1.1.2 课题开发意义 ................................................. 1

2 开发工具与环境 ................................................... 1

2.1

课题开发工具与环境 ............................................. 1

2.1.1 JAVA和JSP技术简介 ........................................... 1

2.2

SQL Server 2000 服务器 ......................................... 2

2.2.1 SQL Server 概述 .............................................. 2

2.2.2 SQL Server 的主要功能 ........................................ 2

2.3 Tomcat 5.5.17.0服务器架构 ...................................... 3

2.3.1 JDK的安装与配置 .............................................. 3

2.3.2 Tomcat的安装与配置 ........................................... 3

2.4

总体开发 ....................................................... 4

3 系统分析 ......................................................... 4

3.1

需求分析 ....................................................... 4

3.2

可行性研究 ..................................................... 4

3.3

系统目标 ....................................................... 5

3.4

系统功能结构 ................................................... 5

3.5

业务流程图 ..................................................... 6

3.6

开发环境 ....................................................... 6

4 数据库设计 ....................................................... 7

4.1

数据库分析 ..................................................... 7

4.2

数据库概念设计 ................................................. 7

4.3

数据库逻辑结构 ................................................. 9

4.4

数据表之间的关系设计 .......................................... 11

5 详细设计 ........................................................ 12

5.1

前台首页模块设计 .............................................. 12

5.1.1前台首页概述 ................................................. 12

5.1.2 前台首页技术分析 ............................................ 12

5.1.3 前台首页的实现过程 .......................................... 13

5.2

考生信息模块设计 .............................................. 13

5.2.1 考生信息模块概述 ............................................ 13

5.2.2 考生信息模块的技术分析 ...................................... 14

5.2.3 考生注册的实现过程 .......................................... 16

5.2.4 找回密码的实现过程 .......................................... 19

word格式整理

专业资料参考

5.3

在线考试模块设计 .............................................. 21

5.3.1 在线考试模块的概述 .......................................... 21

5.3.2 在线考试模块的技术分析 ...................................... 22

5.3.3 选择考试课程的实现过程 ...................................... 22

5.3.4 随机抽取试题并显示试题的实现过程 ............................ 24

5.3.5 自动阅卷并显示考试成绩的实现过程 ............................ 26

5.4

后台首页模块概述 .............................................. 27

5.5

考试题目管理模块设计 .......................................... 27

5.5.1 考试题目管理模块的概述 ...................................... 27

5.5.2 查看考试题目列表的实现过程 .................................. 28

5.5.3 添加考试题目的实现过程 ...................................... 28

5.6

套题信息管理模块概述 .......................................... 29

5.7

课程信息管理模块概述 .......................................... 30

5.8

考生成绩查询模块概述 .......................................... 30

5.9

考生信息管理模块概述 .......................................... 30

5.10

管理员信息管理模块概述 ....................................... 31

6 软件开发与测试 .................................................. 31

6.1

软件开发技术概述 .............................................. 31

6.2通过Ajax技术实现计时与显示剩余时间 ............................ 31

6.3

软件测试的过程 ................................................ 32

7 结束语 .......................................................... 33

参考文献 .......................................................... 34

致 谢 .......................................................... 35

附 录 .......................................................... 36

附录1 源程序清单 .................................................. 36

附录1.1

公共模块设计 .............................................. 36

附录1.2

考生信息模块设计 .......................................... 42

附录1.3

在线考试模块设计 .......................................... 54

附录1.4

考试题目管理模块设计 ...................................... 61

word格式整理

专业资料参考

基于Web的网络在线考试系统的设计与实现

1 概述

1.1 课题背景与意义

1.1.1 课题开发背景

传统的考试从出题、组卷、印刷,到试卷分发、答题、收卷,再到判卷、公布

成绩,整个过程都需要人工参与,周期长,工作量大,容易出错,还要有适当的保

密工作,使得整个考试的成本较大。所以,实现无纸化、网络化、自动化的计算机

考试系统,具有深远的现实意义和实用价值。

网络考试系统是传统考场的延伸,它可以利用网络的无限广阔空间,随时随地的对

学生进行考试,加上数据库技术的利用,大大简化了传统考试的过程。因此网络考

试系统是电子化教学不可缺少的一个重要环节。

网络考试系统的实现技术有多种,可以采用传统的客户机/服务器型的MIS型架

构,Web技术超越了传统的"客户机/服务器"两层结构,采用了三层体系结构:用户

界面层/事务层/数据库层,因此Web结构有着更好的安全性,在用户机上不需要安装

任何应用程序,应用程序可以安装在事务层所在的计算机上,试题存放在数据库服

务器上,当然,事务层和数据库可以是同一台机器(如果条件允许,还是应该把这

两层分开在不同的计算机上),所以,本文所讨论的考试系统采用Web技术实现。

1.1.2 课题开发意义

用Browser/Web模式来设计考试系统比较合适,服务器端我们采用SQL SERVER数

据库系统和JSP组件来构成考试的应用服务系统;客户端采用浏览器来完成考试全过

程,同时可进行远程系统维护和管理。利用网络和数据库技术,结合目前硬件价格

普遍下跌与宽带网大力建设的有利优势,应用JAVA Server Page技术,开发了基于

B/S模式多用户在线考试系统这一程序。它运用方便、操作简单,效率很高(同时,

它要求计算机配置也很高,尤其是服务器端).基于Web技术的网络考试系统可以借

助于遍布全球的因特网进行,因此考试既可以在本地进行,也可以在异地进行,大

大拓展了考试的灵活性。试卷可以根据题库中的内容即时生成,可避免考试前的压

题;而且可以采用大量标准化试题,从而使用计算机判卷,大大提高阅卷效率;还

可以直接把成绩送到数据库中,进行统计、排序等操作。考生通过姓名、准考证号

码和口令进行登录,考试答案也存放在服务器中,这样考试的公平性、答案的安全

性可以得到有效的保证。因此,采用网络考试方式将是以后考试发展的趋势。

2 开发工具与环境

2.1 课题开发工具与环境

2.1.1 JAVA和JSP技术简介

a) 将内容的生成和显示进行分离

用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页

word格式整理

专业资料参考

面,并使用JSP标识或者小脚本来生成页面上的动态内容(内容是根据请求变化的,

例如请求账户信息)。生成内容的逻辑被封装在标识和JavaBeans组件中,并且捆绑

在脚本中,所有的脚本在服务器端运行。由于核心逻辑被封装在标识和JavaBeans中,

所以Web管理人员和页面设计者,能够编辑和使用JSP页面,而不影响内容的生成。

在服务器端,JSP引擎解释JSP标识和脚本,生成所请求的内容(例如,通过访问

JavaBeans组件,使用JDBC技术访问数据库或者包含文件),并且将结果以HTML(或

者XML)页面的形式发送回浏览器。这既有助于作者保护自己的代码,又能保证任何

基于HTML的Web浏览器的完全可用性。

b) 可重用组件

大多数JSP页面依赖于可重用的、跨平台的组件(JavaBeans)来执行应用程序

所要求的复杂的处理。开发人员能够共享和交换执行普通操作的组件,或者使得这

些组件为更多的使用者和客户团体所使用。基于组件的方法加速了总体开发过程,

并且使得各种组织在他们现有的技能和优化结果的开发努力中得到平衡。

c) 采用标识

Web页面开发人员不会都是熟悉脚本语言的编程人员。JSP技术封装了许多功能,

这些功能是在易用的、与JSP相关的XML标识中进行动态内容生成所需要的。标准的

JSP标识能够访问和实例化JavaBeans组件,设置或者检索组件属性,下载Applet,

以及执行用其他方法更难于编码和耗时的功能。

d) 适应平台

几乎所有平台都支持Java,JSP+JavaBeans几乎可以在所有平台下通行无阻。

从一个平台移植到另外一个平台,JSP和JavaBeans甚至不用重新编译,因为Java字

节码都是标准的与平台无关的。

e) 数据库连接

Java中连接数据库的技术是JDBC,Java程序通过JDBC驱动程序与数据库相连,

执行查询、提取数据等操作。Sun公司还开发了JDBC-ODBC bridge,利用此技术Java

程序可以访问带有ODBC驱动程序的数据库,目前大多数数据库系统都带有ODBC驱动

程序,所以Java程序能访问诸如Oracle、Sybase、MS SQL Server和MS Access等数

据库。

2.2 SQL Server 2000 服务器

2.2.1 SQL Server 概述

SQL Server 是美国Microsoft公司开发的一个关系型数据库管理系统,是目前

世界上最著名的关系数据库管理系统之一。它在性能和可扩展方面确立了世界领先

的地位,是一套完全的数据库和数据分析解决方案,使用户可以快速创建下一代的

可扩展电子商务和数据仓库解决方案。Microsoft SQL Server 2000 在数据库服务

器自动调整和自动管理技术方面在数据库领域中处于领先地位,使客户可以集中精

力处理商业战略上的问题,而不是去细微调整数据库服务器的各项参数。

2.2.2 SQL Server 的主要功能

a) 数据库管理功能

word格式整理

专业资料参考

作为数据库管理系统,SQL Server自然应该具有数据库管理功能。它的数据库

由包含数据的表集合和其他对象(如视图、索引、存储过程和触发器)组成,目的

是为执行与数据有关的活动提供支持。存储在数据库中的数据通常与特定的主题或

过程相关。

b) 数据仓库功能

SQL Server 2000提供了一套全新的综合分析服务系统。分析服务为商业活动提

供了集成的OLAP服务和数据挖掘功能。OLAP可以通过多维存储技术对大型、复杂数

据集执行快速、高级的分析工作。数据挖掘功能能够揭示出隐藏在大量数据中的倾

向及趋势。SQL Server针对包括集成数据挖掘、OLAP服务、安全性服务及通过Internet

对多维数据集进行访问和链接分析提供新的数据仓库功能。

c) 电子商务

SQL Server不仅提供电子商务所需的可伸缩性与可扩展性之外,还提供了丰富

的数据库编程能力,以确保系统的协同工作和灵活性。SQL Server2000不仅支持集

中化数据库管理功能,而且还最大程度地实现了管理与优化工作的自动化,从而,

减轻了有关管理人员的负担。

d) 完备的Web功能

SQL Server2000允许通过HTTP协议,在Web上进行高性能、基于标准的安全访问。

基于Web的客户端拥有访问关系型数据存储和访问分析服务的能力。

e) 分布式数据复制功能

它可以将一个数据库中的数据复制到通过局域网、广域网或Internet网络连接

的不同地点服务器或同一服务器中的不同数据库中,并能够自动保持这些数据同步,

使各个数据库中具有相同的数据。

2.3 Tomcat 5.5.17.0服务器架构

Tomcat 5.5.17.0由Apache组织开发的一种常用Web服务器,提供Web服务。一种

JSP引擎,本身具有Web功能,可以作为独立的Web服务器使用。但是,在作为Web服

务器方面,Tomcat处理静态HTML页面时不如Apache迅速,也没有Apache健壮,一般

选用Tomcat与Apache结合的方式,让后者对网站的静态页面的请求提供服务,而

Tomcat作为专用的JSP引擎,提供JSP 解析,得以更好的性能。

2.3.1 JDK的安装与配置

a) 找到path变量后单击[编辑]按钮;弹出[编辑系统变量]对话框。在[变量值]

文本框中输入“c:jdkbin”,然后单击[确定]按钮。同时新建classpath变量。

b) 在[系统变量]选项组中单击[新建]按钮,在[变量名]文本框中输入

“classpath”,在[变量值]文本框中输入“c:;

c:;” 然后单击[确定]按钮。

c) 用同样的方法把c:jdk添加到JAVA_HOME环境变量中。

2.3.2 Tomcat的安装与配置

在这里我们设默认安装目录为c:Tomcat安装完毕,更改环境变量,用同样的

word格式整理

专业资料参考

方法把c:Tomcat添加到TOMCAT_HOME环境变量中。启动Tomcat,在浏览器的[地址]

下拉列表框中输入“localhost:8080/”,如果看到的是在左上方有一只可

爱的小猫,则表示Tomcat安装成功。

2.4 总体开发

在线考试系统采用了三层的模式架构:JSP-JavaBean-Sql Server 2000开发,

即前端由JSP网页实现表现逻辑,中间使用JavaBean的组件实现系统内部复杂的业务

逻辑,后端使用Sql Server 2000数据库实现数据逻辑。

系统采用的开发工具是:Myeclipse,Dreamweaver 2004 网页编辑工具;采用的数

据库是:SQL Server 2000;采用的服务器是:Apache Tomcat 5.5.17.0。 其中Java

中连接数据库的技术是JDBC。

3 系统分析

3.1 需求分析

随着社会经济的发展,人们对教育越来越重视。考试是教育中的一个重要环节,

近几年来随着考试的类型不断增加以及考试要求不断提高,传统的考试方式要求教

师打印考卷、监考、批卷、使教师的工作量与来越大,并且这些环节由于全部由人

工完成,非常容易出错。因此,许多学校或考试机构建立网络在线考试网站来降低

管理成本和减少人力物力的投入,同时,为考生提供更全面、更灵活的服务。考生

希望对自己的学习情况进行客观、科学的评价;教务人员希望有效地改进现有的考

试模式,提高考试效率。为了满足考生和教务人员的要求,网络在线考试系统应包

含在线考试、成绩查询等功能,以满足用户的需求。

3.2 可行性研究

可行性分析的目的就是要用最小的代价在尽可能短的时间内确定问题是否能够

解决。通过分析解决方法的利弊,来判定系统目标和规模是否现实,系统完成后所

能带来的效益是否达到值得去投资开发这个系统的程度。网络在线考试系统的可行

性可从以下几个方面考虑。

a) 经济可行性

定期的组织考试是各个院校及时掌握学生学习成绩的有效方式,利用网络在线考

试系统,一方面可以节省人力资源,降低考试成本;另一方面,在线考试系统能够

快速的进行考试和评分,体现出考试的客观和公正性。

b) 技术可行性

开发一个网络在线考试系统,涉及到最核心的技术问题就是如何实现在不刷新页

面的情况下实时显示考试时间及剩余考试时间,并做到到达考试结束时间自动提交

试卷的功能。如果在Ajax技术出现以前,要实现这些功能会比较麻烦,但现在通过

Ajax技术可以轻松实现这些功能,这为网络在线考试系统的开发提供了技术保障。

word格式整理

专业资料参考

3.3 系统目标

根据前面所做的需求分析和用户的需求可知,网络在线考试系统属于中小型的

软件,在系统实施后,应达到以下目标:

a) 具有空间性。被授权的用户可以在异地登录网络在线考试系统,而无需到指

定地点进行考试。

b) 操作简单方便、界面简洁美观。

c) 系统提供考试时间倒计时功能,使考生实时了解考试剩余时间。

d) 随机抽取试题。

e) 实现自动提交试卷的功能。当考试时间到达规定时间时,如果考生还未提交

试卷,系统将自动交卷,以保证考试严肃、公正地进行。

f) 系统自动阅卷,保证成绩真实准确。

g) 考生可以查询考试成绩。

3.4 系统功能结构

根据网络在线考试系统的特点,可以将其分为前台和后台两个部分进行设计。

前台主要用于考生注册和登录系统、在线考试、查询成绩以及修改个人资料等;后

台主要用于管理员对考生信息、课程信息、考题信息和考生成绩信息等进行管理。

网络在线考试系统的前台功能如图3-1所示:

网络在线考试系统的前台

线

退

图3-1 网络在线考试系统的前台功能结构

word格式整理

专业资料参考

网络在线考试系统的后台功能结构如图3-2所示:

网络在线考试系统的后台

退

图3-2 网络在线考试系统的后台功能结构

3.5 业务流程图

网络在线考试的系统流程如图3-3所示:

找回密码

注册

考生登录

前台

首页

成绩查询

在线考试

修改个人资料

自动阅卷并显

示考试成绩

管理员信息管理

管理员

登录

后台

首页

考生信息管理

考生成绩查询

课程信息管理

试题管理

是否同意

考试规则

选择考试课程

准备考试

提交试卷开始考试

图3-3 系统流程图

3.6 开发环境

在开发网络在线考试系统时,需要具备下面的软件环境:

word格式整理

专业资料参考

服务器端:

a) 操作系统:Windows XP。

b) Web服务器:Tomcat5.5。

c) Java开发包:JDK1.5以上。

d) 数据库:SQL Server 2000。

e) 浏览器:IE 6.0。

f) 分辨率:最佳效果为1024*768像素。

客户端:

a) 浏览器:IE 6.0。

b) 分辨率:最佳效果为1024*768像素。

4 数据库设计

4.1 数据库分析

由于网络在线考试系统对于数据的安全性及完整性要求比较高,并且为了增加

程序的适用范围,还要保证系统可以拥有存储足够多数据的能力。SQL Server 2000

是一种高性能的关系型数据库管理系统,它在SQL Server 7.0的基础上又扩展了系

统性能、可靠性、安全性和易用性,逐渐成为在线事务进程和数据仓库等最好的数

据库平台。综上所述,本系统采用SQL Server 2000数据库。

4.2 数据库概念设计

根据对系统所做的需求分析和系统设计,规划出本系统中使用的数据库实体分

别为考生档案实体、管理员档案实体、课程档案实体、套题实体、考试题目实体和

考生成绩实体。

a) 考生档案实体

考生档案实体包括编号、姓名、密码、性别、注册时间、提示问题、问题答案、

专业和身份证号属性。考生档案实体的E-R图如图4-1所示:

姓名

密码

性别

编号

考生档案

提示问题

身份证号 问题答案

注册时间 专业

图4-1 考生档案实体E-R图

word格式整理

专业资料参考

b) 管理员档案实体

管理员档案实体包括编号、管理员名、管理员密码属性。管理员档案实体的E-R

图如图4-2所示:

管理员姓名

编号 管理员密码

管理员档案

图4-2 管理员档案实体E-R图

c) 课程档案实体

课程档案实体包括课程编号、课程名、添加时间属性。课程档案实体的E-R图

如图4-3所示:

课程名 添加时间

课程编号

课程档案

图4-3 课程档案实体E-R图

d) 考试题目实体

考试题目实体包括编号、问题类型、所属课程、所属套题、选项A、选项B、选

项C、选项D、添加时间、正确答案和备注等属性。考试题目实体的E-R图如图4-4

所示:

所属课程

问题类型

所属套

编号

选项A

考试题目

正确答案

选项

选项

B

B

选项

选项

C

C

选项D

图4-4 考试题目实体E-R图

e) 套题实体

word格式整理

专业资料参考

套题实体包括编号、套题名称、所属课程、和添加时间属性。套题实体的E-R

图如图4-5所示:

套题名称 所属课程

添加时间

编号

套题实体

图4-5 套题实体E-R图

f) 考生成绩实体

考生成绩实体包括编号、准考证号、所属课程、单选题分数、多选题分数、合

计分数、添加时间属性。考生成绩实体的E-R图如图4-6所示:

编号

准考证号

添加时间

合计分数

考生成绩

所属课程

多选题分数 单选题分数

图4-6 考生成绩实体的E-R图

4.3 数据库逻辑结构

a) tb_manager (管理员信息表)

管理员信息表用来保存管理员信息,该表的结构如表4-1所示:

表4-1 tb_manager表的结构

字段名

id

name

pwd

数据类型

bigint(8)

varchar(30)

varchar(30)

是否为空

No

No

No

是否主键

Yes

默认值

Null

Null

描述

ID号

管理员名

管理员密码

b) tb_Student (考生信息表)

考生信息表用来保存考生信息,该表的结构如表4-2所示:

word格式整理

专业资料参考

表4-2 tb_Student表的结构

字段名

id

name

pwd

sex

joinTime

question

answer

prefesion

cardNo

数据类型

bigint(8)

varchar(20)

varchar(20)

varchar(2)

datetime(8)

varchar(50)

varchar(50)

varchar(30)

varchar(18)

是否为空

No

No

No

No

No

No

No

Yes

No

是否主键

Yes

默认值

Null

Null

Null

getdate()

Null

Null

Null

Null

描述

ID号

姓名

密码

性别

注册时间

提示问题

问题答案

专业

身份证号

c) tb_stuResult (考生成绩信息表)

考生成绩信息表用来保存考生成绩,该表中的所属课程字段whichLesson与

tb_Lesson表中的Name字段相关联,并且设置为级联更新。考生成绩信息表的结构

如表4-3所示:

表4-3 tb_stuResult表的结构

字段名

id

stuId

数据类型

bigint(8)

varchar(16)

是否为空

Yes

是否主键

允许为空

默认值

getdate()

描述

ID号

准考证号

所属课程

单选题分数

多选题分数

合计分数

添加时间

whichLesson varchar(60)

resSingle

resMore

resTotal

joinTime

int(4)

int(4)

int(4)

datetime(8)

d) tb_TaoTi (套题信息表)

套题信息表用来保存套题信息,该表中保存着所属套题ID,套题名称,套题所

属课程以及套题的添加时间信息。该表的结构如表4-4所示:

表4-4 tb_TaoTi表的结构

字段名

id

name

LessonId

joinTime

数据类型

bigint(8)

varchar(50)

bigint(8)

datetime(8)

是否为空

Yes

是否主键

Yes

默认值

getDate()

描述

ID号

套题名称

所属课程

添加时间

e) tb_Lesson (课程信息表)

课程信息表用来保存课程信息,该表中保存着所属课程的ID,课程名以及课程

的添加时间信息。该表的结构如表4-5所示:

word格式整理

专业资料参考

表4-5 tb_Lesson表的结构

字段名

id

name

joinTime

数据类型

bigint(8)

varchar(60)

datetime(8)

是否为空

No

No

No

是否主键

Yes

默认值

Null

Null

描述

ID号

课程名

添加时间

f) tb_Questions (考试题目信息表)

考试题目信息表用来保存考试题目信息。考试题目信息表的结构如表4-6所示:

表4-6 tb_Questions表的结构

字段名

id

subject

type

joinTime

LessonId

taotiId

optionA

optionB

optionC

optionD

answer

note

数据类型

bigint(8)

varchar(50)

char(6)

datetime(6)

int(4)

bigint(8)

varchar(50)

varchar(50)

varchar(50)

varchar(50)

varchar(50)

varchar(50)

是否为空

Yes

是否主键

允许为空

默认值

getdate()

描述

ID号

问题

类型

添加时间

所属课程ID

所属套题ID

选项A

选项B

选项C

选项D

正确答案

备注

4.4 数据表之间的关系设计

本系统设计了如图4-7所示的数据表之间的关系,该关系实际上也反映了系统

中各个实体之间的关系。

tb_Student

PKID

name

pwd

sex

joinTi

me

questi

on

answer

profes

sion

cardNO

tb_StuResult

PKID

stuId

whichLesson

resSingle

resMore

resTotal

joinTime

tb_Lesson

PKID

name

joinTime

tb_Question

PKID

subject

type

joinTime

LessonId

optionA

FK1

optionB

optionC

optionD

answer

note

FK2

FK1

tb_manager

PKID

name

pwd

tb_Taoti

PKID

name

LessonID

FK1

joinTime

图4-7 数据表之间的关系图

word格式整理

专业资料参考

5 详细设计

5.1 前台首页模块设计

5.1.1前台首页概述

考生通过“考生登录”模块的验证后,可以登录到网络在线考试的前台首页,

如图5-1所示。前台首页主要用于实现前台功能导航,在该页面中只包括在线考试、

成绩查询、修改个人资料和退出4个导航链接。

图5-1 前台首页的运行效果

5.1.2 前台首页技术分析

由于本系统的前台首页主要用于进行系统导航,所以在实现时,采用了为图像

设置热点的方法,这样可以增加页面的灵活度,使页面不至于太枯燥。下面将对如

何设置图像的热点进行详细介绍。为图像设置热点,也可以称作图像映射,是指一

幅图像可以建立多个超链接,即在图像上定义多个区域,每个区域链接到不同的地

址,这样的区域称为热点。

图像映射有服务器端映射(Server-side-Image Map)和客户端映射

(Client-side-Image Map)两种。目前使用最多的是客户端映射,因为客户端映射

使图像上对应的坐标以及超链接的URL地址都在浏览器读入,省去和服务器之间互

传坐标和URL的时间。

在HTML文件中,使用标记可以为图像设置热点,语法格式如下:

word格式整理

专业资料参考

“描述文字”

“描述文字”

标记中设置属性usemap,确定创建图像热点。标记属性如表5-1

所示:

表5-1 标记的属性

标记的属性

name

shape

coords

href

alt

描述

图像映射的名称

定义图像热点的名称

设定热点区域的图标

设定热点区域的超链接地址

设定热点区域超链接描述文字

在标记中,根据属性shape的取值不同,相应坐标的设定也不同。

5.1.3 前台首页的实现过程

a) 在页面中插入要设置热点的图片,并设置其usemap属性,代码如下:

“0”usemap=“#Map”>

b) 在标记中间插入设置热点区域的代码,具体代码如下:

coords="190,65,190,65,215,82,194,98,105,113,103,81" href="">

href="manage/?action=stuResultQueryS&ID=${student}">

href="manage/?action=modifyQuery&ID=${student}">

href="">

5.2 考生信息模块设计

5.2.1 考生信息模块概述

考生信息模块主要包括考生注册、考生登录、修改个人资料以及找回密码等四

个功能。考生首先要注册成为网站用户,然后才能被授权登录网站进行一系列操作

的权限;登录后考生还可以修改个人的注册资料。如果考生忘记了登录密码,还可

以通过网站提供的找回密码功能快速找回密码。考生信息模块的系统流程如图5-2

所示:

word格式整理

专业资料参考

开始

找回登录密码

找回密码

考生登录

修改个人资料

考生注册

结束

图5-2 考生信息模块的系统流程图

5.2.2 考生信息模块的技术分析

由于本系统采用的是Struts框架,所以在实现考生信息模块时,需要编写考生

信息模块对应的ActionForm类和Action实现类。下面将详细介绍如何编写考生信

息模块的ActionForm类和Action实现类。

a) 编写考生信息模块的ActionForm类

在考生信息模块中,只涉及到数据表tb_Student(考生信息表),虽然根据这个

数据表可以得出考生信息模块的ActionForm类。但是本模块中应用的ActionForm

类中并不是只包括这些属性。由于在修改个人资料时,需要验证输入的原密码是否

正确,所以还需要在考生信息的ActionForm类中添加一个oldpwd属性,同时,在

进行批量删除考生信息时,还需要添加一个保存要删除考生ID号的delldArray属

性,由于是批量属性,所以该属性类型为字符串数组。

public class StudentForm extends ActionForm {

public Date getJoinTime;

private String oldpwd; //原密码

private String[] delIdArray=new String[0];

public Date getJoinTime() {

word格式整理

专业资料参考

return joinTime;

}

public void setJoinTime(Date joinTime) {

me = joinTime;

}

public String[] getDelIdArray(){

return delIdArray;

}

public void setDelIdArray(String[] delIdArray){

rray=delIdArray;

}

}

b) 创建考生信息模块的Action类

考生信息模块的Action实现类Student继承了Action类。在该类中,首先需

要在该类的构造方法中分别实例化考生信息模块的StudentDAO类。Action实现类的

主要方法是execute(),该方法会被自动执行,这个方法本身没有具体的事务,它是

根据HttpServletRequest的getParameter()方法获取的action参数值执行相应方

法的。考生信息模块的Action实现类的关键代码如下:

public class Student extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

String action = ameter("action");

if ("studentQuery".equals(action)) {

return studentQuery(mapping, form, request, response);

} else if ("login".equals(action)) {

return studentLogin(mapping, form, request, response);

} else if ("studentAdd".equals(action)) {

return studentAdd(mapping, form, request, response);

} else if ("studentDel".equals(action)) {

return studentDel(mapping, form, request, response);

} else if ("modifyQuery".equals(action)) {

return modifyQuery(mapping, form, request, response);

} else if ("studentModify".equals(action)) {

return studentModify(mapping, form, request, response);

}else if("seekPwd1".equals(action)){

return seekPwd1(mapping,form,request,response);

word格式整理

专业资料参考

}else if("seekPwd2".equals(action)){

return seekPwd2(mapping,form,request,response);

}else{

ribute("error","您的操作有误!");//将错误信息保存到

error中

return rward("error"); //转到显示错误信息的页

}

}

…//此处省略了该类中其他方法,这些方法将在后面的具体过程中给出

}

5.2.3 考生注册的实现过程

运行网络在线考试系统,首先进入的是考生登录页面,在该页面中单击“注册”

按钮,即可进入考生注册页面,在该页面中输入个人资料及密码等一系列信息,如

图5-3所示。单击“保存”按钮,系统将根据您输入的身份证号进行验证是否已经

注册,如果注册成功,将弹出如图5-4所示的窗口;如果注册失败,将弹出如图5-5

所示的提示框。

图5-3 考生注册界面的运行效果

word格式整理

专业资料参考

图5-4 注册成功对话框

图5-5 注册失败对话框

a) 设计添加注册信息页面

添加注册信息页面主要用于收集输入的考生注册信息,及通过自定义的

JavaScript的函数验证输入信息是否合法。在设置用于收集注册信息的表单时,采

用的是Struts框架的HTML标签实现的,关键代码如下:

onsubmit="return checkForm(studentForm)">

考生姓名:

密码:

确认密码:

别:

提示问题:

问题答案:

专业:

身份证号:

word格式整理

专业资料参考

onclick="=''"/>

b) 修改考生信息的Action实现类

在添加注册信息页面中输入合法的注册信息后,单击“保存”按钮,网页会访

问一个URL,这个URL是/manage/?action=studentAdd。从该URL地址中

可以知道添加注册信息页面涉及到的action参数值为studentAdd,也就是当

action=studentAdd时,会调用保存考生注册信息的customerAdd()。在该方法中,

首先需要将接收到的表单信息强制转换成ActionForm类型,然后调用StudentDAO

类中的insert()方法,将考生信息保存到数据表中,并将返回值保存到变量ret中,

如果返回值为re,表示该考生信息已经注册,将提示信息“您已经注册,直接登录

即可!”保存到HttpServletRequest对象的error参数中,然后将页面重定向到错

误提示信息页面;否则,如果返回值为miss,表示注册失败,将错误提示信息“注

册失败”保存到HttpServletRequest对象的error参数中,然后将页面重定向到错

误提示信息页面;否则表示注册成功,将返回的准考证号保存到HttpServletRequest

对象的ret参数中,然后将页面重定向到考生注册成功页面。保存考生注册信息的

方法studentAdd()的具体代码如下:

private ActionForward studentAdd(ActionMapping mapping, ActionForm

form,HttpServletRequest request, HttpServletResponse response) {

StudentForm studentForm = (StudentForm) form;

String ret = (studentForm);

if (("re")) {

ribute("error", "您已经注册,直接登录即可!");

return rward("error");

} else if(("miss")){

ribute("error", "注册失败!");

return rward("error");

}else{

ribute("ret",ret);

return rward("studentAdd");

}

}

c) 编写保存考生注册信息的StudentDAO类的方法

保存考生信息使用的StudentDAO类的方法是insert()。在insert()方法中,

首先从数据表tb_student中查询输入的身份证号是否存在,如果存在,将标志变量

设置为2;否则,先生成准考证号,再将输入的信息保存到考生信息表中,并将生成

的准考证号赋给标志变量,最后返回该标识变量。

word格式整理

专业资料参考

5.2.4 找回密码的实现过程

运行网络在线考试系统时,首先进入的是考生登录页面,在该页面中单击“找

回密码”按钮,即可进入到找回密码第一步页面,如图5-6所示,用于输入准考证

号,在该页面中输入准考证号。单击“下一步”按钮,即可进入到找回密码第二步

页面,如图5-7所示,用于输入密码提示问题答案,在该页面的“密码提示问题”

文本框中将显示提示问题,在“密码提示答案”文本框中输入密码提示问题的答案。

单击“下一步”按钮,进入到找回密码第三步页面,如图5-8所示,用于显示找回

的密码。

图5-6 找回密码第一步

图5-7 找回密码第二步

word格式整理

专业资料参考

图5-8 找回密码第三步

a) 实现找回密码第一步---输入准考证号

在找回密码第一步页面中,只需要放置一个用于获取准考证号的表单及对应的

表单元素即可,关键代码如下:

onsubmit="return checkForm(studentForm)">

准考证号:

onclick="=''"/>

找回密码第一步对应的方法seekPwd1()的具体代码如下:

private ActionForward seekPwd1(ActionMapping mapping, ActionForm

form,HttpServletRequest request,HttpServletResponse response){

StudentForm studentForm = (StudentForm) form;

StudentForm s=d(studentForm);

ribute("seekPwd2", s);

if(().equals("")){

ribute("error", "您输入的准考证号不存在!");

return rward("error");

}else{

return rward("seekPwd1");

} }

word格式整理

专业资料参考

b) 实现找回密码第二步---输入密码提示问题答案

在找回密码第二步页面中,首先添加一个表单,并将第一步中返回的提示问题

答案显示在相应的文本框中,然后在该表单中添加一个用于记录考生档案ID的隐藏

域,最后在该表单中添加用于输入密码提示问题答案的文本框及相应的按钮,关键

代码如下:

onsubmit="return checkForm(studentForm)">

密码提示问题:

readonly="true"/>

密码提示答案:

c) 实现找回密码第三步---成功找回密码

准考证号:

readonly="true"/>

密码

5.3 在线考试模块设计

5.3.1 在线考试模块的概述

在线考试模块的主要功能是允许考生在网站上针对指定的课程进行考试。在该

模块中,考生首先需要阅读考试规则,在同意所列出的考试规则后,才能选择考试,

在选择考试课程后,系统将随机抽取试题,然后进入考试页面进行答题,当考生提

交试卷或者到达考试结束时间时,系统将自动对考生提交的试卷进行评分,并给出

最终考试成绩。在线考试模块的系统流程如图5-9所示:

开始

同意考试规则

选择考试课程

准备考试

显示本次考试成绩

随机抽取试题并开始答题

提交试卷/到达考试时间

结束

图5-9 在线考试模块的系统流程图

word格式整理

专业资料参考

5.3.2 在线考试模块的技术分析

由于本系统采用的是Struts框架,所以在实现在线考试模块时,需要编写在线

考试模块对应的ActionForm类和Action类。下面将详细介绍如何编写在线考试模

块的ActionForm类和Action类。

a) 编写在线考试模块的ActionForm类

在线考试模块涉及的数据表是tb_Lesson(课程信息表)、tb_Questions(考试

题目信息表)和tb_stuResult(考试成绩表),通过这3个数据表可以创建出对应的

ActionForm类,可以在各自对应的模块中创建。

b) 创建在线考试模块的Action类

在线考试模块的Action实现类Student继承了Action类。在该类中,首先需

要在该类的构造方法中分别实例化在线考试模块的StartExamDAO类。Action实现类

的主要方法是execute(),该方法会被自动执行,这个方法本身没有具体的事务,它

是根据HttpServletRequest的getParameter()方法获取的action参数值执行相应

方法的。在线考试模块Action实现类的关键代码如下:

public class StartExam extends Action {

… //此处省略了声明并实例化StartExamDAO类的代码

public ActionForward execute(ActionMapping mapping, ActionForm

form,HttpServletRequest request,HttpServletResponse response) {

String action = ameter("action");//获取action参数的值

if ("startExam".equals(action)) {

return startExam(mapping, form, request, response);

}else if("submitTestPaper".equals(action)){

return submitTestPaper(mapping,form,request,response);

}else if("showStartTime".equals(action)){//显示考试计时

return showStartTime(mapping,form,request,response);

}else if("showRemainTime".equals(action)){//显示考试时间

return showRemainTime(mapping,form,request,response);

}else{

ribute("error", "操作失败!");

return rward("error");

}

}

… //此处省略了该类中其他方法,这些方法将在后面的具体过程中给出

}

5.3.3 选择考试课程的实现过程

考生登录到网络在线考试的前台首页后,单击“在线考试”超链接,将进入到

考试规则页面,在该页面中单击“同意”按钮,如图5-10所示,即可进入到选择考

试课程页面,在该页面中将以下拉列表框的形式显示需要参加考试的课程,如图5-11

word格式整理

专业资料参考

所示。如果没有需要考试的课程,系统将给出提示对话框,并返回到网络在线考试

的前台首页,如图5-12所示:

图5-10 运行考试规则的界面

图5-11 选择考试课程的运行结果

图5-12 无考试课程对话框界面

word格式整理

专业资料参考

在考试规则页面中,单击“同意”按钮,将访问一个URL地址,该地址为

/manage/?action=selectLesson,从该URL地址中可以知道选择考试课程

页面涉及到的action的参数值为selectLesson,也就是当action=selectedLesson

时,会调用查询指定考生的课程对应的方法selectLesson()。在该方法中,首先获

取准考证号,然后调用LessonDAO()类中的query()方法,并将获取的准考证号作为

query()方法的参数,最后根据query()方法返回的List集合的大小,转到相应的页

面。查询需要考试的课程的方法selectLesson()的具体代码如下:

private ActionForward selectLesson(ActionMapping mapping, ActionForm

form,HttpServletRequest request, HttpServletResponse response) {

HttpSession session = sion();

String stu=ribute("student").toString();//获取准考证号

List list=(stu); //查询包括考试题目的课程列表,但不

包括已经考过的科目

if(()<1){

return rward("noenLesson");

}else{ ribute("lessonList",list);

return rward("selectLesson");

} }

5.3.4 随机抽取试题并显示试题的实现过程

考生登录到网络在线考试的前台首页后,单击“在线考试”超链接,将进入到

考试规则页面,在该页面中单击“同意”按钮,进入到选择考试课程页面,在该页

面中选择要考试的课程,并单击“确定”按钮,进入到准备考试页面,如图5-13所

示。在该页面中,单击“开始考试”按钮,将关闭当前窗口,并打开新的窗口显示

试题,如图5-14所示:

图5-13 准备考试页面

word格式整理

专业资料参考

图5-14 随机抽取试题并显示试题的运行结果

在准备考试页面中,单击“开始考试”按钮,将调用JavaScript关闭窗口并打

开新的窗口,用于显示试题,具体代码如下:

onclick="=null;();('?act

ion=startExam','','width=786,height=600,scrollbars=1');"/>

a) 随机抽取试题的方法randomGetQuestion()。

在randomGetQuestion()方法中,首先获取指定课程所拥有的套题ID,然后将

获取的套题ID保存到一个数组中,并根据套题的个数获取一个随机数,即保存套题

ID数组的指定下标,最后根据该下标获取对应的套题ID并返回。随机抽取试题的方

法randomGetQuestion()方法的关键代码如下:

public int randomGetQuestion(int lessonID){

int questionsID=0;

String sql="SELECT taoTiID FROM (SELECT distinct lessonID,taoTiID

from"+"(SELECT lessonId,taoTiID FROM tb_questions GROUP BY

taoTiID,lessonID,type)" +"as lessonTaoTi GROUP BY lessonId,taoTiID having

count(taoTiID) >1)as temp" +" WHERE lessonID="+lessonID+"";

ResultSet rs = eQuery(sql);

int i=0;

try {

();

int recordNum=();

();

int[] id=new int[recordNum];

do {

word格式整理

专业资料参考

id[i]=(1);

i++;

}while (());

int rand=(new Random().nextInt());

questionsID=id[rand];

} catch (Exception ex) {

tackTrace();

}

return questionsID; }

b) 开始考试时保存考试成绩的方法startSaveResult()。

为了防止试题泄露,可以通过在开始考试时先将考试信息保存到考生成绩表中,

然后等提交试卷时,再修改考试成绩实现,这样即使考生并不提交试卷,下次也一

样不能再进行考试了。在startSaveResult()方法中,需要根据传递的课程ID参数

获取对应的课程名称,然后再将准考证号、所属课程及单选题成绩(设置为0)和多

选题成绩(设置为0)保存到考生成绩表信息表中。开始考试时保存考试成绩的方法

startSaveResult()的关键代码如下:

public int startSaveResult(String studentID,int lessonID){

String lesson=((LessonForm)(lessonID).get(0)).getName();

String sql="INSERT INTO tb_stuResult

(stuId,whichLesson,resSingle,resMore)

values('"+studentID+"','"+lesson+"',0,0)";

int ret=eUpdate(sql);

return ret; }

c) 获取试题的方法queryExam()。

queryExam()方法包含两个参数,一个用于指定套题ID,另一个用于指定试题类

型的参数,如果该参数的值为0,就代表查询指定套题中的单选题,否则为1,就代

表查询多选题,在将试题保存到对应的ActionForm中时,还需要先将字符型的正确

答案分割为数组,再保存到相应属性中。

5.3.5 自动阅卷并显示考试成绩的实现过程

在显示试题页面中,单击“交卷”按钮或是到达考试结束时间时,系统将自动

阅卷并将考试成绩以对话框的形式反馈给考生,如图5-15所示:

图5-15 显示考试成绩对话框

word格式整理

专业资料参考

5.4 后台首页模块概述

网络在线考试系统的后台首页是管理员对网站信息进行管理的首页面。在该页

面中,管理员可以清楚地了解网站后台管理系统包含的基本操作。网络在线考试系

统后台首页包含的主要模块如下:

a) 管理员信息管理:主要包括管理员信息列表、添加管理员、修改管理员和删

除管理员。

b) 考生信息管理:主要包括查看注册考生信息列表和删除已注册的考生信息。

c) 考生成绩查询:主要用于根据准考证号、考试课程或考试时间模糊查询考生

成绩。

d) 课程信息管理:主要包括查看课程列表、添加课程信息和删除课程信息。

e) 套题信息管理:主要包括查看套题信息列表、添加套题信息、修改套题信息

和删除套题信息。

f) 考试题目管理:主要包括查看考试题目列表、添加考试题目、修改考试题目

和删除考试题目。

g) 退出管理:主要用于退出后台管理系统。

为了方便管理员管理,在网络在线考试系统的后台首页中显示考生成绩查询页

面,其运行结果如图5-16所示:

图5-16 网络在线考试系统的后台首页的运行结果

5.5 考试题目管理模块设计

5.5.1 考试题目管理模块的概述

考试题目管理模块主要包括查看考试题目列表、添加考试题目信息、修改考试

题目信息和删除考试题目信息4个功能。考试题目管理模块的框架如图5-17所示:

word格式整理

专业资料参考

开始

考试题目列表

查看考试题目列表 添加考试题目信息 修改考试题目信息 删除考试题目信息

图5-17 考试题目管理模块的框架图

5.5.2 查看考试题目列表的实现过程

管理员登录后,单击“考试题目管理”超链接,进入到查看考试题目列表页面,

在该页面中将以列表形式显示全部考试题目信息,同时提供添加考试题目、修改考

试题目和删除考试题目的超链接。查看考试题目列表页面的运行效果如图5-18所示:

图5-18 查看考试题目列表页面的运行效果

5.5.3 添加考试题目的实现过程

管理员登录系统后,单击“考试题目管理”超链接,进入到查看考试题目列表

页面,在该页面中单击“添加考试题目”超链接,进入到添加考试题目页面。在该

页面的“属性课程”下拉列表框中选择“计算机专业英语”,在“所属套题”下拉列

表框中将显示该课程对应的套题名称。添加考试题目页面的运行结果如图5-19所示:

word格式整理

专业资料参考

图5-19 添加考试题目页面的运行结果

5.6 套题信息管理模块概述

套题信息管理模块主要包括修改套题信息、添加套题和删除套题3个功能。如

果想要修改套题信息,单击“修改按钮”,跳出如图5-20所示的页面,可以修改套

题名称,该套题所属课程,单击“保存”按钮,修改套题信息就成功了。如果要添

加套题,就单击“添加”按钮,输入套题名称,并选择该套题所属课程,点击“保

存”按钮,完成了套题的添加。删除套题的方法类似。

图5-20 修改套题信息页面的运行效果

word格式整理

专业资料参考

5.7 课程信息管理模块概述

课程信息管理模块主要包括查看课程信息、添加课程和删除课程3个功能。如

果想要添加课程,单击“添加课程”,跳出如图5-21所示的页面,填写课程名称后,

单击“保存”按钮,添加课程就成功了。如果要删除套题,就单击“删除”按钮,

确认删除。

图5-21 添加课程信息页面运行结果

5.8 考生成绩查询模块概述

考生成绩查询模块可以按照准考证号、考试课程和考试时间3种查询条件来查

询成绩,或者也可以输入关键字来进行查询考生的成绩。如图5-22所示:

图5-22 考生成绩查询页面的运行效果

5.9 考生信息管理模块概述

考生信息管理模块主要包括查看注册考生信息列表和删除已注册的考生信息2

word格式整理

专业资料参考

个功能。

5.10 管理员信息管理模块概述

管理员信息管理主要包括管理员信息列表、添加管理员、修改管理员和删除管

理员。如果要添加管理员,单击“添加管理员信息”按钮,跳出如图5-23所示的对

话框,输入管理员名称,密码,并进行确认密码后,点击“保存”按钮,就可以完

成管理员信息的添加了。删除管理员,点击“删除”按钮,确认是否删除后,就可

以完成操作。

图5-23 添加管理员信息页面运行结果

6 软件开发与测试

6.1 软件开发技术概述

Ajax技术是Asynchronous JavaScript and XML的缩写,意思是异步的JavaScript

和XML。Ajax并不是一门新的语言或技术,它是JavaScript、XML、CSS、DOM等多种

已有技术的组合,它可以实现客户端的异步请求操作。这样可以实现在不需要刷新

页面的情况下与服务器进行通信的效果,从而减少了用户的等待时间。

6.2通过Ajax技术实现计时与显示剩余时间

在通过Ajax技术实现计时与显示剩余时间,首先需要创建一个封装Ajax必须实

现的功能的对象AjaxRequest,并将其代码保存为,然后在开始考试

页面中包含该文件,具体代码如下:

由于通过Ajax技术实现计时与显示剩余时间表的方法类似,下面以实现自动计

时为例进行介绍。

编写调用AjaxRequest对象的函数、错误处理函数和返回值处理函数,具体代码

如下:

计时方法showStartTime()中,首先需要获取保存在Session中的考试开始时间,

并将其转化为对应的毫秒数,然后获取当前时间的毫秒数;再应用这两个时间生成

两位的小时数、分钟数和秒数,并组合为新的时间;最后将其保存到showStartTime

参数中,并转到输出计时时间的页面。计时的方法showStartTime()的具体代码如下:

private ActionForward showStartTime(ActionMapping mapping, ActionForm

form, HttpServletRequest request, HttpServletResponse response) {

HttpSession session = sion();

String startTime=ribute("startTime").toString();

long a=ong(startTime);

long b=new ().getTime();

}

int h=(int)((b-a)/3600000);

String hour=NO(h,2);

int m=(int)(b-a)%3600000/60000;

String minute=NO(m,2);

int s=(int)((b-a)%3600000)%60000/1000;

String second=NO(s,2);

String time=hour+":"+minute+":"+second;

ribute("showStartTime",time);

return rward("showStartTime");

6.3 软件测试的过程

软件测试是为了发现错误而执行程序的过程。或者说,软件测试是根据软件开

发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其

预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。

软件开发是一个自顶向下,逐步细化的过程,而测试过程则是依相反顺序安排

的自底向上,逐步集成的过程。低一级测试为上一级测试准备条件。如图6-1所示:

首先对每一个程序模块进行单元测试,消除程序模块内部在逻辑上和功能上的错误

和缺陷。再对照软件设计进行集成测试。最后从系统全体出发,运行系统,看是否

满足要求。

word格式整理

专业资料参考

需求

分析

说明

需求分析 设计 编程

确认测试 集成测试 单元测试

概要

设计

说明

详细

设计

说明

源程

序代

图6-1 软件测试与软件开发过程的关系

7 结束语

此次毕业设计我基本完成了一个基于Web的网络在线考试系统的设计与实现,选

择这个课题一方面是根据现在考试形势变革的需要,要求用一种快速、安全、高效

的途径解决现行考试模式的一些不足,有利于教学改革,并且国内基于网络的远程

教学正处于迅速崛起的发展阶段,迫切需要一个能够很好地支持教师教学、学生学

习的专用远程教学平台,与此同时更需要一个测试教学成果的平台。本系统可以为

远程教学提供强有力网络在线考试的支持,可以与网络课程紧密整合,无缝的集成

到远程教学支持平台中。另一方面JAVA和JSP提供了一种解决这个问题的优秀语言工

具。本系统有如下特点:方便、可靠、操作简单、使用高效、可扩展性良好,但是

安全性能不够高,还需要改进。

通过这次设计,我不仅提高了理论结合实际的能力,也从设计的过程中学习到

了很多与理论有一定差距的东西,提高了自己独立分析问题解决问题的能力。

本次设计过程中我有一点很重要的体会:设计者的架构对整个程序的开发进程

十分重要,一个良好的程序架构对开发者来说有事半功倍的效果,而对语言环境的

要求则不会太高。

由于开发时间限制,系统架构基本形成,功能基本完善,但是由于经验不足,

系统还需要进一步完善,使之具有更广泛的应用范畴和更合适解决问题的方案。

word格式整理

专业资料参考

参考文献

[1] 刘东祥.动态网页JSP技术探究[J].时代教育,2008,(10):14-17.

[2] 何文辉.基于JSP的动态网站开发技术[J].吉林省教育学院学报,2008,(8):18-20.

[3] 方文,魏志贤.网络考试系统分析[J].山东行政学院山东省经济管理干部学院学报,

2008,(12):13-15.

[4] 郭利周,于长虹,郭晓萍.基于的网上考试安全体系的设计与构建[J].洛阳师范学院学

报,2007,(5):25-28.

[5] 周玫,袁振武.浅谈在线考试系统[J].科技广场,2008,(7):11-14.

[6] 邓子云,张赐编著.JSP网络编程从基础到实践[M].北京:电子工业出版社,2005.

[7] 四维科技,杨易编著.JSP网络编程技术与案例[M].北京:人民邮电出版社,2006.

[8] 汪孝宜,刘中兵,徐佳晶等编著.JSP数据库开发实例精粹[M].北京:电子工业出版社,2005.

[9] 刘中兵,李伯华,邹晨编著.JSP数据库项目案例导航[M].北京:清华大学出版社,2006.

[10] 覃远霞.在线考试系统的设计与运用[J].应用科学,2008,(1):34-36.

word格式整理

专业资料参考

致 谢

值此提交本文之际,我首先要向导师韩立毛老师表示衷心的感谢。我的课题是

在韩立毛老师的亲切关怀和悉心指导下完成的。没有老师的悉心指导,就没有本次

毕业论文的顺利完成。他渊博的学识、敏锐而超前的学术意识、民主而严谨的治学

作风使我受益匪浅,并激励我在今后的工作、学习和生活中,时刻保持勤奋刻苦的

工作态度和求实创新的敬业精神。

同时我还要感谢身边同学的支持与鼓励,感谢同组的同学在毕业设计期间给了

我莫大的帮助,使我顺利地完成本次的毕业设计。

最后我还要感谢含辛茹苦地培养我长大的父母,谢谢你们!

陈唯燕

二〇〇九年五月三十日

word格式整理

专业资料参考

附 录

附录1 源程序清单

附录1.1 公共模块设计

package ; //将该类保存到包中

import tream; //导入tream类

import .*; //导入包中的所有类

import ties; //导入ties类

public class ConnDB {

public Connection conn = null; // 声明Connection对象的实例

public Statement stmt = null; // 声明Statement对象的实例

public ResultSet rs = null; // 声明ResultSet对象的实例

private static String propFileName = "/com/ties"; // 指定资源文件保

private static Properties prop = new Properties(); // 创建并实例化Properties对

private

private

static

static

String

String

dbClassName

dbUrl

=

=

存的位置

象的实例

"verDriver";

"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_netExam";

private static String dbUser = "sa";

private static String dbPwd = "";

public ConnDB() { //定义构造方法

}

public static Connection getConnection() {

Connection conn = null;

try {

}

//捕捉异常

//将Properties文件读取到InputStream对象中

InputStream in = getClass().getResourceAsStream(propFileName);

(in); // 通过输入流对象加载Properties文件

dbClassName = perty("DB_CLASS_NAME"); // 获取数据库驱动

dbUrl = perty("DB_URL", dbUrl);

dbPwd = perty("DB_PWD", dbPwd);

tackTrace(); // 输出异常信息

//获取URL

//获取密码

dbUser = perty("DB_USER", dbUser); //获取登录用户

} catch (Exception e) {

word格式整理

专业资料参考

}

try {

}

if (conn == null) {

}

return conn;

.println("警告: nection() 获得数据库

+ dbClassName

+ "rn链接位置:"

+ dbUrl

+ "rn用户/密码"

+ dbUser + "/" + dbPwd);

e(dbClassName).newInstance();

conn = nection(dbUrl, dbUser, dbPwd);

tackTrace();

} catch (Exception ee) {

链接失败.rnrn链接类型:"

public ResultSet executeQuery(String sql) {

}

public int executeUpdate(String sql) {

int result = 0; // 定义保存返回值的变量

try { // 捕捉异常

conn = getConnection(); // 调用getConnection()方法构造Connection对象的

stmt = Statement(_SCROLL_INSENSITIVE,

_READ_ONLY);

result = eUpdate(sql); // 执行更新操作

try { // 捕捉异常

}

return rs; // 返回结果集对象

conn = getConnection(); // 调用getConnection()方法构造Connection对象的

stmt = Statement(_SCROLL_INSENSITIVE,

_READ_ONLY);

rs = eQuery(sql);

n(sage()); // 输出异常信息

一个实例conn

} catch (SQLException ex) {

一个实例conn

word格式整理

专业资料参考

}

}

} catch (SQLException ex) {

}

return result; // 返回保存返回值的变量

result = 0; // 将保存返回值的变量赋值为0

public void close() {

}

try { // 捕捉异常

}

if (rs != null) { // 当ResultSet对象的实例rs不为空时

}

if (stmt != null) { // 当Statement对象的实例stmt不为空时

}

if (conn != null) { // 当Connection对象的实例conn不为空时

}

tackTrace(); // 输出异常信息

(); // 关闭Connection对象

(); // 关闭Statement对象

(); // 关闭ResultSet对象

} catch (Exception e) {

package ;

import Format;

public class ChStr {

public String formatNO(int str, int length) {

float ver = loat(perty(

"n")); //获取JDK的版本

String laststr = "";

if (ver < 1.5) { //JDK1.5以下版本执行的语句

try {

NumberFormat formater = berInstance();

并实例化NumberFormat的一个实例

imumIntegerDigits(length);

} catch (Exception e) {

n("格式化字符串时的错误信息:" + sage());

//输出异常信息

//指定

laststr = (str).toString().replace(",", "");

//声明

word格式整理

专业资料参考

}

} else { //JDK1.5版本执行的语句

元素

laststr = ("%0"+length+"d", arr);

}

return laststr;

}

}

version="2.4" xmlns:xsi="/2001/XMLSchema-instance"

xsi:schemaLocation="/xml/ns/j2ee

/xml/ns/j2ee/web-app_2_">

action

Servlet

config

/WEB-INF/

debug

3

detail

3

0

action

*.do

Integer[] arr=new Integer[1];

arr[0]=new Integer(str);

//声明并初始化数组arr

//将要格式化的数字str赋值给数组arr的第一个

word格式整理

专业资料参考

Configuration 1.2//EN" "/dtds/struts-config_1_">

/>

name="managerForm" path="/manage/manager" scope="request"

type="r" validate="true">

name="managerLoginok"

path="/manage/?action=stuResultQuery" />

type="t" validate="true">

word格式整理

专业资料参考

type="xam">

type="" validate="true">

type="" validate="true">

word格式整理

专业资料参考

type="ons" validate="true">

type="ult" validate="true">

type="ult" validate="true">

附录1.2 考生信息模块设计

package Form;

import ;

import rvletRequest;

import Errors;

word格式整理

专业资料参考

import Form;

import Mapping;

public class StudentForm extends ActionForm {

private String sex;

private String pwd;

private Date joinTime;

private String profession;

private String name;

private String answer;

private String ID;

private String question;

private String cardNo;

private String oldpwd; //原密码

private String[] delIdArray=new String[0];

public String getSex() {

}

public void setSex(String sex) {

}

public String getPwd() {

}

public void setPwd(String pwd) {

}

public Date getJoinTime() {

}

public void setJoinTime(Date joinTime) {

}

public String getProfession() {

}

public void setProfession(String profession) {

}

sion = profession;

return profession;

me = joinTime;

return joinTime;

= pwd;

return pwd;

= sex;

return sex;

word格式整理

专业资料参考

public String getName() {

}

public void setName(String name) {

}

public String getAnswer() {

}

public void setAnswer(String answer) {

}

public String getID() {

}

public void setID(String ID) {

}

public String getQuestion() {

}

public void setQuestion(String question) {

}

}

public void setCardNo(String cardNo) {

= cardNo;

}

public String[] getDelIdArray(){

}

public void setDelIdArray(String[] delIdArray){

}

public String getOldpwd() {

return oldpwd;

rray=delIdArray;

return delIdArray;

public String getCardNo() {

return cardNo;

on = question;

return question;

= ID;

return ID;

= answer;

return answer;

= name;

return name;

word格式整理

专业资料参考

}

}

public void setOldpwd(String oldpwd) {

}

= oldpwd;

package ;

import .*;

import .*;

import .*;

import ;

import tForm;

import orm;

import tDAO;

public class Student extends Action {

private StudentDAO studentDAO = null;

public Student() {

}

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

String action = ameter("action");

n("获取的查询字符串:" + action);

if ("studentQuery".equals(action)) {

return studentQuery(mapping, form, request, response);

return studentLogin(mapping, form, request, response);

return studentAdd(mapping, form, request, response);

return studentDel(mapping, form, request, response);

return modifyQuery(mapping, form, request, response);

return studentModify(mapping, form, request, response);

return seekPwd1(mapping,form,request,response);

} else if ("login".equals(action)) {

} else if ("studentAdd".equals(action)) {

} else if ("studentDel".equals(action)) {

} else if ("modifyQuery".equals(action)) {

} else if ("studentModify".equals(action)) {

}else if("seekPwd1".equals(action)){

}else if("seekPwd2".equals(action)){

tDAO = new StudentDAO();

word格式整理

专业资料参考

}

}

return seekPwd2(mapping,form,request,response);

ribute("error","您的操作有误!");

return rward("error");

//将错误信息保存到

//转到显示错误信息

}else{

error中

的页面

// 考生身份验证

public ActionForward studentLogin(ActionMapping mapping, ActionForm form,

}

// 查询考生信息

private ActionForward studentQuery(ActionMapping mapping, ActionForm form,

}

// 添加考生注册信息

private ActionForward studentAdd(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

StudentForm studentForm = (StudentForm) form;

String ret = (studentForm);

n("返回值ret:" + ret);

if (("re")) {

ribute("error", "您已经注册,直接登录即可!");

return rward("error");

HttpServletRequest request, HttpServletResponse response) {

ribute("studentQuery", (null));

return rward("studentQuery");

HttpServletRequest request, HttpServletResponse response) {

StudentForm studentForm = (StudentForm) form;

int ret = tudent(studentForm);

("验证结果ret的值:" + ret);

if (ret == 2) {

}

ribute("error", "您输入的考生准考证号码或密码错误!");

return rward("error");

HttpSession session = sion();

ribute("student", ());

return rward("studentLoginok");

} else {

word格式整理

专业资料参考

}

} else if(("miss")){

}

ribute("error", "注册失败!");

return rward("error");

ribute("ret",ret);

return rward("studentAdd");

}else{

// 修改考生信息时查询

private ActionForward modifyQuery(ActionMapping mapping, ActionForm form,

}

private ActionForward seekPwd1(ActionMapping mapping, ActionForm form,

}

private ActionForward seekPwd2(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response){

StudentForm studentForm = (StudentForm) form;

StudentForm s=d2(studentForm);

ribute("seekPwd3", s);

if(().equals("")){

HttpServletRequest request, HttpServletResponse response){

StudentForm studentForm = (StudentForm) form;

StudentForm s=d1(studentForm);

ribute("seekPwd2", s);

if(().equals("")){

}

ribute("error", "您输入的准考证号不存在!");

return rward("error");

return rward("seekPwd1");

HttpServletRequest request, HttpServletResponse response) {

n("获取的ID:"+ameter("ID"));

StudentForm

n("从Bean中获取的ID:"+());

ribute("modifyQuery", studentForm);

return rward("modifyQuery");

studentForm=(StudentForm)((ameter("ID")).get(0));

//找回密码(第一步)

}else{

// 找回密码(第二步)

word格式整理

专业资料参考

}

}

}

ribute("error", "您输入的密码提示问题的答案不正确!");

return rward("error");

return rward("seekPwd2");

}else{

// 修改考生信息

private ActionForward studentModify(ActionMapping mapping, ActionForm form,

}

// 删除考生信息

private ActionForward studentDel(ActionMapping mapping, ActionForm form,

}

HttpServletRequest request, HttpServletResponse response) {

StudentForm studentForm = (StudentForm) form;

int ret = (studentForm);

if (ret == 0) {

}

ribute("error", "删除考生信息失败!");

return rward("error");

return rward("studentDel");

HttpServletRequest request, HttpServletResponse response) {

StudentForm studentForm = (StudentForm) form;

int ret = (studentForm);

if (ret == 0) {

}

ribute("error", "修改考生信息失败!");

return rward("error");

return rward("studentModify");

} else {

} else {

package ;

import tForm;

import ;

import ;

import .*;

import DateFormat;

word格式整理

专业资料参考

import .*;

import Format;

public class StudentDAO {

private ConnDB conn=new ConnDB();

private ChStr chStr=new ChStr();

//考生身份验证

public int checkStudent(StudentForm studentForm) {

int flag = 1;

String sql = "SELECT * FROM tb_student where ID='" +

()+ "'";

ResultSet rs = eQuery(sql);

try {

if (()) {

String pwd = ();

if ((ing(3))) {

();

int rowSum = (); //获取记录总数

();

if (rowSum!=1) {

flag = 2;

("获取row的值:" + sql + rowSum);

}

} else {

flag = 2;

}

}else{

flag = 2;

}

} catch (Exception ex) {

flag = 2;

n(sage());

}

return flag;

}

//添加数据

public String insert(StudentForm s) {

String sql1="SELECT * FROM tb_student WHERE cardNo='"+dNo()+"'";

ResultSet rs = eQuery(sql1); //执行SQL

word格式整理

专业资料参考

查询语句

String sql = "";

String falg = "miss";

返回信息的变量

String ID="";

try {

if (()) {

存在记录

falg="re";

已经注册

} else {

/*****************自动生成准考证号

***********************************************/

最大的准考证号

date=new (); //实例

化()类

String newTime=new SimpleDateFormat("yyyyMMdd").format(date);

if(rs_()){

String max_ID=rs_ing(1); //获取最大

//格式化当前日期

String sql_max="SELECT max(ID) FROM tb_student";

ResultSet rs_max=eQuery(sql_max); //查询

//表示考生信息

//假如

//用于记录

的准考证号

编号格式化为6位

注册时

考证号

int newId=nt(max_ing(10,16))+1;//取

String no=NO(newId,6);

ID="CN"+newTime+no;

//将生成的

出最大准考证号中的数字编号+1

//组合完整的准考证

//当第一个考生

//生成第一个准

}else{

}

sql

ID="CN"+newTime+"000001";

/********************************************************************************/

= "INSERT

"','"

INTO tb_student

+e()

(ID,name,pwd,sex,question,answer,profession,cardNo) values('" +

ID+

word格式整理

专业资料参考

+"','"+()+"','"+()+"','"+stion()+

"','"+wer()+"','"+fession()+"','"+dNo()+"')";

int ret= eUpdate(sql);

注册信息

if(ret==0){

注册失败

}else{

生成的准考证号

}

();

数据库连接

}

} catch (Exception e) {

falg="miss";

n("添加考生信息时的错误信息:"+sage());

//输出错误提示信息到控制台

}

return falg;

}

//查询方法

public List query(String id) {

List studentList = new ArrayList();

StudentForm studentForm1 = null;

String sql="";

if(id==null ||("")){

sql = "SELECT * FROM tb_student ORDER BY joinTime DESC";

}else{

}

ResultSet rs = eQuery(sql);

try {

while (()) {

studentForm1 = new StudentForm();

(ing(1));

e(ing(2));

sql = "SELECT * FROM tb_student WHERE id='" +id+ "'";

//关闭

falg="恭喜您,注册成功!r请记住您的准考证号:"+ID; //返回

falg="miss"; //表示考生

//保存考生

word格式整理

专业资料参考

(ing(3));

(ing(4));

nTime(eTimeInstance().parse(

ing(5)));

stion(ing(6));

wer(ing(7));

fession(ing(8));

dNo(ing(9));

(studentForm1);

}

} catch (Exception ex) {}

return studentList;

}

//修改考生资料

public int update(StudentForm s){

String sql="UPDATE tb_student SET

pwd='"+()+"',sex='"+()+"',question='"+stion()+"',answer='"+

wer()+"',profession='"+fession()+"' where ID='"+()+"'";

int ret=eUpdate(sql);

n("修改考生资料时的SQL:"+sql);

();

return ret;

}

//找回密码(第一步)

public StudentForm seekPwd1(StudentForm s){

String sql="SELECT * FROM tb_student WHERE ID='"+()+"'";

ResultSet rs = eQuery(sql);

try {

if (()) {

(ing(1));

stion(ing(6));

}else{

("");

}

}catch(Exception e){

}

n("找回密码(第一步)出现的错误信息:

"+sage());

word格式整理

专业资料参考

return s;

}

// 找回密码(第二步)

public StudentForm seekPwd2(StudentForm s){

String sql="SELECT * FROM tb_student WHERE ID='"+()+"'";

n("SQL"+sql);

ResultSet rs = eQuery(sql);

try {

if (()) {

}

}catch(Exception e){

}

return s;

}

// 删除数据

public int delete(StudentForm studentForm) {

int flag=0;

String[] delId=IdArray();

if (>0){

String id="'";

for(int i=0;i<;i++){

}

id=ing(0,()-2);

id=id+delId[i]+"','";

n("找回密码(第二步)出现的错误信息:

"+sage());

String ID=ing(1);

String pwd=ing(3);

String answer=ing(7);

if((wer())){

}

(ID);

(pwd);

n("密码:"+pwd);

("");

}else{

String sql = "DELETE FROM tb_student where id in (" + id +")";

n("删除时的SQL:"+sql);

word格式整理

专业资料参考

flag = eUpdate(sql);

();

}

}

}else{

}

flag=0;

return flag;

附录1.3 在线考试模块设计

package Form;

import ;

import Form;

public class LessonForm extends ActionForm {

private Date joinTime;

private String name;

private int ID;

private String[] delIdArray=new String[0];

public Date getJoinTime() {

}

public void setJoinTime(Date joinTime) {

}

public String getName() {

}

public void setName(String name) {

}

public int getID() {

}

public void setID(int ID) {

}

public String[] getDelIdArray(){

return delIdArray;

= ID;

return ID;

= name;

return name;

me = joinTime;

return joinTime;

word格式整理

专业资料参考

}

}

public void setDelIdArray(String[] delIdArray){

}

rray=delIdArray;

package Form;

import ;

import Form;

public class StuResultForm extends ActionForm {

private int resTotal;

private Date joinTime;

private int ID;

private String stuId;

private String whichLesson;

private int resMore;

private int resSingle;

public int getResTotal() {

}

public void setResTotal(int resTotal) {

}

public Date getJoinTime() {

}

public void setJoinTime(Date joinTime) {

}

public int getID() {

}

public void setID(int ID) {

}

public String getStuId() {

}

return stuId;

= ID;

return ID;

me = joinTime;

return joinTime;

al = resTotal;

return resTotal;

word格式整理

专业资料参考

}

public void setStuId(String stuId) {

}

public String getWhichLesson() {

}

public void setWhichLesson(String whichLesson) {

}

public int getResMore() {

}

public void setResMore(int resMore) {

}

public int getResSingle() {

}

public void setResSingle(int resSingle) {

}

gle = resSingle;

return resSingle;

e = resMore;

return resMore;

esson = whichLesson;

return whichLesson;

= stuId;

package ;

import ;

import .*;

import .*;

import Form;

import DAO;

public class Lesson extends Action {

private LessonDAO lessonDAO = null;

public Lesson() {

}

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

String action = ameter("action");

n("获取的查询字符串:" + action);

DAO = new LessonDAO();

word格式整理

专业资料参考

}

if (action == null || "".equals(action)) {

}

ribute("error", "操作失败!");

return rward("error");

return rward("error");

return lessonQuery(mapping, form, request, response);

return lessonAdd(mapping, form, request, response);

return lessonDel(mapping, form, request, response);

return selectLesson(mapping, form, request, response);

return ready(mapping, form, request, response);

} else if ("lessonQuery".equals(action)) {

} else if ("lessonAdd".equals(action)) {

} else if ("lessonDel".equals(action)) {

}else if("selectLesson".equals(action)){

}else if("ready".equals(action)){

// 查询课程信息

private ActionForward lessonQuery(ActionMapping mapping, ActionForm form,

}

// 添加课程

private ActionForward lessonAdd(ActionMapping mapping, ActionForm form,

}

HttpServletRequest request, HttpServletResponse response) {

LessonForm lessonForm = (LessonForm) form;

int ret = (lessonForm);

n("返回值ret:" + ret);

if (ret == 1) {

}

return rward("lessonAdd");

ribute("error", "该课程已经添加!");

return rward("error");

ribute("error", "添加课程失败!");

return rward("error");

} else if (ret == 2) {

HttpServletRequest request, HttpServletResponse response) {

ribute("lessonQuery", (0));

return rward("lessonQuery");

} else {

word格式整理

专业资料参考

}

// 删除课程

private ActionForward lessonDel(ActionMapping mapping, ActionForm form,

}

//在线考试时选择课程

private ActionForward selectLesson(ActionMapping mapping, ActionForm form,

}

//准备考试

private ActionForward ready(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

LessonForm lessonForm = (LessonForm) form;

n("课程ID:"+()+e());

HttpSession session = sion();

ribute("lessonID",f(()));

return rward("ready");

//

HttpServletRequest request, HttpServletResponse response) {

HttpSession session = sion();

String stu=ribute("student").toString(); //获取准考证号

List list=(stu); //查询包括考试题目的课程列表,但不包括已经考

if(()<1){

}

return rward("noenLesson");

ribute("lessonList",list);

return rward("selectLesson");

}else{

HttpServletRequest request, HttpServletResponse response) {

LessonForm lessonForm = (LessonForm) form;

int ret = (lessonForm);

if (ret == 0) {

}

ribute("error", "删除课程失败!");

return rward("error");

return rward("lessonDel");

} else {

过的科目

查询选择的课程ID

}

word格式整理

专业资料参考

package ;

import Form;

import ;

import .*;

import .*;

public class LessonDAO {

private ConnDB conn=new ConnDB();

//添加数据

public int insert(LessonForm lessonForm) {

String sql1="SELECT * FROM tb_lesson WHERE name='"+e()+"'";

ResultSet rs = eQuery(sql1);

String sql = "";

int falg = 0;

try {

if (()) {

falg=2;

} else {

sql = "INSERT INTO tb_lesson (name) values('" +

e() + "')";

falg = eUpdate(sql);

n("添加课程时的SQL:" + sql);

();

}

} catch (Exception ex) {

falg=0;

}

return falg;

}

//查询方法

public List query(int id) {

List lessonList = new ArrayList();

LessonForm lessonForm1 = null;

String sql="";

if(id==0){//查询全部课程

sql = "SELECT * FROM tb_lesson ORDER BY joinTime DESC";

}else if(id==-1){//查询包括套题的课程

sql="SELECT distinct l.* FROM tb_lesson l INNER JOIN tb_taoTi t ON

=Id";

word格式整理

专业资料参考

}else if(id==-2){ //查询包括考试题目的课程

sql="SELECT distinct l.* FROM tb_lesson l INNER JOIN tb_questions q ON

//sql="SELECT * FROM tb_lesson WHERE ID in(SELECT distinct lessonID FROM

=Id WHERE name not in (SELECT distinct whichLesson FROM tb_stuResult)";

(SELECT lessonId,taoTiID FROM tb_questions GROUP BY taoTiID,lessonID,type) as

lessonTaoTi GROUP BY lessonId,taoTiID HAVING COUNT(taoTiID) >1) WHERE name not in

(SELECT distinct whichLesson FROM tb_stuResult";

}else{

}

n("查询包括考试题目的课程:"+sql);

ResultSet rs = eQuery(sql);

try {

while (()) {

lessonForm1 = new LessonForm();

((1));

e(ing(2));

nTime(eTimeInstance().parse(i

ng(3)));

(lessonForm1);

}

} catch (Exception ex) {}

return lessonList;

}

//查询方法

public List query(String studentID) {

List lessonList = new ArrayList();

LessonForm lessonForm1 = null;

String sql="SELECT * FROM tb_lesson WHERE ID in(SELECT distinct lessonID FROM

" +

AND" +

" name not in (SELECT distinct whichLesson FROM tb_stuResult WHERE

stuId='"+studentID+"')";

//String sql="SELECT distinct l.* FROM tb_lesson l INNER JOIN tb_questions q

ON =Id WHERE name not in (SELECT distinct whichLesson FROM tb_stuResult

"(SELECT lessonId,taoTiID FROM tb_questions GROUP BY

taoTiID,lessonID,type)" +

" as lessonTaoTi GROUP BY lessonId,taoTiID HAVING COUNT(taoTiID) >1)

sql = "SELECT * FROM tb_lesson WHERE id=" +id+ "";

word格式整理

专业资料参考

WHERE stuId='"+studentID+"')";

ResultSet rs = eQuery(sql);

try {

while (()) {

lessonForm1 = new LessonForm();

((1));

e(ing(2));

(lessonForm1);

}

} catch (Exception ex) {}

return lessonList;

}

// 删除数据

public int delete(LessonForm lessonForm) {

int flag=0;

String[] delId=IdArray();

if (>0){

String id="";

for(int i=0;i<;i++){

}

id=ing(0,()-1);

id=id+delId[i]+",";

String sql = "DELETE FROM tb_lesson where id in (" + id +")";

flag = eUpdate(sql);

();

}

}

}else{

}

flag=0;

return flag;

附录1.4 考试题目管理模块设计

package ;

import .*;

import .*;

import onsForm;

import orm;

word格式整理

专业资料参考

import ;

import DAO;

import onsDAO;

import AO;

public class Questions extends Action {

private QuestionsDAO questionsDAO = null;

private LessonDAO lessonDAO=null;

private TaoTiDAO taoTiDAO=null;

public Questions() {

}

public ActionForward execute(ActionMapping mapping, ActionForm form,

}

// 查询考试题目信息

private ActionForward questionsQuery(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

String action = ameter("action");

n("获取的查询字符串:" + action);

if ("questionsQuery".equals(action)) {

}

return questionsQuery(mapping, form, request, response);

return questionsAddQuery(mapping,form,request,response);

return questionsAdd(mapping, form, request, response);

return questionsDel(mapping, form, request, response);

return questionsModifyQuery(mapping,form,request,response);

return questionsModify(mapping,form,request,response);

return queryTaoTi(mapping,form,request,response);

ribute("error", "操作失败!");

return rward("error");

}else if("questionsAddQuery".equals(action)){

onsDAO = new QuestionsDAO();

DAO=new LessonDAO();

AO=new TaoTiDAO();

} else if ("questionsAdd".equals(action)) {

} else if ("questionsDel".equals(action)) {

}else if("questionsModifyQuery".equals(action)){

}else if("questionsModify".equals(action)){

}else if("queryTaoTi".equals(action)){

}else{

word格式整理

专业资料参考

}

HttpServletRequest request, HttpServletResponse response) {

ribute("questionsQuery", (0));

return rward("questionsQuery");

// 添加考试题目

private ActionForward questionsAdd(ActionMapping mapping, ActionForm form,

}

// 添加考试题目时查询

private ActionForward questionsAddQuery(ActionMapping mapping, ActionForm form,

}

//根据课程查询套题ajax

private ActionForward queryTaoTi(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

ribute("taoTiList",aoTi(nt(request.g

return rward("queryTaoTi");

HttpServletRequest request, HttpServletResponse response) {

ribute("lessonList",(-1)); //全部包括套题的课

return rward("questionsAddQuery");

HttpServletRequest request, HttpServletResponse response) {

QuestionsForm questionsForm = (QuestionsForm) form;

int ret = (questionsForm);

if (ret == 1) {

}

return rward("questionsAdd");

ribute("error", "该考试题目已经添加!");

return rward("error");

ribute("error", "添加考试题目失败!");

return rward("error");

} else if (ret == 2) {

} else {

程列表

etParameter("id")))); //查询指定课程的套题列表

}

// 修改考试题目时的查询

private ActionForward questionsModifyQuery(ActionMapping mapping, ActionForm

form,

word格式整理

专业资料参考

HttpServletRequest request, HttpServletResponse response) {

QuestionsForm

questionsForm=(QuestionsForm)(((nt(am

eter("id")))).get(0));

}

package ;

import onsForm;

import ;

import .*;

import .*;

}

//修改考试题目

private ActionForward questionsModify(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

QuestionsForm questionsForm = (QuestionsForm) form;

int ret = (questionsForm);

if (ret == 0) {

}

ribute("error", "修改考试题目失败!");

return rward("error");

return rward("questionsModify");

ribute("questionsModifyQuery", questionsForm);

return rward("questionsModifyQuery");

} else {

}

// 删除考试题目

private ActionForward questionsDel(ActionMapping mapping, ActionForm form,

}

HttpServletRequest request, HttpServletResponse response) {

QuestionsForm questionsForm = (QuestionsForm) form;

int ret = (questionsForm);

if (ret == 0) {

}

ribute("error", "删除考试题目失败!");

return rward("error");

return rward("questionsDel");

} else {

word格式整理

专业资料参考

public class QuestionsDAO {

private ConnDB conn=new ConnDB();

//添加数据

public int insert(QuestionsForm q) {

String sql1="SELECT * FROM tb_questions WHERE subject='"+ject()+"' AND

taoTiId="+TiId()+"";

ResultSet rs = eQuery(sql1);

n("添加时的查询"+sql1);

String sql = "";

String answer="";

int falg = 0;

try {

if (()) {

falg=2;

} else {

if(e().equals("多选题")){

String[] mOption=(String [])werArr();

if (>0){

}

answer=wer();

=

+

"INSERT INTO tb_questions

+

String str="";

for(int i=0;i<;i++){

}

str=ing(0,()-1);

answer=str;

str=str+mOption[i]+",";

}

}else{

sql

values('"

(subject,type,lessonId,taoTiId,optionA,optionB,optionC,optionD,answer,note)

ject()

"','"+e()+"',"+sonId()+","+TiId()+",'"+ionA()+"','"

+ionB()+"','"+ionC()+"','"+ionD()+"','"+answer+"','"+

ote()+"')";

falg = eUpdate(sql);

n("添加考试题目时的SQL:" + sql);

();

}

word格式整理

专业资料参考

} catch (Exception ex) {

falg=0;

}finally{

}

return falg;

}

//查询方法

public List query(int id) {

List questionsList = new ArrayList();

QuestionsForm questionsForm1 = null;

String sql="";

if(id==0){

sql = "SELECT * FROM tb_questions ORDER BY lessonId DESC,taoTiId DESC,type";

}else{

}

ResultSet rs = eQuery(sql);

String type="";

String answer="";

try {

while (()) {

questionsForm1 = new QuestionsForm();

((1));

ject(ing(2));

type=ing(3);

e(type);

nTime(eTimeInstance().parse(

tring(4)));

sonId((5));

TiId((6));

ionA(ing(7));

ionB(ing(8));

ionC(ing(9));

ionD(ing(10));

if(("多选题")){

String[] ans=ing(11).split(",");

sql = "SELECT * FROM tb_questions WHERE id=" +id+ "";

();

word格式整理

专业资料参考

}

werArr(ans);

wer(ing(11));

}else{

e(ing(12));

(questionsForm1);

}

} catch (Exception e) {

}

return questionsList;

}

//修改数据

public int update(QuestionsForm q){

String answer="";

String[] mOption=(String [])werArr();

if (>0){

}

answer=wer();

sql="UPDATE tb_questions SET

String str="";

for(int i=0;i<;i++){

}

str=ing(0,()-1);

answer=str;

str=str+mOption[i]+",";

if(e().equals("多选题")){

}

tackTrace();

();

}finally{

}else{

String

subject='"+ject()+"',type='"+e()+"',optionA='"+ionA()+"',op

tionB='"+ionB()+"',optionC='"+ionC()+"',optionD='"+ionD()+"

',answer='"+answer+"',note='"+e()+"' where id="+()+"";

int ret=eUpdate(sql);

n("修改考试题目时的SQL:"+sql);

();

return ret;

word格式整理

专业资料参考

}

//根据所属套题查询套题名称(通过jsp:useBean调用)

public String getTaoTi(int id){

String taoTiName="";

if(id>0){

String sql="SELECT * FROM tb_taoTi WHERE id="+id+"";

ResultSet rs=eQuery(sql);

try {

if(()) {

}

} catch (Exception e) {

}

// 删除数据

public int delete(QuestionsForm questionsForm) {

int flag=0;

String[] delId=IdArray();

if (>0){

String id="";

for(int i=0;i<;i++){

}

id=ing(0,()-1);

id=id+delId[i]+",";

}

return taoTiName;

tackTrace();

();

}finally{

}

taoTiName=ing(2);

String sql = "DELETE FROM tb_questions where id in (" + id +")";

flag = eUpdate(sql);

();

}

}

}else{

}

flag=0;

return flag;

word格式整理

专业资料参考

package ;

import .*;

import .*;

import orm;

import DAO;

import AO;

public class TaoTi extends Action {

private TaoTiDAO taoTiDAO = null;

private LessonDAO lessonDAO=null;

public TaoTi() {

}

public ActionForward execute(ActionMapping mapping, ActionForm form,

}

// 查询套题信息

private ActionForward taoTiQuery(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

String action = ameter("action");

n("获取的查询字符串:" + action);

if (action == null || "".equals(action)) {

}

ribute("error", "操作失败!");

return rward("error");

return rward("error");

return taoTiQuery(mapping, form, request, response);

return taoTiAddQuery(mapping,form,request,response);

return taoTiAdd(mapping, form, request, response);

return taoTiDel(mapping, form, request, response);

return taoTiModifyQuery(mapping,form,request,response);

return taoTiModify(mapping,form,request,response);

} else if ("taoTiQuery".equals(action)) {

}else if("taoTiAddQuery".equals(action)){

} else if ("taoTiAdd".equals(action)) {

} else if ("taoTiDel".equals(action)) {

}else if("taoTiModifyQuery".equals(action)){

}else if("taoTiModify".equals(action)){

AO = new TaoTiDAO();

DAO=new LessonDAO();

word格式整理

专业资料参考

}

HttpServletRequest request, HttpServletResponse response) {

ribute("taoTiQuery", (0));

return rward("taoTiQuery");

// 添加套题

private ActionForward taoTiAdd(ActionMapping mapping, ActionForm form,

}

// 添加套题时查询

private ActionForward taoTiAddQuery(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

}

ribute("lessonList",(0)); //全部课程列表

return rward("taoTiAddQuery");

HttpServletRequest request, HttpServletResponse response) {

TaoTiForm taoTiForm = (TaoTiForm) form;

int ret = (taoTiForm);

n("返回值ret:" + ret);

if (ret == 1) {

}

return rward("taoTiAdd");

ribute("error", "该套题已经添加!");

return rward("error");

ribute("error", "添加套题失败!");

return rward("error");

} else if (ret == 2) {

} else {

// 修改套题时查询

private ActionForward taoTiModifyQuery(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

TaoTiForm

taoTiForm=(TaoTiForm)(((nt(ameter("id")))

).get(0));

ribute("taoTiModifyQuery", taoTiForm);

ribute("lessonList",(0)); //全部课程列表

return rward("taoTiModifyQuery"); }

//修改套题

private ActionForward taoTiModify(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

TaoTiForm taoTiForm = (TaoTiForm) form;

word格式整理

专业资料参考

}

int ret = (taoTiForm);

if (ret == 0) {

ribute("error", "修改套题失败!");

return rward("error");

return rward("taoTiModify");

} else {

} }

// 删除套题

private ActionForward taoTiDel(ActionMapping mapping, ActionForm form,

}

HttpServletRequest request, HttpServletResponse response) {

TaoTiForm taoTiForm = (TaoTiForm) form;

int ret = (taoTiForm);

if (ret == 0) {

}

ribute("error", "删除套题失败!");

return rward("error");

return rward("taoTiDel");

} else {

word格式整理


本文标签: 考试 系统 考生 信息 课程