1、上海电力学院Java EE课程大作业题目 网上考试系统的设计与实现 学号 20083335 课号 姓名 周航 班级 2008221 院系 计信学院 专业 软件工程 2010-12-20目录第一章引言31.1开发简介3第二章 需求分析与系统设计42.1系统背景介绍42.2需求分析52.2.1角色说明72.2.2主要过程72.3实体关系图(ER图设计)82.4数据库的实现82.4.1数据库的简介82.4.2数据库连接的方式82.4.3数据库具体实现9第三章 系统详细设计123.1系统结构设计123.2功能模块设计123.2.1登录模块设计133.2.2教师题管理模块的设计133.3.3教师试卷管理
2、模块153.3.4 考生参加考试模块设计153.3.5成绩查询模块设计17第四张 总结18参考文献18第一章 引言1.1开发简介 J2EE开发技术是Java开发中综合性最强,Java编程应用最为广泛的一项,作为企业级的开发框架,JavaEE除了有SDK基本的包支持,还有各种基于服务器,数据库等开发的工具包,在JavaEE开发中,这些工具包很大程度上简化了开发复杂项目的开发流程。提供了很多值得借鉴的可复用的开发模式。随着网络发展的日益普及化,网站服务越发朝多样化发展,许多原来要用人工进行的作业可以由计算机执行,并通过网络的途径共享结果数据。而且随着结构化数据库的日益发展完善,网络服务器所能接受的
3、数据也更加多样化。网上考试系统的设计就是基于JavaWeb编程,JavaBean开发,数据库技术基础上通过在服务器端连接运行数据库,客户端进行相应操作,实现将教师的登录系统,试题管理,组卷等工作以及将学生的登录验证,参加测试,提交试卷之后系统根据教师的设置得出考生的平均分,最后考生可以登录并查询自己的成绩等一系列操作在该系统内完成。通过这个系统的试验,可以初步形成一个网上考试系统的简单架构和开发思路,网上考试系统取代了传统的考试要用试卷实体进行考试,考试后人工的批阅试卷的过程,不仅减少了人为的劳动,也降低了以往阅卷过程中由于批卷人疏漏造成的出错的可能性。尽管网上考试系统相比传统考试拥有这些技术
4、和准确性上的优势,但传统的考试由于可以做到题型多变,答案不唯一,传统的考试批阅试卷的过程中都会遇到各种问题,比如标准答案的争议,有时一个简单的填空题,与标准答案稍有差异的答案也可以算是正确的,目前网上考试系统比较难以实现灵活性上的功能。尤其是本文档中的网上考试系统,距离达到其实用功能还有待完善。有了将尚未普及的数据库操作,网页参数传递等技术转化为可视化,较容易理解的网页客户端操作页面的开发思路,则为今后该方向的服务系统的开发奠定了技术上的底层基础。第二章 需求分析与系统设计2.1系统背景介绍网上考试系统的开发目的是通过将网络编程技术和数据库连接技术融合起来,实现将考试的流程简化,只需考生通过自
5、己的用户名(学号)和密码实现验证参加考试,教师的组卷则是通过登录验证后的网页客户端文本输入实现试题的添加修改删除等操作,提高考试的效率,和生成成绩的速度,一定程度上解决了以往考试过后一段时间后才能知道成绩的问题。2.2需求分析通过对网上考试系统的大致了解和题目的说明,经过概括总结得出如下的系统功能流程图:如图2.1图2.1系统实现的主要功能有:(1) 教师的题库查询操作,可以从数据库中读出现有的学科题库中的题目(2) 教师的修改题库题目操作,可以从界面选择编辑题目,做好修改后提交给服务器,将数据库中的题库题目更新修改(3) 教师的试卷管理功能,可以从数据库中读取已经创建的试卷,可以在页面输入文
6、本提交后创建新的试卷,或删除已存在的试卷。(4) 教师的试卷组题功能,在已有试卷上增加题目,删除题目。(修改题目要在题库中统一修改)(5) 考生的参加考试的功能,考生登录后可以选择参加考试功能,在选择界面中选择要参加的考试的科目,以及该科目下具体的试卷名称。(6) 考生答题完毕后系统会根据提交的答案得出考生分数,考生可在操作界面中选择查询分数这一功能查询考试分数。(只显示该考生自己的分数)(7) 教师与学生都可以通过登录验证后,修改登录的密码,本示例系统的教师登录密码1234,学生登录密码与学号相同,可修改。本学期学习的一门基于面向对象语言开发技术的建模语言,UML建模语言, (全称Unifi
7、ed Modeling Language统一建模语言),该语言主要用于程序开发初期的总体设计,通过该语言的描述和图形化的表达方式,可以将较复杂的问题转化成可视化的详细的开发指导。UML常用建模图形包括用例图,类图,状态机图,活动图,交互纵览图,通讯图,组件图等。 用例图描述了系统中的用户,和系统之间的用例关系,以及系统内用例之间的关联,下图为系统总的用例图。 图2.2 学生的用例图如下(图2.3) 图2.3 教师的用例如下:(图2.4) 图2.4 2.2.1角色说明 考生操作:考生登录后可以查看当前已存在的学科的试卷并参加考试,可以修改密码,要输入两次新密码以确认,下次登录后奏效,可以查看已经
8、参加完的科目的考试成绩。主要是从数据库中读取数据(题目的信息)并将页面中的信息发送到服务器通过Servlet调用数据库中的数据比较得出分数,并将分数结果存放到数据库中,以便下次查询成绩时读取。 教师操作:教师登录后也可以修改密码,同考生一样,输入两次确认密码,然后通过管理本学科试题库管理试题,在管理试卷时可以在试卷上增删题库中的题目。所有操作都在页面输入提交后执行。 2.2.2主要过程 考生登录后选择参加考试,点击相应的链接按钮后可以浏览该试卷上的试题内容和备选答案,并在每道题下将自己的答案选择好,答题完毕后按提交按钮,将会把本页的答案提交到相应的Servlet上调用逻辑层的方法比较核对得出分
9、数,将分数添加到数据库中。 教师登陆后可以管理试卷,管理试题,试题修改后,试卷上的试题也会相应的做出修改。用到了数据库的增删改查。 关于权限:考生有权限参加相应试题号的试卷的考试,但是无法查看学科试题库(遵循实际情况),考生参加考试完毕后有权限查阅自己的程序,但无法得知别的考生的成绩(通过设置网页的参数传值)没有设置教师查看考生成绩的权限。2.3 实体关系图(ER图设计)一、 各个实体和属性ER图2.4数据库的实现2.4.1数据库的简介该系统数据库采用的MySQL数据库,该数据库操作类似于控制台操作,主要优点是占用空间小,维护方便。数据库的操作语句是常见的结构化查询语言,作为j2ee开发的常用
10、数据库,该数据库具有连接步骤简便,运行稳定等特点。2.4.2数据库连接的方式该系统数据库连接方式采用Hibernate3.1开源架构连接,该连接方式的优点是可以根据需要自动生成数据表的映射文件并管理表之间的关联关系,这一有点弥补了关系型数据库在面向对象编程结合时的差异与不便。具体连接步骤略。以下是Hibernate数据库连接后采用逆向工程生成的工程Bean文件结构:外键关联配置在xml文件中2.4.3 数据库具体实现/教工表create table Teachers( TeacherID char(8) primary key, Name varchar(10), Password varch
11、ar(20), Course varchar(20) ); insert into Teachers values(20100001,李强,1234,高数); /代表该学科的缩写HMinsert into Teachers values(20100002,王峰,1234,线代); LMinsert into Teachers values(20100003,张华,1234,网络); NTinsert into Teachers values(20100004,赵立,1234,J2me); JMinsert into Teachers values(20100005,郭明,1234,J2ee);
12、 JEinsert into Teachers values(20100006,韩络,1234,英语); ENinsert into Teachers values(20100007,周志,1234,编译原理); CTinsert into Teachers values(20100008,戴艳,1234,数据库); DBinsert into Teachers values(20100009,安飞,1234,操作系统); OSinsert into Teachers values(20100010,陈哲,1234,软件工程); SE/考生表create table Students( Sno
13、 char(8) primary key not null, Sname varchar(10), Password varchar(20) );insert into Students values(20101000,杨尘,5678);insert into Students values(20101001,赵普,5678);insert into Students values(20101002,刘文,5678);insert into Students values(20101003,沈朗,5678);insert into Students values(20101004,华凌,567
14、8);insert into Students values(20101005,白卫,5678);insert into Students values(20101006,张华,5678);insert into Students values(20101007,李明,5678);insert into Students values(20101008,陆平,5678);insert into Students values(20101009,林武,5678);insert into Students values(20101010,孙凌,5678);/数据库添加外键参考alter table
15、 Emp add ConstraintForeign Key (empdeptNo) references Dept(departmentId); /给已存在的表定义外键方法/表设计:关于试卷,分为试题表(Items)和试卷表(Papers)试题表中的一个试题只能属于一个试卷,一个试卷则包含多个试题。试卷表与试题表两个表为一对多的关系,外键则为PaperNo,Papers中的主键,Items中的非主键(但是不能为空)。Items的主键ItemNo的生成方式采用自动分配方式(由数据库提供)Papers的主键PaperNo的生成方式采用手动分配方式(便于管理,先添加试卷,再添加试题)/试题表 其中
16、,ItemContent是题干,ItemOptionA到ItemOptionD为四个选项所代表的答案的内容(主要用于向考生展示)ItemAnswer为正确答案所代表的字母(用于核对出最终得分)create table Items( ItemNo int not null primary key auto_increment, ItemContent varchar(200), ItemOptionA varchar(20), ItemOptionB varchar(20), ItemOptionC varchar(20), ItemOptionD varchar(20), ItemAnswer
17、 varchar(4), PaperNo varchar(10) not null);/试卷表 试卷表首先分为若干个学科,每个老师都有一个对应的学科,则PaperNo主键的手动分配方式可以满足这一要求,在PaperNo的命名上先加上该学科代表的缩略字母。create table Papers( PaperNo varchar(10) primary key not null, PaperName varchar(20);/为各个学科添加题库元祖(此操作预先在后台做好,以便前台添加。)insert into Papers values(ENbase,学科题库);insert into Paper
18、s values(AMbase,学科题库);insert into Papers values(LMbase,学科题库);insert into Papers values(NTbase,学科题库);insert into Papers values(JMbase,学科题库);insert into Papers values(JEbase,学科题库);insert into Papers values(CTbase,学科题库);insert into Papers values(DBbase,学科题库);insert into Papers values(OSbase,学科题库);inser
19、t into Papers values(SEbase,学科题库);最后定义好外键:alter table Items add (constraint FK_ITP Foreign key(PaperNo) references Papers(PaperNo);在定义映射文件时,选择好相应的映射关系。/成绩表学生参加考试,答题完毕提交给服务器后,服务器要将考生的答案与数据库习题表中的标准答案核对,得出该考生的分数,并将分数添加到这个成绩表中。所以成绩表将由两个主键组成,即考生的学号,成绩的试卷编号。也是表的两个外键,另外的核心属性是考试成绩,和考试的科目,考试科目由试卷编号推算,考试成绩由比较
20、核对得出。表的定义如下:create table StuCredits( Sno char(8) not null, PaperNo varchar(10) not null, Grade tinyint check (grade=0 AND grade=100), Foreign key(Sno) references Students(Sno), Foreign key(PaperNo) references Papers(PaperNo);第三章 系统详细设计 3.1系统结构设计 系统结构图如下图3.1所示: 3.2功能模块设计本系统主要分5个模块,即用户登录管理模块(包括修改密码),教
21、师题管理模块,试卷管理模块,考生的参加考试模块,成绩查询模块。Jsp文件主要是编写用户的操作页面或调用一些dao方法,bean文件夹下放的是数据表的映射文件,(由Hibernate逆向工程自动生成)Servlet主要用于接收来自客户端的各种请求和参数,并调用逻辑层的方法将数据加入数据库,tool包内只写了两个类,用来将教师的科目汉字全称与英文缩写相互转化用。3.2.1登录模块设计登录模块的设计较为平常,采用MVC模式,用Form表单形式将信息提交给Servlet,Servlet调用dao包中的validate方法实现验证功能,Dao包中的validate函数方法字段:public boolea
22、n valiStu(String sno,String password)boolean flag=false;Session s=HibernateSessionFactory.getSession();List list=s.createQuery(from Student stu where stu.sno=+sno+ and stu.password+=+password+).list();if(list.size()0)flag=true;return flag;验证教师的代码原理相同。用户登录成功后会有欢迎提示,提示中会显示该用户的姓名信息,这一设计是参见了学校的教学管理系统登录后
23、会显示学生的姓名:相关代码:StudentDao sd=new StudentDao();Student stu=sd.queryStudentByID(sno); out.println(+stu.getSname()+);用户登录后可以修改密码,修改密码是将新密码和要修改密码的用户名传值给Servlet,再由Servlet调用dao中的editPassword()方法。方法体:Session s=HibernateSessionFactory.getSession();Transaction tran=s.beginTransaction();Student stu=(Student)s.
24、get(Student.class, sno);stu.setPassword(newpassword);s.saveOrUpdate(stu);mit();修改密码时,需要两次输入以确定输入正确,两次输入值相同则修改成功。3.2.2教师题管理模块的设计教师登陆后,可以点击管理试题的链接进入管理试题页面,该页面显示的是目前该学科题库内所包含的题目,教师可以在该页面直接添加新题或修改已有的题目,也可以删除不需要的题目。试题管理中的页面设计采用了table中嵌套form的方法,以便响应不同的请求做出不同的操作。为了美观,Table的样式也是采用实线型边框样式。题管理模块主要用到了ItemDao类中
25、的数据库操作方法,AddItem,,deleteItem,editItem方法,除此之外还有另一个模块试卷管理模块要用到的queryItem等,该Jsp发送请求的Servlet主要调用了ItemDao这个重要类的函数。该Jsp页面部分代码:ItemDao id=new ItemDao(); List list=id.queryAllItemsByCourse(cor);for(int i=0;ilist.size();i+) out.println(题干:+list.get(i).getItemContent()+选项A:+list.get(i).getItemOptionA() +选项B:+
26、list.get(i).getItemOptionB()+选项C:+list.get(i).getItemOptionC() +选项D:+list.get(i).getItemOptionD()+答案:+list.get(i).getItemAnswer()+ 删除该题编辑该题); 以下则是添加新试题的部分,添加新试题是在Item表中添加对应Paper为学科题库的Item,因为在设计表时,Paper这个外键属性设置不能为空,且要在试卷查询时和其他试卷分开,所以题库的PaperNo属性设置为课程号+“base”out.println(试题内容: + +选项A:选项B: +选项C:选项D:+ 正确
27、答案:);3.3.3教师试卷管理模块试卷管理模块先通过调用ItemDao中的QueryByPaper的方法,查询当前试卷所对应的试卷号下的题目,并根据该试卷的试题号的前两位(由程序自动生成的,在教师添加试卷的时候,试卷号只需输入特定的不重复字符串即可)决定该试卷的科目,确定科目后,调用QueryItemByCourse方法查询该学科题库内所有的试题,并除去该试卷上已存在的试题,在页面上显示该试卷可添加的试题,这样一来就避免了比如数学试卷上可以加英语题的非正常情况产生。关于在试卷上增加题目,则是在PaperNo对应的Paper中的外键关联属性Set中添加Item这个元素。(Set由Hiberna
28、te外键关联逆向工程自动生成)Dao包中ItemDao类内试卷可添加试题部分的代码:ArrayList list=new ArrayList();ArrayList clist=new ArrayList();Session s=HibernateSessionFactory.getSession();Paper p=(Paper)s.createQuery(from Paper p where p.paperNo=+course+base).list().get(0);Set set=p.getItems();Iterator it=set.iterator();while(it.hasNe
29、xt()list.add(it.next();Paper pc=(Paper)s.createQuery(from Paper paper where paper.paperNo=+paperNo+).list().get(0);Set Cset=pc.getItems();Iterator ir=Cset.iterator();while(ir.hasNext()clist.add(ir.next();for(int i=0;iclist.size();i+)if(list.contains(clist.get(i)list.remove(clist.get(i);return list;该
30、Jsp页面的设计类似于题管理模块的页面设计,table中嵌套Form来提交相应的不同请求。3.3.4 考生参加考试模块设计有了之前查询并前台显示试卷内容的基础,考生参加考试的页面设计也就容易很多了,主要是将相应的list中的Item元素遍历一遍,在遍历的同时,编排好试题的排布方式,即先是题干,接下来换行,每一行显示一个备选答案项,在试题下方有选择的下拉选框选择相应的试题答案项。关键则是考生点击了提交按钮之后,客户端发送数据到Servlet,Servlet如何处理发来的答案,并将该答案与其数据库中相应的题目的答案比较核对得出该份考卷的分数,并根据传过来的学号和试卷号参数确定学生以及这一张试卷的科
31、目,并把成绩输入到学生成绩表中。其中遇到了一个非常容易忽略的问题,就是动态的参数名实现动态传参的问题,因为服务器端不知道这张试卷上有多少道题,每道题都有一个Select标签提交参数项,服务器端也不知道哪道题对应哪一个Select传来的参数,这样一来比较答案得出分数将变得非常的困难,所以我在Jsp页面的设计上,用到了如下的编码技巧,动态参数名设置:out.println(您的答案:); 这一行代码最为关键,(i+1)这一处非常容易出错,因为遍历list的时候要从0开始,所以在考生答题页面显示题号时根据人的习惯应该把i+1,而且为了Servlet中处理的习惯方便一点,把i+1也是十分必要的,但是如
32、果没有外面的括号,那name的值传递的时候,是以字符串传递的,程序将会理解成该题的parameter属性名是“i1”比如i=0的时候本来要传1,结果变成传了01,要传2,结果传的是11,在Servlet中接收也接收不到参数值,造成无法比较。这个错误是我在计算分数功能失败,经多次调试后改正的。Servlet中的计算分数部分代码:Set set=pd.queryItemsByPaper(pno);ArrayList list=new ArrayList();ArrayList reqlist=new ArrayList();Iterator it=set.iterator();while(it.h
33、asNext()Item item=(Item)it.next();list.add(item);for(int i=1;i=list.size();i+)String reqAs=req.getParameter(Q+i); /接收相应的值。reqlist.add(reqAs);for(int i=0;ireqlist.size();i+)if(reqlist.get(i).equals(list.get(i).getItemAnswer()sum=sum+1;3.3.5 成绩查询模块设计在核对考生答案得出分数之后,调用StudentDao类中的AddCredit方法将这一分数记录添加到考生
34、成绩表中因为数据表中的Grade属性是tinyint,对应Java中的short类型数据,所以在计算完分数传递值的时候一定要注意转化,否则将不能插入数据库,而在转化之前要注意,如果考生没有答对所有题,那么考生答对题的数目除以总题数将会是小数,而小数转化成整数则会为0,这时再乘100还是零,这样会造成考生只有两种可能,要么满分要么零分的错误结果。同样经过多次调试修改后成功,代码如下:float all=(float)list.size(); float amount=(sum/all)*100;int credit=(int)amount; String credits=String.value
35、Of(credit); StudentDao sd=new StudentDao();sd.addCredit(pno, sno, credits);一定要用小数得出考生准确率,再乘100总分得该考生分数。StudentDao类中的添加成绩的方法:Short grade=Short.parseShort(credit);Session s=HibernateSessionFactory.getSession();Transaction tran=s.beginTransaction();Student stu=(Student)s.get(Student.class, sno);Paper p
36、aper=(Paper)s.get(Paper.class, pno);StuCredit sc=new StuCredit();StuCreditId sci=new StuCreditId(stu,paper,grade);sc.setId(sci); Set set=stu.getStuCredits();set.add(sc); stu.setStuCredits(set);s.saveOrUpdate(stu); mit();学生查询成绩的方法:Session s=HibernateSessionFactory.getSession(); List list= s.createQue
37、ry(from StuCredit sc where sc.student.sno=+sno).list(); return list;得到该考生学号对应的StuCredit表中的所有元祖。最后在设计查询分数页面时,因为考生要看的是哪一科多少分,而不是哪一个试卷编号的试卷多少分,所以要有一个将试卷编号转换成科目的手段,这就用到了程序自动添加的前两位学科缩写,通过只取编号前两位(subString方法)判断出科目(tool工具中的静态Revert方法)显示出来,该部分的代码如下:out.println(科目:+Revert.revert(list.get(i).getPaper().getPap
38、erNo().substring(0,2)+分数:+list.get(i).getId().getGrade()+);第四张 总结本次大作业做的这个网上考试系统虽然功能上还有很多不健全的地方,比如考试计时功能,多题型多选判断等功能,而且由于设计过程中问题太多,页面设计的投入非常有限,而且网页之间要传递的参数太多,由于设计模式的欠考虑,经常要为网页间的连通性做很大修改。到目前该系统的实现过程总体上感觉并没有想象中的容易,从数据库查询登录验证到教师的组题功能,到学生考生交卷自动评分,通过各种方法,基本上都是在页面打印各种参数,调试了很久才通过。通过这次大作业我学会了很多,也很清楚的认识到,学好一个
39、技巧不难,理解一个开发复用机制也可以在短时间内完成,但如果将各个方面的技术融合起来做出一个功能比较多样的程序需要很多时间和精力。这个系统的开发所用到的技术还只是局限于JavaBean,Hibernate,MVC架构,由于这学期相关开发知识,框架常识和原理掌握的不够全面扎实,许多进度稍后的方法模式都没有用到。经过这一个学期仅30多个课时的学习,只是初步了解了J2EE开发的技术思路和惯用模式,还是远远不够的,j2ee作为一个市场前景非常广阔的基于BS结构开发模式的开发技术,很有必要在以后的学习中不断深入研究。参考文献1UML建模图解教程 周力 人民邮电出版社2软件工程实践教程 刘冰等 机械工业出版
40、社3我的J2EE成功之路 郭峰 电子工业出版社4教材43参考:毕业论文(设计)工作记录及成绩评定册题 目: 学生姓名: 学 号: 专 业: 班 级: 指 导 教 师: 职称: 助理指导教师: 职称: 年 月 日实验中心制使 用 说 明一、此册中各项内容为对学生毕业论文(设计)的工作和成绩评定记录,请各环节记录人用黑色或蓝色钢笔(签字笔)认真填写(建议填写前先写出相应草稿,以避免填错),并妥善保存。二、此册于学院组织对各专业题目审查完成后,各教研室汇编选题指南,经学生自由选题后,由实验中心组织发给学生。三、学生如实填好本册封面上的各项内容和选题审批表的相应内容,经指导教师和学院领导小组批准后,交
41、指导教师;指导老师填好毕业论文(设计)任务书的各项内容,经教研室审核后交学生签名确认其毕业论文(设计)工作任务。四、学生在指导老师的指导下填好毕业论文(设计)开题报告各项内容,由指导教师和教研室审核通过后,确定其开题,并将此册交指导老师保存。五、指导老师原则上每周至少保证一次对学生的指导,如实按时填好毕业论文(设计)指导教师工作记录,并请学生签字确认。六、中期检查时,指导老师将此册交学生填写前期工作小结,指导教师对其任务完成情况进行评价,学院中期检查领导小组对师生中期工作进行核查,并对未完成者提出整改意见,后将此册交指导老师保存。七、毕业论文(设计)定稿后,根据学院工作安排,学生把论文(打印件)交指导老师评阅。指导老师应认真按毕业论文(设计)指导教师成绩评审表对学生的论文进行评审并写出评语,然后把论文和此册一同交教研室。八、教研室将学生的论文和此册分别交两位评阅人评阅后交回教研室保存。九、学院答辩委员会审核学生答辩资格,确定答辩学生名单,把