基于java的在线考试系统设计(含源文件)

欢迎添加微信互相交流学习哦!

二维码

项目源码:https://gitee.com/oklongmm/biye

题 目      基于java的在线考试系统设计             

摘 要    

本系统是一个基于java的在线考试系统。它的用户由学生、教师和系统管理员组成。学生登陆系统可以进行在线测试和成绩查询。当学生登陆时,系统会随机地为学生选取试题组成考卷。当学生提交考卷后,系统会自动批改客观题,并将试卷提供给教师查看和提醒教师对试卷主观题进行修改。待教师修改完试卷后,系统会自动生成考生成绩和分数段统计信息。学生可以查询自己的成绩信息和试卷,以便更好地了解自己的学习情况。教师也可以通过分数段统计信息更好地了解学生的学生情况。后台管理员可以对考题,考试设置信息,用户信息进行维护。学生,教师,管理员都可以对个人信息进行维护。
本系统采用B/S模式设计,一切操作均在浏览器上进行。系统所用到的技术有HTML,CSS,javascript,jsp/servlet等。数据库选用SQLServer2005,web服务器选用TomCat。前台设计主要在DreamWeaver上设计完成的,后台开发主要在Eclipse上完成的。
本文首先对本次没计的背景、设计的意义、设计的可行性等作了一个简单的介绍。其次介绍了此次设计的设计过程,包括需求分析,总体设计,数据库设计,详细设计等内容。最后介绍了系统的功能测试过程和结果分析。
关键词:在线考试 随机抽题 SQLServer  JSP/servlet  
  

ABSTRACT

This system is a online examination system and it is bases on java.The user of this system make up by student,teacher and administrator. Students can test online and query the results of test. When the students submitted the test papers, the system automatically corrects the objective questions,then send this test paper to the teacher and remind the teacher to correct the subjective questions.When the teacher corrected the questions,the system will automatically generate test scores and the statistical information of score section. Students can query the results of test and the test papers so that they can better understand their own learning. The teacher can also  better understand the learning of stuent through the statistical information of score section. Administrators can maintain the question and maintain the test set and manage the users information.Stuent,teacher and administrator can maintain the Own information.
The system uses the B / S model , so that all the operations were carried out in the browser. Technologies used in the system include HTML, CSS, javascript, jsp/servlet and so on. The database of this system is SQLServer2005 and  the web service is Tomcat. The Front mainly design in DreamWeaver and the backstage mainly design in Eclipse.
This paper ,firstly, make a brief of the background, the meaning and the feasibility of this design. Then describes the design process of  system,include needs analysis, design summary, database design and detailed design.Last describes the system functional testing process and results analysis.
Keyword:ExamOnline;Random question;SQLServer ;JSP/servlet  

目录

摘 要    I
ABSTRACT    II
1 绪论    1
1.1问题的提出    1
1.2系统开发目标    1
1.3开发工具的选择    1
1.4开发本系统的意义    1
2 系统分析    3
2.1背景分析    3
2.2可行性分析    3
2.2.1技术可行性分析    3
2.2.2经济可行性    3
2.2.3方案可行性    4
3 系统设计    5
3.1 需求分析    5
3.2总体设计    6
3.2.1系统数据流图    6
3.2.2 系统的功能模块图    7
3.2.3 系统功能模块    7
3.3 数据库设计    10
3.3.1数据字典    10
3.3.2 实体关系图    12
3.3.3数据库的连接    13
3.4 详细设计    15
3.4.1公共类设计    15
3.4.2在线考试模块设计    18
3.4.3成绩查询模块设计    22
3.4.4查看/修改考生试卷模块设计    23
3.4.5分数段统计模块设计    26
3.4.6试题维护模块设计    26
3.4.7考试设置信息维护模块设计    29
3.4.8用户管理模块设计    32
3.4.9个人信息维护模块设计    33
4 系统测试    35
4.1 系统运行环境    35
4.2 测试目的    35
4.3 各功能模块测试    35
4.3.1在线考试模块测试    36
4.3.2查看/修改试卷测试    37
4.3.3分数段统计测试    38
4.3.4成绩查询测试    39
4.3.5个人信息维护测试    40
4.3.6 考题管理    41
4.3.7考试设置管理测试    44
4.3.8用户管理测试    45
5  结论    44
致谢    45
参考文献    46

1 绪论

1.1问题的提出
计算机网络技术的飞速发展以及计算机技术的发展及计算机的日益普及,现在很多国内外的大学和社会其他部门都已经开设了远程教育,通过计算机网络实现异地教育和培训,从而为在线考试系统发展提供了坚实的基础。现在,计算机硬件技术的发展已经达到了相当高的水平。但是,在我国远程教育软件的开发目前还处于起步阶段,随着这项技术的不断深入发展,就要求有更好、更完善的软件系统应用到远程教育当中去,这就给软件设计人员提出了更高的设计要求。   
在二十一世纪的新时代,随着计算机技术的发展及计算机的日益普及,基于在线考试与无纸化办公一样已成为大势所趋。在线考试系统也越来越成为学校的好帮手,它的优势不但体现在人力上也体现在物力上,在线考试系统的采用自动评阅、计分、成绩存档功能将有效地避免资源的浪费,有利于环保,减少人员,提高效率。

1.2系统开发目标
该系统是一个基于B/S模式的Web在线考试系统。它能够从题库中随机抽取试题生成考试试卷,从而有效地避免了考试作弊,相互抄袭的避端。 当考试完成后系统能自动地为客观题评分。教师登陆时系统可以还原学生考试试卷,待教师对主观题评完分后系统可以计算出学生总分,并生成各分数段情况信息,供给老师参考,以便能够了解学生的学习情况。

1.3开发工具的选择
本系统开发语言为JAVA,从各IDE的性能和价格考虑所使用的开发工具主要是Eclipse+MyEclipse,前台页面主要用DreamWeaver来设计。由于本系统数据量和负载量都比较大,从经济和效率上考虑本系统选用SQLServer2005数据库。 Web服务器选Apache开元组织提供的TomCat,因为TomCat是一个免费的开元软件是SUN公司推荐的web服务器。

1.4开发本系统的意义
从电子文档、多媒体的应用,到利用Internet做尝试,网络已经渗入到教育体系的各个环节.网上考试系统作为这场变革中必不可少的环节之一,受到越来越多的关注.网上考试系统不仅和传统考试方式一样要权衡公平性,而且还具有一些新特点.
1)从管理的角度看,在线考试系统可以帮助教师完成一个考试从题目设计,考试安排,考试实施,考卷批改到分数统计总结的所有工作,系统实现了无纸化管理,提高了管理的效率;所有的考试数据和其他数据库需要一种主流的方式进行存储和管理,例如使用数据库技术,题库对于每个出题者都只是显示了部分视图,很好地实现了教考分离.
2)在不改变传统考试基本步骤的条件下,只要有考试客户端可以连接到考试应用服务器,任何考生在任何地方进行身份确认,都能完成考试.题目有一定的稳定性和随机性.稳定性可以保证每一次考试对每一个考生是公平的,随机性可以避免作弊的发生.
3)考试结果反馈及时准确.考试的结果在教师修改考完之后就可以知道,同时提供一个机会让考生知道自己哪里做错了,并给出反馈信息说明理由.考生的考试结果可以被保存下来,供教师进行分析统计和察看。 

2 系统分析

2.1背景分析
网络化教育代表了教育改革的一个发展方向,已经成为现代教育的一个特征,并对教育的发展形成新的推动力。随着Internet/Intranet的迅速发展和广泛普及,建立在其上的远程教育成为现代教育技术未来发展方向之一,考试测试作为远程教育的一个子系统也成为一个重要的研究领域。现代远程教育作为一种新的教学手段已经开始进入我们的生活,正在给传统教育模式带来新的变革,并对教育的发展形成新的推动力。
相比传统的考试方式,在线考试系统的主要好处是一方面可以动态地管理各种考试信息,只要准备好足够大的题库,从该题库中抽取一定数量的考题生成考试试卷,从而有效地避免了考试作弊,相互抄袭的避端;另一方面,考试时间灵活, 可以在规定的时间段内的任意时间参加考试;另外计算机化的考试的最大特点是阅卷快,系统可以在考试结束时当场给考生成绩,计算机阅卷给了考生最大的公平感。

2.2可行性分析
2.2.1技术可行性分析
系统开发将要用到JSP/Servlet、JavaBean、SQLServer数据库技术。另外,硬件只需要一台pc机,装上软件Eclipse,DreamWeaver等开发工具 ,利用SQLserver作为后台的数据库,利用Tomcat作为Web服务器,所以在这方面来说是可行的。已经掌握了开发考试系统方法和开发工具,并且在调查过程中,已经了解和熟悉了在线考试系统的业务流程。综上所述本系统开发从技术上是可行的
2.2.2经济可行性
从经济效益来分析,软件的开发成本不大,而其它的投入也只是电脑。电脑的普及也带来了低成本投入。由于系统运行的基础环境均已具备,无需重新开发建设,所以系统开发、运行所需的费用是比较低的。而系统的效益很高可以提高管理效率实现计算机化、系统化、规范化操作,效率大于投入,可行性很高。
2.2.3方案可行性
根据系统的分析,本系统充分从适用性出发,全面为不同的使用用户考虑。使系统的许多功能与规则都可根据用户的习惯进行定制,包括软件界面、操作方式、录入方式等。本系统的设计充分从使用用户和教务教学任务考虑。 

3 系统设计

3.1 需求分析
本考试系统用户主要分为三类:学生,教师,管理员。
1.学生需求
学生登陆系统主要进行两类操作:在线考试,成绩查询与个人信息管理.
(1)在线考试
系统能自动给考生选题,考题必须是随机分配的,以保证考试的公平性。学生在考试过程中页面将提供考试时间倒计时功能,使考生随时了解考试剩余时间。在考试时间到时,系统将自动地将学生考试试卷提交,将提醒考生离开考场。当考试试卷提交时,系统自动为选择题、判断题等客观题评分,主观题由教师评分。
(2)成绩查询与个人信息维护
学生可以登陆系统查询各科成绩,其中成绩信息包括每种题型的得分,如单选题,简答题等。别外学生还可以查询自己的考卷,了解自己的考试情况。
除此之外,学生登陆系统可以查看和修改个人的基本信息,如修改密码等。

2.教师需求
教师登陆系统主要有三类操作:查看和修改学生试卷,查看各分数段统计,个人信息的维护
(1)查看/修改学生试卷
系统会将学生试卷从数据库中读出供给老师查看和修改,系统已经对选择题和判断题评了分,所以这些信息对于教师是只读的。而对于主观题,系统将参考答案读出供给老师参考,再将考生答案读出供给教师评分。
(2)查看分数统计
教师修改好试卷之后,系统将成绩汇总,生成各分数段统计信息,并提供给老师查看,以便教师能了解学生的学习情况。
(3)个人信息维护
教师登陆系统之后也可以对个人信息进行查看和修改。

3.管理员
系统管理员登陆系统后主要进行四类操作:考题维护,考试信息维护,用户维护和个人信息维护
(1)考题的维护
管理员可以往题中添加考题,修改错误试题和删除无用试题。
(2)考试信息的维护
考试信息的维护主要是对于考试设置信息进行维护,这些信息主要是考试总时间,试题数量,各试题分值的分布等。
(3)用户维护
系统管理员可以对用户信息(包括学生信息,教师信息等)进行增,删,改查操作。
(4)个人信息维护
管理员也可以对自己的基本信息的维护

3.2总体设计
3.2.1系统数据流图
据分析系统数据流图如图3.1所示
 图3.1系统数据流图

3.2.2 系统的功能模块图
根据3.1所述需求,设计出系统功能模块如图3.2所示
 图3.2系统的功能模块图

3.2.3 系统功能模块
1、 在线考试
在线考试的流程如下:
首先系统按照一定的算法为登陆的考生随机选取一定的试题生成考试试卷,考生在系统生成好试卷后进行答题操作。答题必须在规定的时间内进行,此时间是由管理员事先设置好的,如在规定的时间内没有完成答题,系统将强制提交学生考试试卷进。考生在试卷提交后系统自动地为客观题进行评分,本系统的客观题主要是单选题,多选题和判断题。其数据流图如3.3所示。
 图3.3第2层在线考试数据流图
2、成绩查询
   考生根据用户编号查询考试成绩信息。成绩信息包括单选题得分,多选题得分等详细信息。页面提供对相应科目试卷的链接,使得学生还可以查询自己的考卷,了解自己的考试情况。
3、 查看/修改考生试卷
   系统首先将考生的试卷读出,再提提醒老师对主观题进评分,等老师对主观题进行评分后系统生成考生的成绩信息,其数据流图如图3.4所示。
    
图3.4第2层修改学生试卷数据流图
4、分数段统计
    当教师对考卷的主观题评定后,系统能自动生成分数段统计信息供给老师查看。此功能有助于老师了解学生的学生情况,以便更好的教学。
5、试题维护
试题维护是后台管理员的重要功能,它包括对试题的添加,修改,删除操作。为了使界面更友好,管理员在试题维护时系统会先将考试试题读出,再提供给管理中员操作。其数据流图如图3.5所示
 
图3.5 第2层考题维护数据流图
6、考试设置信息维护
考试设置信息维护是管理员对考试设置信息维护,它包括对考试设置信息的添加,修改,删除。这些考试信息包括考试时间,各题的数量和分值等。其数据流图如图3.6所示。
 
图3.6 第2层考试设置信息维护数据流图
7、用户管理
   用户管理是管理员对系统用户信息的管理。这些用户包括学生和教师。用户管理操作包括添加用户,更新用户和删除用户。管理用户时,系统会先将用户信息读出供给管理员参考,再提供给管理员操作。其数据流图如图3.7所示。
 
图3.7 第2层用户管理数据流图
8、个人信息维护
学生,教师,管理员都可以对个人信息进行维护。维护操作包括对个人基本信息进行修改,修改密码等。系统能提供极为友好的界面方便用户操作。

3.3 数据库设计
3.3.1数据字典
通过对系统功能的分析可知,本系统主要包括如下的数据库信息:
(1)用户表,该表保存了系统用户的基本信息,属性有用户编号、用户名称、用户类型、用户性别。其中用户编号为主码,它是用户信息的唯一标识。表结构如表3.1所示。
(2)考生标记表,该表用于保存考生是否已经考试的标识信息,属性有用户编号、课程名称、标识信息。其中用户编号和课课程名称共同作为主码。表结构如表3.2所示。
(3)考题表,该表用于保存考题的基本信息,属性有考题编号,课程名称,考题类型,题目级参考答案等。其中考题编号为主码。表结构如表3.3所示。
(4)试卷设置表,该表用于记录相应课程的考试设置的相关信息,属性有课程名称,单选题、多选题、判断题、简答题、编程题数量和分值,考试时间等。其中课程名称为主码。表结构如表3.4所示。
(5)试卷表,该表用于保存考生的试卷信息,属性有考生编号,课程名称,考题类型,考生答案和得分等。其中考生编号和课程名称共同作为主码。表结构如表3.5所示。
(6)成绩表,该表用于保存考生的考试成绩信息,属性有考生编号,课程名称,各考题得分,总得分。其中考生编号和课程名称共同作为主码。表结构如表3.6所示。
系统表结构如下:
表3.1用户表(UserInfo)
字段    类型    允许为空    说明    备注
Uid    Varchar(10)    否    用户编号    pk
name    Varchar(50)    否    用户姓名    
utype    int    否    用户类型    1为学生,2为教师,3为管理员
password    Varchar(10)    否    密码    
sex    Varchar(2)    是    性别    

表3.2用户标记表(userflag)
字段    类型    允许为空    说明    备注
Uid    Varchar(10)    否    用户编号    pk
Course    Varchar(20)    否    课程名称    pk
flag    int    否    用户标记    0试卷未提交 1试卷已提交

表3.3考题表(Question)
字段    类型    允许为空    说明    备注
Qid    int    否    考题编号    pk 自增长
qtype    int    否    考题类型    1单选题 2多选题 3判断题 4简答题 5编程题
course    Varchar(20)    否    课程名称    
ques    Text    否    题目    
keyA    Varchar(50)    是    选项A    
keyB    Varchar(50)    是    选项B    
keyC    Varchar(50)    是    选项C    
keyD    Varchar(50)    是    选项D    
answer    text    否    参考答案    

表5.4考试设置表(TestSet)
字段    类型    允许为空    说明    备注
course    Varchar(20)    否    科目    pk
sinc    int    否    单选题数    
persin    int    否    每个单选题的分值    
mulc    Int    否    多选题数    
permul    int    否    每个多选题的分值    
judge    Int    否    判断题数    
perju    Int    否    每个判断题的分值    
jd    Int    否    简答题数    
perjd    Int    否    每个简答题的分值    
program    Int    否    编程题数    
perpro    Int    否    每个编程题的分值    
totaltime    Int    否    考试时间    

表5.5试卷表(test)
字段    类型    允许为空    说明    备注
Uid    Varchar(10)    否    用户编号    pk
Qid    int    否    考题编号    pk   题库中的题号
Course    Varchar(20)    否    课程名称    
Qtype    int    否    考题类型    1单选题 2多选题 3判断题 4简答题 5编程题
answer    Text    是    考生答案    
Tnumber    int    否    题目编号    试卷中的第几题
score    float    是    得分    

表5.6成绩表(test)
字段    类型    允许为空    说明    备注
Uid    Varchar(10)    否    用户编号    pk
Course    Varchar(20)    否    课程名称    pk
score    float    否    总得分    
single    float    否    单选题得分    
multiply    float    否    多选题得分    
judge    float    否    判断题得分    
jd    float    否    简答题得分    
program    float    否    编程题得分    

3.3.2 实体关系图
    据分析系统实体关系图如图3.8所示:
 图3.8 系统E-R图

系统各实体关系如下:
用户:用户标记 1:N
考试设置:用户标记 1:N
考题:考试设置 N:1
考题:试卷 1:N
用户:试卷 1:N
试卷:成绩 N:1
用户:成绩 1:N

3.3.3数据库的连接
在本系统中我们使用JDBC-ODBC桥连接,要进行数据库连接首先要配置数据源。按3.3.1和3.3.2的设计,设计好数据库ExamOnlie,再建一个名为ExamOnline的数据源。系统连接数据库的流程图如图3.9所示:
 
图3.9系统连接数据库流程图
建立数据库连接和关闭数据库连接操作方法代码及说明如下,这些方法位于DBAccess类中,当作工具类来用
static{//静态代码块,在类被实例化时被调用,且只被调用一次
           try{
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//注册驱动
            }catch(ClassNotFoundException e)
              {
               throw new ExceptionInInitializerError(e);
              }
}
//得到连接
    public Connection getConnection()
    {
            
        try{ 
            connectionconn = DriverManager.getConnection("jdbc:odbc:ExamOnline");  //获得数据库连接
           }catch(Exception e)
      {
       e.printStackTrace();
       out.print(e.toString());
      }
         return conn;
    }
//关闭数据库连接
public void CloseDB(Connection conn,Statement sm,ResultSet rs)
    {
        try {
             if(rs!=null)
             {
                rs.close();
             }
        }catch (Exception e) 
        {
          e.printStackTrace();
          out.print("数据库关闭失败!");
        }finally
        {
            try{
                if(sm!=null)
                {
                    sm.close();
                }
            }catch(Exception e)
            {
                e.printStackTrace();
                out.print("数据库关闭失败!");
            }finally
            {
                try{
                    if(conn!=null)
                    {
                        conn.close();
                    }
                    
                }catch(Exception e)
                {
                    e.printStackTrace();
                    out.print("数据库关闭失败!");
                }
            }
        }
}

3.4 详细设计
3.4.1公共类设计
1.Domain类设计
由于数据库使用的类系统模型,而java数据为对象模型,使得其模型不匹配。为了方便关系模型和对象模型间的转换,建应的Domain类,即数据库中每个表对应一个类,表中类属性对应表的各属性,再为各个属性设计一个读方法(get)和一个写方法(set)如用户类:
public class User {
    private String id="";
    private String name="";
    private int type=1;
    private String password="";
    private String sex = "";
    public String getSex();
    public void setSex(String sex) ;
    public String getPassword();
    public void setPassword(String password);
    public String getId();
    public void setId(String id);
    public String getName();
    public void setName(String name);
    public int getType();
    public void setType(int type);
}
表和类的对应关系如下:
用户表(UserInfo)——用户类(User)
用户标记表(userflag)——用户标记类(UserFlag)
考题表(Question)——考题类(Question)
试卷表(test)——试卷类(Test)
试卷设置表(test_set)——试卷设置类(Test)
成绩表(record)——成绩类(Record)
试卷考题类(TestQuestion)——试卷表和考题表联合查询视图

2.公具类设计
根据系统设计需求,设计如下工具类:
数据库连接工具类,主要提供连接数据操作等相关方法
public class DBAccess { 
//得到数据库连接
public Connection getConnection()
//并闭数据库连接
    public void CloseDB(Connection conn,Statement sm,ResultSet rs)
   }
用户操作相关类,主要提供对用户表操作的相关类
public class UserUtil {
//根据用户编号得到用户信息
    public User getUser(String Uid) 
//验证登陆信息,根据用户名、密码和用户类型
    public boolean checkUser(String userName,String password,int type)    //修改用户信息
public boolean motifyUser(User user) 
    //添加用户信息
    public boolean insertUser(User user) 
    //修改密码
    public boolean motifyPassword(String Uid,String password) 
    //得到指定页的用户
public ArrayList getAllUser(int pageSize,int current)
//得到用户数量
    public int getCount()
    //删除用户信息
    public boolean deleteUser(String Uid) 
}
用户标记工具类,主要提供对用户标记表的相关操作方法
public class UserFlagUtil {
  //得到交卷信息
  public int getFlag(String Uid,String course) 
  //设置交卷信息
public boolean setFlag(String Uid,String course)  
}
考题工具类,主要提供对考题表的相关操作方法
Public class QuestionUtil{
   ///得到选择题的方法
    public ArrayList getQuestion(String course,int count,int type)    
//得到数据库中题目数量
public int getCount(int type,String course)
//得到数据库中题目数量
    public int getCount()
    //通过考题编号得到考题
public Question getQuestionById(int Qid)
//得到指定页的试题目信息
public ArrayList getAllQuestion(int pageSize,int current)   
//添加试题信息
public boolean insertQuestioin(Question ques) 
//修改试题信息
public boolean updateQuestion(Question ques) 
//删除试题信息
public boolean deleteTest(int Qid)
//获取科目
    public ArrayList getCourse()
}
试卷工具类,主要提供对试卷表的相关操作方法
public class TestUtil {
    //添加试卷信息
    public boolean insertTest(ArrayList al)
    //考生的名字和学号
    public ArrayList getStudent(String course)
    //获得试卷库中相应题型的题
    public ArrayList getTest(String Uid,String course,int type)
    //修改试卷库中相应试题的分数
    public boolean updateTest(String Uid,int Qid,float score)    
}
考试设置工具类,主要提供对考试设置表的相关操作方法
public class TestSetUtil {
    //根据课程名称得到考试设置信息
    public TestSet getTestSet(String course) 
    //计算考题总分
    public int getTotalScore(TestSet ts) 
    //获得总记录
    public int getCount()
    //得到指定页的考试信息
    public ArrayList getAllTestSet(int pageSize,int current)
    //添加或修改考试设置,flag=0为添加,flag=1为修改
    public boolean insertOrUpdate(TestSet ts,int flag)    
   //删除考试设置信息
public boolean deleteTest(String course) 
}
成绩工具类,主要提供对成绩表的相关操作方法
public class RecordUtil {
    public DBAccess db = new DBAccess();
    //获取考生指定课程的得分信息
   public Record getRecord(String Uid,String course) 
   //判断学生成绩是否存在
   public boolean getUser(String Uid,String course) 
   //获取及格人数
   public int getPass(String course) 
   //获取该课程总考试人数
   public int getCount(String course) 
   //获分数段人数
   public int getCountByScore(String course,int score) 
   //得到学生的全部成绩
   public ArrayList getAll(String Uid) }
}
试卷考题工具类,主要提供对试卷表考题表联合查询视图的相关操作方法
public class TestQuestionUtil {
     //获得试卷库中相应题型的题
    public ArrayList getTest(String Uid,String course,int type)
}
3.4.2在线考试模块设计
在线考试流程为:首先系统将考试信息和考生个人信息提供给考生,并要求考生核对个人信息。在考试开始时系统按照一定的算法为登陆的考生随机选取一定的试题生成考试试卷,考生在系统生成好试卷后进行答题操作。答题必须在规定的时间内进行,此时间是由管理员事先设置好的,如在规定的时间内没有完成答题,系统将强制提交学生考试试卷进。考生在试卷提交后系统自动地为客观题进行评分,并将试卷保存,供给老师查看或修改。在线考试流程图如图3.10所示。
随机抽题算法:产生一个随机整数,这个数在0和相应题型总考题数之间。从这个随机数开始抽取取试题,抽取数量为试卷设置中相应题型的个数(此数小于总题数),若取到最后一道还不满足取题数量,再从第一题开始选取,其抽题流程如图3.11如示。
 
图3.10 在线考试流程

 
图3.11 选题流程

关键代码及说明
随机选题操作方法主要代码及说明,此方法位于QuestUtil中。些方法输入参数为课程名称course,需要题数count,试题类型type;输出为一个包含抽取的试题信息的集合ArrayList:
public ArrayList getQuestion(String course,int count,int type)
{
ArrayList al = new ArrayList();
//得到课程名称为course,考题类型为type的考题总数
int totalCount = this.getCount(type,course);
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
//随机产生一个0-总题数之间的随机整数
int temp = (int)(Math.random()*totalCount); try{
    conn = new DBAccess.getConnection();
    for(int i = 0;i<count;i++)//取题
    {
      int tempCount = (temp+i)%totalCount;
  //sql语句
      String sql = "select top 1 * from Question where qtype="+type+" and course='"+course+"' and Qid not in(select top "+tempCount+" Qid from Question where qtype="+type+" and course='"+course+"')";
       ps = conn.prepareStatement(sql);
       rs = ps.executeQuery();
       Question ques = new Question();
       if(rs.next())
       {
           //保存试题
         ques.setId(rs.getInt(1));
         ques.setType(1);
         ques.setQues(rs.getString(4));
         ques.setKeyA(rs.getString(5));
         ques.setKeyB(rs.getString(6));
         ques.setKeyC(rs.getString(7));
         ques.setKeyD(rs.getString(8));
         ques.setAnswer(rs.getString(9));
         al.add(ques);
        }
      }
    }catch(Exception e)
{
        e.printStackTrace();//打印出异常信息
        }finally
        {
            db.CloseDB(conn, ps, rs);//关闭数据库连接
            return al;
        }
    }
生成试卷关键代码及说明(以生成单选题为例)
<%
      String course = (String)session.getAttribute("course");
//从session中得到课程名称
String Uid = (String)session.getAttribute("Uid");
//从session中得到用户编号
String name = (String)session.getAttribute("name");
//得到试卷设置工具实例
TestSetUtil testUtil = new TestSetUtil();
//得到试卷设置实例
TestSet ts = testUtil.getTestSet(course.trim());
      ArrayList al=null;
  QuestionUtil questionUtil = new QuestionUtil();
      Question qs = new Question();
%>
    <div class="singleChoice">
        <strong>一、单选题</strong> (共<%=ts.getSinChCount()%>题,每题<%=ts.getPerSinScore()%>分)
        <%
          //得到考题
          al = questionUtil.getQuestion(course,ts.getSinChCount(),1);
          for(int i=0;i<al.size();i++)
          {
            qs = (Question)al.get(i);
         %>
          <divname="stuChoice<%=i%>">
<%=i+1%>.<%=qs.getQues().trim()%>
</div>
          <input type="radio" name="choice<%=i%>Value" value="A"/>
A.<%=qs.getKeyA()==null?"":qs.getKeyA().trim()%><br/>
          <input type="radio" name="choice<%=i%>Value" value="B"/>
B.<%=qs.getKeyB()==null?"":qs.getKeyB().trim()%><br/>
          <input type="radio" name="choice<%=i%>Value" value="C"/>
C.<%=qs.getKeyC()==null?"":qs.getKeyC().trim()%><br/>
          <input type="radio" name="choice<%=i%>Value" value="D"/>
D.<%=qs.getKeyD()==null?"":qs.getKeyD().trim()%><br/>
          <input type="hidden"value="<%=qs.getId()%>"name="choiceId<%=i%>"/>
          <input type="hidden" value="<%=qs.getAnswer()==null?"":qs.getAnswer().trim()%>" name="choiceAnswer<%=i%>"/>
           <%}%>
      </div>
试卷保存关键代码及说明(以单选题的保存为例)
TestSetUtil testUtil = new TestSetUtil();
        TestSet ts = testUtil.getTestSet(course);
        TestUtil tu = new TestUtil();
        ArrayList al = new ArrayList();
        //取单选题
        for(int i=0;i<ts.getSinChCount();i++)
        {
            Test test = new Test();
             //从隐藏表单元素中取题库中题号
            int qid = Integer.parseInt(request.getParameter("choiceId"+i));
         //取考生答案
            String stuAnswer = request.getParameter("choice"+i+"Value");
        stuAnswer = stuAnswer==null?"":stuAnswer;
            int tnumber = i;//题号
            int type = 1;//题的类型 
             //取正确答案
        String answer = request.getParameter("choiceAnswer"+i);                //计算考生得分
int score=
(answer.equalsIgnoreCase(stuAnswer))?ts.getPerSinScore():0;        test.setQid(qid);
            test.setUid(uid);
            test.setCourse(course);
            test.setScore(score);
            test.setStuAnswer(stuAnswer);
            test.setType(type);
            test.setTnumber(tnumber);
            al.add(test);
    }
   boolean success = tu.insertTest(al);


3.4.3成绩查询模块设计
考生根据用户编号查询考试成绩信息,查询到的成绩是考生的所有课程的成绩。成绩信息包括单选题得分,多选题得分等详细信息。
得到学生成绩的函数getAll()定义如下,它位于RecordUtil类中,输入参数为考生编号Uid,输入为封装了学生所有成绩信息的一个集全元素ArrayList:
   public ArrayList getAll(String Uid) 
   {
       ArrayList al = new ArrayList();
       Connection conn = new DBAccess().getConnection();
       PreparedStatement ps = null;
       ResultSet rs = null;
       try
       {
           String sql = "select * from record where Uid=?";
           ps = conn.prepareStatement(sql);
           ps.setString(1, Uid);
           rs = ps.executeQuery();
           while(rs.next())
           {
               Record record = new Record();
               record.setUid(rs.getString(1));
               record.setCourse(rs.getString(2));
               record.setScore(rs.getFloat(3));
               record.setSingle(rs.getFloat(4));
               record.setMultiply(rs.getFloat(5));
               record.setJudge(rs.getFloat(6));
               record.setJd(rs.getFloat(7));
               record.setProgram(rs.getFloat(8));
               al.add(record);
           }
           
       }catch(Exception e)
       {
           e.printStackTrace();
       }finally
       {
           new DBAccess().CloseDB(conn, ps, rs);
           return al;
       } 
   }

3.4.4查看/修改考生试卷模块设计
教师登陆后,可以对考生试卷进行查看和修改。系统首先将考生的试卷读出,教师可能看到系统对试卷主观题的评定。系统会提提醒老师对主观题进评分,等老师对主观题进行评分,系统会将保存对学生试卷的评定,而后生成考生的成绩信息。查看/修改考生试卷的流程图如图3.12所示
 
图3.12查看/修改学生试卷流程
教师提交评定的关键代码设计及说明如下:
       //获取学生学号
        String Uid = request.getParameter("Uid");    
   //获取session中的课程名称
    String course = (String)session.getAttribute("course");
        TestUtil tu = new TestUtil();
        TestSetUtil tsu = new TestSetUtil();
        Record record = new Record();
        RecordUtil ru = new RecordUtil();
        //获取试卷设置信息
        TestSet ts = tsu.getTestSet(course); 
        float singleTotal = 0;//单选题总分
        float multiplyTotal = 0;//多选题总分
        float judgeTotal = 0;//判断题总分
        float jdTotal = 0;//简答题总分
        float programTotal=0;//编程题总分
        float total=0;
        for(int i=0;i<ts.getSinChCount();i++)//获取单选题分数
        {
            float score = Float.parseFloat(request.getParameter("choice"+i));
            singleTotal+=score;
        }
        for(int i=0;i<ts.getMulChCount();i++)//获取多选题分数
        {
            float score = Float.parseFloat(request.getParameter("mulChoice"+i));
            multiplyTotal+=score;
        }
        for(int i=0;i<ts.getJudgeCount();i++)//获取判断题分数
        {
            float score = Float.parseFloat(request.getParameter("judge"+i));
            judgeTotal+=score;
        }
        for(int i=0;i<ts.getJdCount();i++)//获取简答题分数
        {
            float score = Float.parseFloat(request.getParameter("jd"+i));
            jdTotal+=score;
            int Qid = Integer.parseInt(request.getParameter("jdId"+i));
            tu.updateTest(Uid, Qid, score);//修改试卷库中相应简答题的分数
            
        }
        for(int i=0;i<ts.getProgramCount();i++)//获取编程题分数
        {
            float score = Float.parseFloat(request.getParameter("pro"+i));
            programTotal+=score;
            int Qid = Integer.parseInt(request.getParameter("proId"+i));
            tu.updateTest(Uid, Qid, score);
            
        }
        total = singleTotal+multiplyTotal+judgeTotal+jdTotal+programTotal;
        record.setUid(Uid);
        record.setCourse(course);
        record.setScore(total);
        record.setSingle(singleTotal);
        record.setMultiply(multiplyTotal);
        record.setJudge(judgeTotal);
        record.setJd(jdTotal);
        record.setProgram(programTotal);
        //System.out.print(record.getUid()+record.getCourse());
        if(ru.updateRecord(record))
        {
    response.sendRedirect(request.getContextPath()
+"/teacher/success.html");
        }else
        {
            response.sendRedirect(request.getContextPath()
+"/teacher/fail.html");
        }

3.4.5分数段统计模块设计
当教师对考卷的主观题评定后,系统能自动生成分数段统计信息供给老师查看。统计分数段包括及格率、60-69分、70-79、80-89和90分以上,在统计数量的同时并计算出占数考人数量的比例。
其统计功能的关键代码及说明如下:
 //获取要统计的分数段
      String scoreString = request.getParameter("score").trim();
      //获取要统计的课程名称
String course = (String)session.getAttribute("course");
      RecordUtil ru = new RecordUtil();
      //得到考生总数
      int count = ru.getCount(course);
      int pass = 0;//要统计的分数段人数
      if("pass".equals(scoreString))//如果统计的是及格率
      { 
       pass = ru.getPass(course);
      }else
      {
       int score = Integer.parseInt(scoreString); 
       pass = ru.getCountByScore(course,score);
      }
       //计算比例,由于要用count作为除数,所以必须排出count为0的情况
   String percent = 
count==0?"0.0%":((float)pass)/((float)count)*100+"%";

3.4.6试题维护模块设计
试题维护是后台管理员的重要功能,它包括对试题的添加,修改,删除操作。在进行此操作时系统会先将考试试题读出,再提供给管理中员操作。试题维护流程图如图3.13所示。
   图3.13考题维护流程
关键代码如下:
添加考题关键代码及说明如下:
    //获取课程名称,由于课程名称可能包含有汉字,所以要对其进行编码,这里我们用gbk进行编码
String kemu = request.getParameter("kemu").trim();
    String ch_course = "course"+kemu;
    String course = 
new String(request.getParameter(ch_course).getBytes("iso8859-1"),"gbk");
 //获取题目类型
     int type = Integer.parseInt(request.getParameter("type").trim());
    String ques = new String(request.getParameter("ques").getBytes("iso8859-1"),"gbk");
        //选项A
        String keyA = null;
        //选项B
        String keyB = null;
        //选项C
        String keyC = null;
        //选项D
        String keyD = null;
        //参考答案
        String answer = "";
        QuestionUtil qu = new QuestionUtil();
        Question question = new Question();
        if(type==1)//单选题
        {
            keyA = new String(request.getParameter("keyA").getBytes("iso8859-1"),"gbk").trim();
            keyB = new String(request.getParameter("keyB").getBytes("iso8859-1"),"gbk").trim();
            keyC = new String(request.getParameter("keyC").getBytes("iso8859-1"),"gbk").trim();
            keyD = new String(request.getParameter("keyD").getBytes("iso8859-1"),"gbk").trim();
            answer = request.getParameter("answer_sin").trim();
        }else if(type==2)//多选题
        {
            keyA = new String(request.getParameter("keyA").getBytes("iso8859-1"),"gbk").trim();
            keyB = new String(request.getParameter("keyB").getBytes("iso8859-1"),"gbk").trim();
            keyC = new String(request.getParameter("keyC").getBytes("iso8859-1"),"gbk").trim();
            keyD = new String(request.getParameter("keyD").getBytes("iso8859-1"),"gbk").trim();
                String[] str_answer = request.getParameterValues("answer_mul");
            for(int i = 0;i < str_answer.length;i++)
            {
                answer = answer + str_answer[i];
                
            }
        }else if(type==3)//判断题
        {
            answer = request.getParameter("answer_jud");
        }else//简答题,设计题
        {
            answer = new String(request.getParameter("answer_other").getBytes("iso8859-1"),"gbk").trim();
        }
        question.setCourse(course);
        question.setType(type);
        question.setQues(ques);
        question.setKeyA(keyA);
        question.setKeyB(keyB);
        question.setKeyC(keyC);
        question.setKeyD(keyD);
        question.setAnswer(answer);
        boolean success = qu.insertQuestioin(question);
        if(success)
        {
    response.sendRedirect(request.getContextPath()+"/admin/AddQuesSuccess.html");
        }else
        {
         response.sendRedirect(request.getContextPath()+"/Fail.html");
        }
由于修改考题信息与添加考题信息的方法类似在此我们不再细说。下面是删除考题信息关键代码及说明
Javascript代码,提醒用户是否删除.
function IsDelete(obj)
       {
         var okey = confirm("确认删除?");
         if(okey==true)
         { 
           var keyWord = obj.value;
window.location.href="<%=path%>/admin/DeleteQuestion.jsp?Qid="+keyWord;
         }
}
删除考题代码:
String str_qid = request.getParameter("Qid").trim();
int Qid = Integer.parseInt(str_qid);
        boolean success = new QuestionUtil().deleteTest(Qid);    

3.4.7考试设置信息维护模块设计
考试设置信息维护是管理员对考试设置信息维护,它包括对考试设置信息的添加,修改,删除。这些考试信息包括考试时间,各题的数量和分值等。设置时,系统先读取已存在的考试设置信息供给管理员查询,再提供给管理员操作。考试设置信护流程图如图3.14所示。
 
图3.14考试设置信息维护流程
添加/修改考试设置信息关键代码及说明如下:
//获取课程名称,同样这里用gbk对接收到的信息进行编码
String course = new String(request.getParameter("course").getBytes("iso8859-1"),"gbk");
//获取单选题总数
        int singleCount =Integer.parseInt(request.getParameter("singleCount"));
    //获取单个单选题分值
    int perSingle = Integer.parseInt(request.getParameter("perSingle"));
    //获取多选题总数    
int multiplyCount=Integer.parseInt(request.getParameter("multiplyCount"));
//获取单个多选题分值
        int perMultiply = Integer.parseInt(request.getParameter("perMultiply"));
    //获取判断题总数 
    int judgeCount = Integer.parseInt(request.getParameter("judgeCount"));
//获取单个判断题分值
    int perJudge = Integer.parseInt(request.getParameter("perJudge"));
        //获取简答题总数
int jdCount = Integer.parseInt(request.getParameter("jdCount"));
    //获取单个简答题分值
int perJd = Integer.parseInt(request.getParameter("perJd"));
    //获取设计题总数
    int programCount = Integer.parseInt(request.getParameter("programCount"));
    //获取单个设计题分值
    int perProgram = Integer.parseInt(request.getParameter("perProgram"));
    //获取总考试时间
int totalTime = Integer.parseInt(request.getParameter("totalTime"));
    int flag = Integer.parseInt(request.getParameter("flag"));
    TestSetUtil tsu = new TestSetUtil();
    TestSet ts = new TestSet();
    ts.setCourse(course);
    ts.setSinChCount(singleCount);
    ts.setPerSinScore(perSingle);
    ts.setMulChCount(multiplyCount);
    ts.setPerMulScore(perMultiply);
    ts.setJudgeCount(judgeCount);
    ts.setPerJudScore(perJudge);
    ts.setJdCount(jdCount);
    ts.setPerJdScore(perJd);
    ts.setProgramCount(programCount);
    ts.setPerProScore(perProgram);
    ts.setTotaltime(totalTime);
    boolean success = tsu.insertOrUpdate(ts, flag);
    if(success)
    {
            response.sendRedirect(
request.getContextPath()+"/admin/TestSucces      s.html");
            
        }else
        {
        response.sendRedirect(request.getContextPath()+"/Fail.html");
}
由于删除考试设置信息同删除考题功能类似,这时也不再详讲,如有疑问请参考前面删除考题信息功能。

3.4.8用户管理模块设计
用户管理是管理员对系统用户信息的管理。这些用户包括学生和教师。用户管理操作包括添加用户,更新用户和删除用户。添加用户时,删除管理用户时,系统会先将用户信息读出供给管理员参考,再提供给管理员操作。用户密码不用设置,系统默认为“123456”;修改用户时用户编号和用户密码不能被修改其它均能被修改;用户时,系统会先提醒管理员是否删除,若果确认删除才能删除用户。用户管理流程图如图3.15所示。

 
图3.15用户管理流程
添加/更新用户的关键代码及说明如下:
//获取用户名,这里也用gbk对其进行编码
String name=new String(request.getParameter("name").getBytes("iso8859-1"),"gbk").trim();
//获取用户类型,1为学生,2为教师,3为管理员
      int type=Integer.parseInt(request.getParameter("type"));
      //获取性别,用gbk对其进行编著码
String sex=new String(request.getParameter("sex").getBytes("iso8859-1"),"gbk").trim();
        String password = "123456";//初始密码设为123456
        //获取操作标志,0为添加用户信息,1为更新用户信息
        String flag = request.getParameter("flag").trim();
        UserUtil userUtil = new UserUtil(); 
        User user = new User();
        boolean success = false;
        user.setId(Uid);
        user.setType(type);
        user.setName(name);
        user.setPassword(password);
        user.setSex(sex);
        if("0".equals(flag))//添加用户
        {
          success= userUtil.insertUser(user);    
            
        }else if("1".equals(flag))//更新用户
        {
            success=userUtil.motifyUser(user);
        }
        if(success)
{      response.sendRedirect(request.getContextPath()+"/admin/success.html");    
        }
        else
        {
        response.sendRedirect(request.getContextPath()+"/Fail.html");
}
由于删除用户信息同删除考题功能类似,这时也不再详讲,如有疑问请参考前面删除考题信息功能。

3.4.9个人信息维护模块设计
系统用户包括学生,教师,管理员都可以对个人信息进行维护。维护操作包括对个人基本信息进行修改,修改密码等。系统能提供极为友好的界面方便用户操作。对其本信息进行时,用户不能修改自己的编号。对密码进行修改时按昭一般系统的要求先确认旧密码,再输入新密码和确认新密码。
个人基本信息信息维护的关键代码如下所示:
UserUtil userUtil = new UserUtil();
        //得到session
HttpSession session = request.getSession(true);
        //获取session中的用户编号
String Uid = (String)session.getAttribute("Uid");
        //得到用户名,用gbk对其进行编码
String name = new String(request.getParameter("name").trim().getBytes("iso8859-1"),"gbk");
//得到用户类型
        String typeString=new String(request.getParameter("type").getBytes("iso8859-1"),"gbk");
        int type=1;
        if("教师".equals(typeString))
        {
            type=2;
        }else if("管理员".equals(typeString))
        {
            type=3;
        }
        String sex = new String(request.getParameter("sex").getBytes("iso8859-1"),"gbk").trim();
        User user = new User();
        user.setId(Uid);
        user.setName(name.trim());
        user.setType(type);
        user.setSex(sex);
        if(userUtil.motifyUser(user))
        {         response.sendRedirect(request.getContextPath()+"/success.html"   
        }else
        {
            response.sendRedirect(request.getContextPath()+"/Fail.html");
  } 

4 系统测试

4.1 系统运行环境 
     数据库:SQLServer2005
     Web服务器:Tomcat6.0及以上版本
     操作系统:能运行java虚拟机的操作系统均可

4.2 测试目的
系统测试是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。
测试的目的就是希望能以最少的人力和时间发现潜在的各种错误和缺陷。应根据开发各阶段的需求、设计等文档或程序的内部结构精心设计测试用例,并利用这些实例来运行程序,以便发现错误。系统测试应包括软件测试、硬件测试和网络测试。硬件测试、网络测试可以根据具体的性能指标来进行,此处所说的测试更多的是指软件测试。系统测试是保证系统质量和可靠性的关键步骤,是对系统开发过程中的系统分析系统设计和实施的最后复查。

4.3 各功能模块测试
将工程导入Tomcat的项目文件夹生即webapps文件夹中, 再启动TomCat服务器。在浏览器中输入工程的URL,如“www.localhost:8080/ExamOnline”可进入系统操作界面,用户可以选择操作。如图4.1所示。
 
图4.1系统主界面


4.3.1在线考试模块测试
在主界面点击学生考试,可以进入学生登陆界面。此界面在提交数据时有简单验证功能,如学号不能为空等,科目必须选择等。如图4.2所示。
 
图4.2学生登陆界面
   选择科目后进入确认信息页面,如图4.3所示。系统将考生的个人信息读出到该页面,供给考生确认。并将考试科目考试设置信息(题目分布、分值分布、考试时间等)读出到该页面,提供给考生。
 
图4.3确认信息页面
点击开始考试,将进入到考试页面,考生开台答题,如图4.4所示。在答题时系统提供剩余时间倒计时功能,以方便了角答题时间。当考试剩余时间为0时系统将自动提交试卷,并通知考生离开考场,如图4.5所示。
 
图4.4学生考试页面
 
图4.5考试结束

4.3.2查看/修改试卷测试
教师在主界面上点击教师管理,并输入正确的登陆信息后可以进入教师管理界面,在左边的菜单选项中点击“查看/修改试卷”,撑开子菜单。在撑开的子菜单中点击考生姓名可以查看到考生的考试试卷,在如图4.6所示。
在此界面中系统会提醒教师对主观题进行评定,评分时系统也不一个简单的验证,如得分不能超过此题总分等,如图4.7所示。
 
图4.6查看/修改试卷界面

 
图4.7提交修改试卷

4.3.3分数段统计测试 
    当教师提交评定后,系统会生考生成绩信息和该科各分数段统计信息。在教师管理主界面上点击“分数段统计”,操作子菜单。在子菜单中点击要统计的分数段信息。可以统计的分数段有及格率,60-69,70-79,80-89,90-100。图4.8是及格率的统计信息。
 
图4.8分数段统计界面

4.3.4成绩查询测试
    学生在主界面点击“学生管理”,并输入正确的登陆信息可以进入学生管理界面。在界面中点击左边菜单栏中的“成绩查询”选项,可以查询到学生的全部成绩信息,如图4.9所示。点击“查看详情”,学生可以看到该科的考卷及各题得分情况,如图4.10所示。
 
图4.9学生成绩查询

 
图4.10查看成绩详情

4.3.5个人信息维护测试
   个人信息维护分为个人基本信息维护和修改密码。学生,教师,管理员在登陆,点击左边菜单栏上的“个人信息维护”选项,撑开子菜单。在子采单中选择主界面左边的选择“修改个人信息”进入个人基本信息维护界面如图4.11,用户可以对个人的基本信息进行维护。点击“修改密码”进入修改密码界面,修改密码时系统会对用户输入信息进行一个简单的验证如两次输入新密码必须相同等,如图4.12所示。
 
图4.11 个人基本信息维护

 
图4.12修改密码

4.3.6 考题管理
在浏览器中输入“http://localhost:8080/ExamOnline/admin/login.jsp”进入管理员登陆页面。当提交登陆信息时,系统会进行简单的数据验证,如验证码输入的正确性,如图4.13所示。
输入正确的登陆信息后,进入后台管理主界面,在左边的菜单栏上点击“试题管理”选项进入试题管理界面,如图4.14所示。
 
图4.13管理员登陆界面
 
图4.14 试题管理界面
  在试题管理界面上,系统将试题信息读取到界面上,点击添加图标,转到添加试题界面,管理员可以输入考题信息,输入一道“javascript”的选择题,如图4.15。添加后在界面上找到该试题如图4.16所示。
 
图4.15添加考题

 
图4.16添加考题成功
现点击考题右边的编辑图标可以对考题进行修改,现将刚添加的考题的科目改为“java”,如图4.17。修改后再在主界面找到试题,如图4.18所示。
 
图4.17修改考题
 
图4.18修改考题成功
点击考题右边的删除图标,可以删除该考题,删除时系统会提醒用户是否确认删除,如果用户确认删除可以删除考题,现在刚添加的考题删除,如图4.19。
 
图4.19删除考题

4.3.7考试设置管理测试
在管理员界面上点击左边菜单栏上的“考试设置管理”,进入考试设置管理界面。系统会选将考试设置信息读取到该界面上。用户点击操作按钮可以对基进行操作,如图4.20所示。
 
图4.20考试设置管理 界面
点击添加图标,可以进入添加界面,用户可以添加考试设置信息。现添加一条课程名为“javascript”的考试设置信息。添加后如图4.21所示。
 
图4.21添加考试设置信息
点击考试设置信息右边的删除图标可以删除考试设置信息。
点击编辑图标将转到编辑界面,用户可以对该考试设置信息进行编辑。现将刚添加的考试设置信息的考试时间修改为80分钟。修改后如图4.22所示。
 
图4.22修改考试设置
4.3.8用户管理测试
点击管理员菜单中“用户管理”按钮,进入用户管理界面,系统选将用户信息读取到该页面上,用户点击操作按钮可以对其进行操作。如图4.23所示。
 
图4.23用户管理界面
点击添加图标,可以进入到添加页面,管理员可以添加用户信息。现添加一个用户名为“student”的用户信息,添加后如图4.24所示。
 
图4.24添加用户信息
点击用户信息右边的删除图标,可以删除该用户信息。点击用户信息右边的编辑图标,可以进入编辑页面对该信息进行编辑,现将刚添加的用户的名字改为“测试者”,修改后如图4.25所示。
 
图4.25修改用户信息
 

5  结论

本系统采用B/S模式结构设计,运用JSP技术和servlet技术结合,通过JDBC -ODBC桥连接操作数据库,实现了在线考试,成绩查询,考题管理等功能。学生考试时可以随机地为登陆的考生抽取试题组成考卷。当学生提交考卷后,系统会自动批改客观题,并将试卷提供给教师查看和提醒教师对试卷主观题进行修改。待教师修改完试卷后,系统会自动生成考生成绩和分数段统计信息。学生可以查询自己的成绩信息和试卷,以便更好地了解自己的学习情况。教师也可以通过分数段统计信息更好地了解学生的学生情况。后台管理员可以对考题,考试设置信息,用户信息进行维护。学生,教师,管理员都可以对个人信息进行维护。
    通过本次课程设计,系统的学习了HTML,CSS,javascript等前台知识和jsp,servlet,javabean等web程序设计知识。对数据库连接,数据库操作有了更进一步的理解。对面向对象程序设计思想有了进一步的体会。通过从系统的需求分析到总体设计到详细设计再到系统测试,进一步了解了规范的软件设计流程。
    在系统还存在很多不足之处。界面布局凌乱使界面不够美观且HTML代码和CSS代码混杂,不便于维护;系统设计没有严格按照MVC模式来设计,给系统维护带来了储多的不便等等。在以后的学习和开发中,我会注意这些问题,使其开发更规范,开发的系统更优异。
    
 

致谢

   半年的光阴一晃就要过去了,毕业设计也接近尾声了,由于时间紧迫任务繁重,同时自己经验知识的匮乏,在本次设计中难免会遇到一些困难,但多亏了老师和同学的帮助才有幸完成了本次毕业设计。在此我要多谢我的指导老师伍建全老师。伍老师工作繁重,但在我做毕业设计的每个阶段,从查阅资料到设计草案的确定和修改,中期检查,后期详细设计,装配草图等整个过程中都给予了我悉心的指导。同时我还要感谢我的同学,感谢他们在我需要帮助的时候都默默的帮着我,无论是技术方面的还是生活方面的,他们都给了我很大的帮助,其次我要感谢学院感谢学校给了我们这样一个优良的设计环境,传授给我们计算机方面的专业知识,从而使我们有了一技之长。

     

参考文献

[1] 郝玉龙.JavaEE 编程技术.北京:清华大学出版社,2008.8
[2] 王珊.数据库系统概论.北京:高等教育出版社,2006.5
[3] 陈琦,刘儒德.信息技术教育应用.北京:人民邮电出版出,1997.1
[4] 向学哲.JSP程序设计教程.北京:人民邮电出版社,2007.4
[5] 严蔚敏、吴伟民.数据结构.北京:清华大学出版社,2003
[6] 方盈.SQL server 2000从入门到精通.北京:中国铁道出版社,1999
[7] Joseph J.Bambara.J2EE技术内幕.北京:机械工业出版社,2007年.
[8] Bruce Eckel.Thinking In Java.英文第4版.北京:机械工业出版社,2007
[9] 陈轶.姚晓昆编著.Java程序设计实验指导.北京:清华大学出版社,2006
[10] 杨昭编著.二级Java语言程序设计教程.北京:中国水利水电出版社,2006
[11] 赵文靖编著.Java程序设计基础与上机指导.北京:清华大学出版社,2006
[12] 赵毅主编.跨平台程序设计语言——Java.西安:西安电子科技大学出版社,2006
[13] 王路群.Java高级程序设计.北京:中国水利水电出版社,2006
[14] 雍俊海编著.Java程序设计习题集.北京:清华大学出版社,2006
[15] 朱福喜编著.Java语言习题与解析.北京:清华大学出版社,2006
[16] 吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社,2006

猜你喜欢

转载自blog.csdn.net/weixin_55459367/article/details/114379983