毕业论文 基于jsp在线考试系统设计_第1页
毕业论文 基于jsp在线考试系统设计_第2页
毕业论文 基于jsp在线考试系统设计_第3页
毕业论文 基于jsp在线考试系统设计_第4页
毕业论文 基于jsp在线考试系统设计_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业论文基于jsp在线考试系统设计1引言 22系统运行环境和功能简介 22.1系统运行环境 22.2系统功能模块划分 23系统的体系结构 43.1系统效劳器开发语言JSP 43.2数据层 5关系型数据库mssql2000+sp3 5数据库连接池 53.2.3Hibernate框架 63.3前台交互 7交互方式 73.3.2Ajax技术 73.3.3DWR 84系统的具体设计和实现 94.1系统的数据库设计 94.2题库管理模块 114.2.1保存、更新、删除试题 114.2.2查询试题 134.2.3试题与选项关联 144.3自动组卷模块 174.4试卷监控 224.5批阅试卷 224.6成绩查询 234.7注册考试 234.8在线测试 23倒计时 24分页获取试题 25分页保存答案 25自动阅卷 255系统的性能和平安 266小结 28参考文献 28英文摘要 29致谢 29附录 30基于jsp在綫考試系統摘要:本文阐述了运用b/s模式设计在线测试系统的思想,介绍了当前较流行的web应用技术和框架JSP、Java、Ajax和ORM技术,并以此为理论根底和实践依据,在Hibernate框架下结合数据库连接池技术,设计并实现了在线测试系统。完成了试题库的维护、自动组卷、自动阅卷〔客观题〕、教师批阅〔主观题〕、学生在线测试、成绩查询各项功能。关键字:在线测试JSPAjaxHibernateServlet1引言随着计算机技术,尤其是计算机网络技术的开展及其不断深入的普及。在21世纪信息时代已经到来的今天,网络对于人们来说已不再是一个陌生的概念。从个人到学校、公司、机关,网络已经并将继续影响着人们的生活、学习,必将对社会各行各业产生重大影响。学校作为培养人才的基地,更应该走在信息时代的前沿。如何利用网络来提高教学的质量和效率,克服传统教学的弊端,如何架起学生与教师以及学生与学生的网络交流平台,已成为教育者不得不考虑的现实问题。本系统着重研究在线测试系统的实现,充分利用web应用给我们带来的便利,结合各种流行高效的技术,利用web方式对题库进行管理和维护,提供自动生成试卷、自动阅卷、在线测试、查阅分数等功能,大大的节省了时间和精力,以到达辅助教学,提高教学效率的目的。2系统运行环境和功能简介2.1系统运行环境操作系统:WindowsXp/WindowsNTWeb应用效劳器:Tomcat5.5.26〔需要JDK1.5以上〕数据库:MSSQL2000+sp32.2系统功能模块划分本系统主要实现的功能有:题库管理、组卷、试卷监控、批阅试卷、注册考试、在线测试、成绩查询。功能如图2-1:图2-1系统功能图题库管理:教师用户可以增加、修改、删除、查询题库中的试题。本系统的试题种类包括单项选择、多项选择、填空、判断、简答和编程。其中问题的选项也可以进行管理,并且教师可以指定这些问题的作用范围,例如是否可以用于在线测试等。组卷:系统会保存教师填写的试卷参数,供学生注册时自动随机组卷。试卷监控:发布出去的试卷,教师可以监控所有注册该试卷的学生和试卷的状态。批阅试卷:考试结束,收回的试卷其中的主观题目教师可以进行批阅。注册考试:当教师发布试卷后学生可以进行注册。在线测试:注册后的试卷,学生可以进行在线测试。成绩查询:批阅后的试卷,学生可以查到自已的得分,教师可以按学生的姓名,查询学生的得分。3系统的体系结构整个系统采用表示层/业务逻辑层/数据层的三层体系结构。系统结构如图3-1。图3-1系统体系结构图3.1系统效劳器开发语言JSP系统效劳器编程采用最常用的JSP技术,JSP(JavaServerPage)是Sun公司在1999年发布的J2EE的重要组成局部,是基于JavaServlet以及整个Java体系的Web开发技术,为企业级Web的站点动态网页开发人员提供了一种非常简单却有效的工具。JSP与ASP有许多相似之处,都是为基于Web应用实现动态网页制作提供的技术环境支持,JSP有以下优点:①将内容的生成和显示别离.使用JSP技术,Web页面开发者可以使用HTML或XML标志或者小脚本来生成页面上的动态内容.生成内容的逻辑被封装在标志和JavaBeans组件中,并且被捆绑到小脚本中,所有的脚本在效劳器端运行。②强调可重用的组件。绝大多数JSP页面依赖于可重用的、跨平台的组件(JavaBeans或EJB)来执行应用程序所要求的更为复杂的处理,基于组件的方法加速了总体开发过程。③硬件平台和效劳器无关。JSP作为Java的组成局部,继承了Java技术的“一次编写,随处可用(Writeonce,runanywhere)〞的特性,可以运行于大多数流行的操作系统平台及Web效劳器。这种与效劳器和操作系统平台的无关性是JSP相对于其它动态网页技术最大的一个优点。④与Java平台有机集成。JSP技术是J2EE平台的重要组成局部。JSP使用Java语言作为它的脚步语言,在JSP页面中可以使用几乎所有的Java组件和JavaAPI,从而可以发挥Java语言的强大功能。使用JSP技术可以创立具有高度可伸缩性和可靠性的Web应用程序。⑤功能可扩展性。JSP可以通过JavaBean和EJB以及自定义的标记来扩展功能,也可以通过JDBC与Oracle,DB2,SQLServer等大型关系数据库进行连接;另外JSP提供了一些隐含对象,可以使脚步功能更加强大,并且编程更加容易、方便。例如利用Request对象,可方便地接收用户在HTML表单中提交的信息。利用session对象可以跟踪用户状态,利用application对象可以得到当前应用效劳的全局信息。系统中的在线学生的信息就是保存在application中。3.2数据层3.2.1关系型数据库mssql2000+sp3MicrosoftSQLServer2000数据库系统是在WindowsNT环境下开发的一种全新的关系型数据库系统,是开展最快的关系数据库。SQlServer2000具有大型数据库系统的一些根本功能,支持事务处理功能、支持数据库加密、设置用户组别或用户的密码和权限等等。SQLServer2000是一个具备完全Web支持的数据库产品,提供了以Web标准为根底的扩展数据库编程功能。由于最初的SqlServer2000并没有把1433端口翻开,所以需要给SQLServer2000打个Sp3补丁。3.2.2数据库连接池在根本的数据源〔DataSource〕实现中,物理的数据库连接和客户端的连接对象〔ConnectionObject〕有着一比一的对应关系。当连接对象关闭的时候,物理的连接也随之关闭。这样一个客户的会话都要花费资源去翻开,初始化和关闭物理连接。对于这个资源的消耗问题,可以用连接池〔ConnectionPool〕来解决。连接池中有以保持一个数据库物理连接的高速缓存,会话可以重复利用存储在缓存中的连接。连接池可以极大地提高性能,在多个客户端共享少量的物理连接的三层网络环境下表现的尤为突出。图3-2表示了JDBC驱动程序提供了一个应用效劳器用来建立和管理连接池ConnectionPoolDataSource的实现。在本系统中充分利用了Tomcat提供的dbcp数据库连接池功能。在多用户并发访问数据库的时候,利用连接池缓存数据库的连接,可以减少建立数据库连接造成的系统资源开销。同时dbcp连接池也提供了自动释放无效的数据库连接来防止系统由于数据库连接泄露造成系统崩溃。图3-2连接池的运作3.2.3Hibernate框架一般来说在数据层,我们可以用jsp直接调用sql语句操纵数据库,或者在JavaBean中利用sql语句执行数据库操纵。然而,这样会使我们在开发时候,把注意力过多的集中到sql语句上,同时系统的可维护性,和编写代码的效率很低。所以本系统中采用了ORM〔对象关系映射〕技术中的Hibernate框架结合DAO模式完成数据层的对象持久化的问题。在编写代码的时候,我们只要操纵Java中的对象,剩下的对象与数据的转换就交给Hibernate去处理了。这样系统的可维护性和开发效率就会有很大的提高。同时利用Hibernate从tomcat提供的JNDI连接池获取数据库连接,将其封装成Hibernate的Session,通过Session来处理对象的保存,更新,删除操作。Hibernate结合DAO实现对象的持久化,工作原理如图3-3。图3-3Hibernate结合DAO实现对象的持久化3.3前台交互3.3.1交互方式在前台与效劳器端的交互,系统中有两种方式,一种是常见的form表单提交的方式,此种方式应用在如系统用户登录的时候。当用户填写用户名和密码把表单提交到效劳器端,效劳器端接收到数据后,进行业务处理,验证用户明和密码后,把结果返回给浏览器。另外一种是客户端以异步请求的方式与效劳器端交互。在做数据验证,在线考试的剩余时间的获取和刷新时,这些都需要与效劳器进行异步通信和局部刷新页面。3.3.2Ajax技术Ajax这个名词是一位叫JesseJamesGarrett的美国人创造的。Jesse是AdaptivePath公司负责用户体验策略的主管,他在2005年2月18日发表了一篇题为?Ajax:一个Web应用的新途径?的论文。在文中他给出了Ajax的定义。Ajax不是一种技术。实际上,它由几种蓬勃开展的技术以新的强大方式组合而成。Ajax包含:1、基于CSS标准的表示;2、使用DocumentObjectModel进行动态显示和交互;3、使用XMLRequest与效劳器进行异步通信;4、使用JavaScript绑定一切。Ajax工作原理如下:1.客户断利用XMLRequest对象向效劳器发送异步请求2.效劳器端接受到请求后进行业务处理,处理完后把结果返回客户端3.客户端接受到返回响应后,进行更新页面等操作。各种技术在Ajax中的作用如图3-4。图3-4各种技术在Ajax中的作用3.3.3DWRDWR〔DirectWebRemoting〕是getahead公司开发的一个实现Ajax应用的框架。它允许客户端Javascript远程调用效劳器端的Java类的方法,执行相关的事物操作。DWR主要包含两个主要局部,其一是运行在浏览器端的Javascript,这局部被用来与效劳器通信,并更新页面内容:其二是运行在效劳器端的JavaServlet,这局部被用来处理请求并将响应结果返回给浏览器。 DWR采取了一种动态生成基于Java类的Javascript代码的方法来实现和处理Ajax。这样Web开发人员就可以在Javascript里像使用浏览器本地代码一样使用Java代码,而实际上这些Java代码是运行在效劳器端并且可以自由访问Web效劳器资源的。处于平安考虑,Web开发人员可以根据要求进行适当的配置来决定哪些Java类可以平安的被外部使用。4系统的具体设计和实现4.1系统的数据库设计结合系统的功能和分析,数据库的设计模型如图:4-1.问题选项表T_Q_ELEMENTS,问题表T_QUESTIONS,学生信息表T_STUDENTS,教师表T_TEACHERS,科目表T_SUBJECTS,章节表T_CHAPTS,班级表T_CLASS,试卷参数表T_EXAM_PARAM,学生试卷表T_EXAMS,试卷组成元素表T_EXAM_ELEMENTS。教师在页面添加试卷的参数向试卷参数表〔T_EXAM_PARAM〕中添加参数后,发布此试卷,学生可以注册考试,注册时首先会从试卷参数表〔T_EXAM_PARAM〕中读取相应的参数如单项选择题个数等,利用这些参数从题目表〔T_QUESTIONS〕中随机选取问题,而这些问题的选项可以从问题选项表〔T_Q_ELEMENTS〕关联查出,然后把这些问题的id添加到试卷组成元素表〔T_EXAM_ELEMENTS〕中,最后生成学生试卷表〔T_EXAMS〕。当学生在线答题时,会跟据学生试卷(T_EXAMS)的id查出试卷组成元素表中的记录得到问题id,利用问题的id得到问题和相关联的问题选项。学生保存答案时按题型分为两种情况,一是保存选择性的题目,此时就把被选中的问题的选项的id存入试卷组成元素表中对应的学生答案字段中。另外就是非选择性题目,即需要输入文字的题目,此时把输入的文字存入成元素表中对应的学生答案字段中。其中需要说明的是在实际编写代码时,对数据库做了一些改良。如问题表〔T_QUESTIONS〕与科目表〔T_SUBJECTS〕间的关联是用问题表中的科目名称〔strSUBName〕与科目表中的科目名称〔strNAME〕。同时教师和科目间的关联关系,在本系统中还没有应用到,但是出于以后的扩展考虑,仍然在教师表中建立一个字段科目的id。所以在设计数据库时并不是一味的追求数据库设计的标准性,而是结合实际情况,以提高系统效率为目的。因此某些冗余字段的出现,也正是出于此目的,例如试卷参数表〔试卷参数表〕中的试卷名称strNAME与学生试卷表中的试卷名称strName,就是冗余字段,当需要查出某学生参加的考试名称时就无需关联试卷参数表,这样就可以减少系统的开销,提高查询速度。图4-1:系统数据库模型图4.2题库管理模块该模块主要是教师用户可以增加、修改、删除、查询题库中的试题。本系统的试题种类包括单项选择、多项选择、填空、判断、简答和编程。其中问题的选项也可以进行管理,并且教师可以指定这些问题的作用范围,例如是否可以用于在线测试等。实现对题库中的试题的增加、删除、修改、查询时,始终直接操作都是相关的Java对象QuestionDAO,在这个java类里封装了对试题对象TQuestions的操作.这样的一个开发模式就是DAO〔数据访问对象〕模式。而最终把对象转换到数据库中的是利用Hibernate来实现的。下面就详细的介绍这个模块的实现和用到的相关技术。4.2.1保存、更新、删除试题Session接口是Hibernate向应用程序提供的操纵数据库的最主要接口,它提供了根本的保存、更新、删除和查询方法。Session具有一个缓存,位于缓存中的对象处于持久化状态,它和数据库中的相关记录对应,Session能够在某些时间点,按缓存中持久化对象的属性变化来同步更新数据库,这一过程被称为清理缓存。除了持久化状态,对象还能处于其他状态,Session的特定方法能使对象从一个状态转换到另一个状态。对于需要被持久化的Java对象,在它的生命周期中,可处于以下三个状态.临时状态(transient):刚刚用new语句创立,还没有被持久化,不处于Session的缓存中。没有和数据库记录相关联的Java对象被称为临时对象。.持久化状态(persistent):已经被持久化,参加到Session的缓存中。被固化到数据库中的Java对象被称为持久化对象。.游离状态(detached):已经被持久化,但不再处于Session的缓存中。其对应的Session实例己被关闭的Java对象被称为游离对象。Java对象的完整状态转换图如图4-1所示,Session的特定方法触发Java对象由一个状态转换到另一个状态。从图4-1看出,当Java对象处于临时状态或游离状态,只要不被任何变量引用,就会结束生命周期,它占用的内存就可以被JVM的垃圾回收器回收;当处于持久化状态,由于Session的缓存会引用它,因此它始终处于生命周期中。图:4-2Hibernate中对象状态转换图下面是更新问题和删除问题的局部代码:***更新问题*@paramobj问题*@returntrue/false*/privatebooleanupdate(TQuestionsobj){ Transactiontx=session.beginTransaction(); try{ session.update(obj); txmit(); returntrue; }catch(HibernateExceptione){ tx.rollback(); //TODOAuto-generatedcatchblock e.printStackTrace(); returnfalse; }}/***按id删除问题,*@paramid*@return*/publicbooleandelete(Integerid){ Transactiontx=session.beginTransaction(); try{ Stringhql="deletefromTQuestionswhereintId=?"; Queryq=session.createQuery(hql); q.setInteger(0,id); q.executeUpdate(); txmit(); returntrue; }catch(HibernateExceptione){ tx.rollback(); //TODOAuto-generatedcatchblock e.printStackTrace(); returnfalse; }}从上面的代码中可以看出操作的是一个Java对象,而在底层有Hibernate处理,把对象的操作,转换成对数据库的操作。4.2.2查询试题从数据库中检索对象是使用Hibernate最复杂的局部。HQL检索,HQL(HibernateQueryLanguage)是与其相似的关系型查询语言SQL的面向对象方言。它可以实现分页查询功能,而且利用占位符可以有效的防止SQL语句错误造成的系统异常甚至崩溃。并且它支持分页查询,在大量数据中可以只分页获取数据减小效劳器的不必要的资源开销。下面是一个分页查询题库中的试题的一个公共的方法。/***按试卷id查出所有与试卷相关的问题*@paramexamId*@paramstart*@paramcount*@returnList问题*/publicListqueryPage(intexamId,intstart,intcount){ session=HibernateUtil.openSession(); Stringhql="selectquestions,exelements.strAnswerfromTQuestionsasquestions,TExamEId=QExamid=?"; Queryq=session.createQuery(hql); q.setInteger(0,examId); if(count!=0){ q.setFirstResult(start); q.setMaxResults(count); } Listl=q.list(); HibernateUtil.closeSession(); returnl;}4.2.3试题与选项关联本系统同时支持对试题选项的管理与维护,教师用户可以对试题的选项进行增加、删除、修改的操作。并且试题选项数量不限。同试题一样,也是在一个DAO类QElementDAO中封装了对试题选项类TQElementDAO的一系列的操作。然而试题选项与试题是有关联关系的,那么如何处理这种关联呢。先看一下这一局部的数据库设计如表4-3和4-4表:4-3试题表T_QUESTIONS列名称数据类型是否主键是否为空备注intIDINT是否问题idstrContentVARCHAR〔3000〕问题内容strCHAPTvarchar(20)问题所属章节strTYPEvarchar(20)问题所属类型〔单项选择0,多项选择1,填空2,判断3,简答4,编程5strSUBNamevarchar(20)所属科目strLEVELvarchar(20)难度等级〔难0,正常1,简单2〕strUSESTATEvarchar(10)问题有效范围〔000-所有范围都不能用,001-只能用于正式测验,010-只能用于模拟测验,011-适用于正式测验,模拟测验,100-只适用于练习,101-适用于练习,正式测验110-适用于练习,模拟测验intCountsInt被抽取的次数intCreateIdInt创立人idstrCreatorVarchar(20)创立人姓名dcreateDateDatetime创立日期表:4-3试题选项表T_Q_ELEMENTS列名称数据类型是否主键是否为空备注intIDINT是否选项id strCONTENTVARCHAR〔3000〕选项内容intISANSWERINT是否为答案(0不是,1是)intQIDINT问题id在试题选项表中有一个试题的主键intQID作为外键,所以从试题到试题选项的一对多的关联关系是用试题的id关联上去的。那么如何在Java对象中表达这种关系呢?在TQuestions试题对象中用一个Set集合来存储它所关联的所有试题选项对象,在查询到某个试题时候就可以关联查出对应的所有试题选项了。两个类的局部代码如下:/***@authorzheng**/packageorg.zlj.zxcs.vo;importjava.util.Date;importjava.util.HashSet;importjava.util.Set;publicclassTQuestionsimplementsjava.io.Serializable{//FieldsprivateIntegerintId; //idprivateStringstrSubName;//科目名称privateStringstrContent;//内容privateStringstrChapt;//章节privateStringstrType;//类型privateStringstrLevel;//难度等级privateStringstrUsestate;//问题有效范围privateIntegerintCounts;//被抽取的次数privateIntegerintCreateId;//创立人idprivateStringstrCreator;//创立人姓名privateDatedcreateDate;//创立日期privateSettqelementset=newHashSet(0);//Constructors……setandgetpackageorg.zlj.zxcs.vo;/***TQElementsgeneratedbyMyEclipse-HibernateTools*/publicclassTQElementsimplementsjava.io.Serializable{privateIntegerintId;privateTQuestionsTQuestions;privateStringstrContent;privateIntegerintIsanswer;到此类中的关系有了,下面要做的就是要在Hibernate的映射文件中配置对象与数据间的转换关系了。局部配置代码如下:<hibernate-mapping><classname="org.zlj.zxcs.vo.TQElements"table="T_Q_ELEMENTS"schema="dbo"catalog="ONLINEEXAM"><idname="intId"type="java.lang.Integer"><columnname="intId"/><generatorclass="native"/></id><many-to-onename="TQuestions"class="org.zlj.zxcs.vo.TQuestions"fetch="select"cascade="none"><columnname="intQID"/></many-to-one><propertyname="strContent"type="java.lang.String"><columnname="strCONTENT"length="3000"/></property><propertyname="intIsanswer"type="java.lang.Integer"><columnname="intISANSWER"/></property></class></hibernate-mapping><hibernate-mapping><classname="org.zlj.zxcs.vo.TQuestions"table="T_QUESTIONS"schema="dbo"catalog="ONLINEEXAM"><idname="intId"type="java.lang.Integer"><columnname="intId"/><generatorclass="native"/></id><propertyname="strContent"type="java.lang.String"><columnname="strContent"length="3000"/></property>……<setname="tqelementset"table="t_Q_Elements"inverse="true" cascade="delete"lazy="false"> <key> <columnname="intQID"/> </key> <one-to-manyclass="org.zlj.zxcs.vo.TQElements"/></set></class></hibernate-mapping>在映射文件中的1对多关联关系是用<set>元素来配置的。图4-4是运行时的截图,查询出一个试题后,可以关联得到它的试题选项。图:4-4试题关联得到试题选项4.3自动组卷模块该模块主要是教师录入试卷的一些参数,供学生注册时随机生成试卷用。其页面如图4-5。在该页面教师要依据题库有符合条件的试题的数量来,填写各种试题的数量。这里使用Ajax技术中的DWR框架,异步获取试题库中可用题目数量,当教师选择试卷的科目和试卷的难度时,系统就会到数据库中获取与之匹配的题目数量,并把结果显示出来。具体实现方法如下。第一步:安装jar开发包。从DWR官方网站下载DWR开发包,这里使用的是DWR2.03这个开发包里包含了DWR运行所需的所有Java类和相应的API文档。把该jar包放到工程的lib包里。第二步:修改现有工程的web.xml配置文件。参加一个Servlet配置,代码如下。<servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet><servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern></servlet-mapping>这段描述主要是告诉WEB应用程序,全部以“/dwr/〞起始的URL所指的请求都交给这个Servlet处理。图4-5组卷参数页面第三步:创立dwr.xml在WEB-INF文件夹下建立dwr.xml配置文件。代码如下<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEdwrPUBLIC"-//GetAheadLimited//DTDDirectWebRemoting2.0//EN""://getahead.ltd.uk/dwr/dwr20.dtd"><dwr> <allow> <createcreator="new"javascript="JQuestionDao"> <paramname="class"value="org.zlj.zxcs.dao.QuestionDAO"/> <includemethod="getAviliableCount"/>…… </create> …… </allow></dwr>这段描述主要是把类转换成Jscript对象JQuestionDao并且只暴露方法getAviliableCount,该方法用来完成获取可用试题的数量。第四步:测试URL,查看是否转换成功在浏览器里输入://:8080/dwr,可以看到已经部署的所有java类,本例中,页面信息如下:ClassesknowntoDWR:JSubjectDao(org.zlj.zxcs.dao.SubjectDAO)JExamDao(org.zlj.zxcs.dao.ExamDAO)JExamElementDao(org.zlj.zxcs.dao.ExamElementDAO)JQuestionDao(org.zlj.zxcs.dao.QuestionDAO)点击JQuestionDao进入该类的方法部署页面如图4-6,在getAviliableCount中分别输入java,2,111表示java科目中难度为简单可用范围是正式测验的问题。点击Execute可以查看方法的实际运行情况如图4-7。到此说明DWR正常工作。图4-6JQuestionDao类图4-7DWR测试结果第五步:建立客户端页面,利用Javascript远程调用Java类的方法页面为://:8080/zxcs/teacher/examParamAdd.jsp,局部代码如下,运行效果如图4-8<scripttype='text/javascript' src='<%=basePath%>dwr/interface/JQuestionDao.js'></script><scripttype='text/javascript'src='<%=basePath%>dwr/engine.js'></script><scripttype='text/javascript'src='<%=basePath%>dwr/util.js'></script>…… //获取题库中的已有的个数 if(strSubName!="") JQuestionDao.getAviliableCount(strSubName,strLevel,"",showCheckValue);使用Ajax可以带来可见的便捷:1、减轻效劳器的负担。Ajax的原那么是“按需取数据〞,可以在相当的程度上减少冗余请求和响应对效劳器造成的负担。2、无刷新更新页面,减少用户心里和实际等待的时间。特别地,当要读取大量数据时,不会像Reload那样出现白屏的情况。Ajax使用XMLRequest对象发送请求并的得到效劳器的响应,在不重载整个页面的情况下,使用Javascript操作DOM更新页面。所以在读取数据的过程中,用户面对的不是空白的屏幕,是原来的页面内容〔也可以加点提示信息,让用户知道处于读取数据的过程〕,只有当数据接收完后才更新相应的局部内容。这种更新是瞬间的,用户几乎感觉不到。3、带来更好的用户体验。4、可以把以前一些效劳器的负担工作转嫁到客户端,利用客户端闲置的能力来处理,减轻效劳器和带宽的负担,节约空间和带宽本钱。5、可以调用外部数据。6、基于标准化的并被广泛支持的技术,无需下载插件或者小程序。7、进一步促进页面呈现和数据的别离。图4-8DWR调用远程方法4.4试卷监控模块的功能是对教师发布出去的试卷,教师可以监控所有注册该试卷的学生和试卷的状态。该功实现方法在于使用应用效劳器的application对象,来保存在线用户信息,创立一个session监听器,当session失效时从application对象中去除该用户的信息。在监控页面,获取注册了该试卷的所有学生和试卷的状态然后获取该学生的在线状态,通过页面表格显示出来。4.5批阅试卷对于收回的试卷,教师可以批阅其中的主观题,该模块是根据学生的试卷id获取试卷中的试题信息包括试题的参考答案和学生所做的答案,最后教师结合实际情况给学生评分。4.6成绩查询对于教师用户可以查询参与由自己发布的试卷的成绩。对于学生可以查询自己所有的测试成绩。主要是依赖与查询条件的控制。4.7注册考试学生可以注册教师已经发布的试卷,在组卷时,先从试卷参数表中读出参数,然后利用这些参数进行组卷。其中从题库中随机抽取n条试题时使用了mssql的selecttopn*fromtableNameorderbynewid(),而Hibernate的Session接口的Session.createSQLQuery(sql)方法可以生成原生SQL语句,这样就可以使用它来完成随机抽题了。4.8在线测试在线测试主要完成倒计时、分页获取试题、分页保存答案、三个主要的功能。由于需要进行异步请求和局部更新页面所以,这三个功能都是利用Ajax技术实现的,页面运行效果如图4-倒计时当页面加载时,自动调用javaScript脚本利用DWR获取考试剩余时间,利用javascript更新显示时间区域秒针显示。并把获取时间的脚本设置为每一分钟执行一次。当剩余时间为0时候自动调用结束考试的方法,同样此方法也是利用Ajax实现的。局部代码如下://取得剩余时间 functiongetLeftTime(){ JExamDao.getTimes(examId,showTimes); } //显示出剩余时间functionshowTimes(date){varlefttimes=$("timespace");if(date<=0){lefttimes.innerHTML=date;saveAnswer();//保存当页答案alert("考试已经结束");JExamDao.endExam(examId,function(){top.location='<%=basePath%>logout.jsp';});}else{ lefttimes.innerHTML="剩余"+date+"分钟"; showLeftSec();}}//显示时间秒数functionshowLeftSec(){if(leftseconds<0){//如果秒到0就重新更新分钟 leftseconds=59;//重新把秒针设为59 getLeftTime();//从数据库中重新获取剩余时间 }else{ $("leftsec").innerHTML=""+leftseconds+"秒"; leftseconds--; setTimeout("showLeftSec()",1000);//每秒更新一次秒针}}4.8.2分页获取试题获取试卷中的试题,利用Hibernate的一对多的关系可以很容易的获取试题和它所对应的试题选项,通过获取试题的种类给予用户不同的界面,如单项选择题那么显出单项选择按钮,多项选择题显示多项选择按钮,同时获取学生做过的答案,并将其显示在页面上。利用Hibernate中Query接口setFirstResult设置开始的行数和setMaxResults设置最大行数读取数据库中的记录,在页面结合javascript动态设置起始行数。相关代码见附录。4.8.3分页保存答案保存答案时把试题按两种类型保存,如果是选择性的题目保存被选中的选项的id,如果是输入文本性的题目保存其输入的文本。当学生点击翻页按钮时触发javascript脚本,利用Ajax进行保存当前页面的试题答案。4.8.4自动阅卷当提交试卷时,系统会自动批阅试卷中的单项选择题、多项选择题、判断题。评分时候分为两种,一种是正确答案只有一个的,即单项选择题和判断题。此时只要比拟学生提交的答案〔选项的id〕和该试题的正确答案的选项id是否一样即可。另外一种就是多项选择题,此时可先把学生做的答案即多个选项的id封装到一个Set集合中去,然后在获取试题的正确选项的Set集合,利用Java中的Set集合equals方法,来判断学生是否答对了此题。局部代码如下://把学生所做的答案组合成一个set集合 if(strAnswer!=null){ String[]tempAnswer=strAnswer.split(","); for(inti=0;i<tempAnswer.length;i++){ IntegertemInt=newInteger(tempAnswer[i]); setStuAnswer.add(temInt);} //获取问题的正确选项的id集合 while(tempIt.hasNext()){//问题选项 TQElementstempQE=(TQElements)tempIt.next(); Integertemp=tempQE.getIntIsanswer(); //把问题的正确答案的选项id放入集合中 if(Value()==1){ IntegerintQEID=tempQE.getIntId(); setQEID.add(intQEID);}}//比照学生所做的答案集合与问题的正确选项id集合 if(setStuAnswer.size()>0&&setQEID.size()>0 &&setStuAnswer.equals(setQEID)){ corExeIdSet.add(exeID); }}5系统的性能和平安在系统的设计和编码时候考虑到系统的性能和平安的问题主要采取的策略如下。1.采用数据库连接池。Tomcat提供了一个较为成熟的数据库连接池DBCP连接池,利用连接池可以使系统减少建立与数据库的连接次数。节约系统的珍贵支援,提高系统的负载量。2.合理配置数据库连接池,以提高系统的性能和平安。当web应用效劳器发异常时候可能会使当前数据库连接失效。而失效的连接如不及时的回收可能会造成系统的崩溃。Tomcat配置文件中的可以指定连接池自动回收失效的连接代码如下:<parameter><name>removeAbandoned</name><!--AbandonedDBconnectionsareremovedandrecycled--><value>true</value></parameter><parameter><name>removeAbandonedTimeout</name><!--UsetheremoveAbandonedTimeoutparametertosetthenumberofsecondsaDBconnectionhasbeenidlebeforeitisconsideredabandoned.--><value>60</value></parameter>3.利用Hibernate的Query接口的查询功能,防止出现SQL注入漏洞。发生此种情况有主要有两个原因。一是如果直接用页面的参数拼接SQL语句,如果参数为SQL语句中的特殊字符如单引号,可能会造成SQL语法错误而导致程序出错。例如下面这个用户登录的代码就会出错。Stringsql=〞select*fromuserwhereusername=’〞+userName+〞’andpassword=’〞+passWord+〞’〞当userName是一个单引号时候就会导致SQL语法错误。而采用Hibernate的Query接口时候,可以使用占位符解决这个问题。代码如下:Stringhql=〞fromTuserwhereusername=?Andpassword=?〞Queryquery=Session.CreateQuery(sql);query.setString(1,userName);query.setString(2,passWord);第二种情况是没有充分考虑到程序的逻辑问题。同样对于第一种情况如果userName=“a〞passWord=〞b’or1=1〞。虽然不会导致SQL语句出错,但是这条语句会使用户通过验证。解决的方法是改良代码,先利用Hibernate的Query接口查出符合条件的用户,然后在取出该用户的密码比拟与用户输入的密码是否一致此时就可以有效的防止SQL注入漏洞了。4.在查询页面采用分页查询,减轻效劳器与客户端的负担。利用Hibernate中Query接口setFirstResult设置开始的行数和setMaxResults设置最大行数读取数据库中的记录,在页面结合javascript动态设置起始行数。5.批量增加和更新数据库。在组卷的时候,需要大量屡次的向数据库插入和更新数据。此次可以利用Hibernate的批量插入和更新减少与数据库的交互次数提高系统的执行效率。局部代码如下:while(it.hasNext()){ ……//批量插入session.save(examElements);i++;if(i%20==0){//将本批插入的对象立即写入数据库并释放内存session.flush();session.clear();}}6.在系统的配置文件中参加默认页面和自己的异常处理。给系统参加一个默认页面可以防止列表目录的发生,同时指定自己的错误页面可以有效的减轻系统暴露代码信息。利用错误页,捕获自己的异常可以给用户良好的提示。局部配置代码如下:<!--欢送页--> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <!--错误页--> <error> <exception-type> </exception-type> <location>/include/error/advice.jsp</location> </error> <error> <error-code>404</error-code> <location>/include/error/404error.jsp</location> </error> <error> <error-code>500</error-code> <location>/include/error/500error.jsp</location> </error>6小结本系统采用了相关稳定技术和框架提高系统的可维护性,在编写代码的同时尽量做的代码的标准性。在设计和实现系统时候,注重提高系统的扩展性和系统的执行效率。然而由于技术和时间有限有些方面还需改良。参考文献[1]RyanAsleson,NathanielT.Schutta.FoundationsofAjax[M].金灵译人民邮电出版社.2006[2]孙卫琴.精通Hibernate[M].北京,电子工业出版社.2005[3]刘彬.JSP数据库高级教程[M].北京,清华大学出版社.2006[4]SueSpielman,MeerajKunnumpurath.J2EE1.4编程指南[M].马树奇,金燕译.北京,电子工业出版.2005[5]洪峰,吴云飞.AJAX技术优化在线考试流量[J].长沙通信职业技术学院学报,第5卷第3期2006年9月:56-61[6]柴进,姚全珠,孙楹,孙荣荣.基于J2EE平台的在线考试系统的设计与实现[J].宁夏工程技术第1卷第3期2002年11月:235-237[7]柯自聪.Ajax开发精要[M].北京,电子工业出版社.2006[8]BrianWright、MichaelFreedman.JSPAPPLICATION DEVELOPMENTINDATAWAREHOUSE[M].北京,北京希望电子出版社.2001[9]BRUCEECKEL.THINKINGINJAVA[M].北京,机械工业出版社.2005英文摘要DesignandImplementationoftheJavaLearningPlatformfortheExchangebasedonJspOnlinetestingandQuestionsAbstract:Thisthesisintroducesthestructureofweb-basedapproachandb/smodeofonlinetestingsystem.ThecurrentmorepopularwebapplicationsandframeworkssuchasJSP,Java,AjaxandORMtechnologyisintroducedespecially.Andasatheoreticalbasisandpracticalbasis,withwebapplicationsanddatabasetechnologywedesignedandimplementedanonlinetestingsystem.Thesystemisb/smodetoachieveafunctionoftestingquestionsforthemaintenance,generatingpaperautomatically,markingobjectivequestionsautomatically,reviewingsubjectivequestionsbyteachers,onlinetestingandqueryingtestingresults.Keywords:OnlineTestingJSPAjaxHibernateServlet致谢在这四年的学习生活中,学校严谨的治学作风、良好的学习气氛、老师们认真的工作态度,都给我留下了非常深刻的印象。大学里我学到了很多知识,同时我也学到了如何学习的能力。在各科教师的启发和指引下,分析问题的能力有很大提高。整个大学生活是我人生中重要的一笔财富。在我的整个毕业设计的制作过程中,得到了老师的细心指导和关心。在此,我特别表示衷心的感谢!

附录web工程配置文件web.xml:<?xmlversion="1.0"encoding="UTF-8"?><web-appversion="2.4"xmlns="://java.sun/xml/ns/j2ee" xmlns:xsi=":///2001/XMLSchema-instance" xsi:schemaLocation= ://java.sun/xml/ns/j2ee/web-app_2_4.xsd"> <!--部署名称--> <display-name>zxcs</display-name> <!--<context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/perties</param-value> </context-param> --><context-param> <param-name>title</param-name> <param-value>java在线测试系统</param-value> </context-param> <!--过滤器--> <filter> <description>encodeFilter</description> <filter-name>encodeFilter</filter-name> <filter-class></filter-class> <init-param> <param-name>encodeType</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodeFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <description>studentUserFilter</description> <filter-name>studentUserFilter</filter-name> <filter-class></filter-class> </filter> <filter-mapping> <filter-name>studentUserFilter</filter-name> <url-pattern>/student/*</url-pattern> </filter-mapping> <filter> <description>teacherUserFilter</description> <filter-name>teacherUserFilter</filter-name> <filter-class></filter-class> </filter> <filter-mapping> <filter-name>teacherUserFilter</filter-name> <url-pattern>/teacher/*</url-pattern> </filter-mapping><!—系统监听器--> <listener> <description>SystemContextListener</description> <listener-class> </listener-class> </listener> <!--servlet--> <servlet> <description>login</description> <display-name>login</display-name> <servlet-name>Login</servlet-name> <servlet-class></servlet-class> </servlet> <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class></servlet-class> <init-param> <param-name>debug</param-name> <param-value>false</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <!--欢送页--> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <!--错误页--> <error> <exception-type> </exception-type> <location>/include/error/advice.jsp</location> </error> <error> <error-code>404</error-code> <location>/include/error/404error.jsp</location> </error> <error> <error-code>500</error-code> <location>/include/error/500error.jsp</location> </error> <!--session有效期单位分钟--> <session-config> <session-timeout>30</session-timeout> </session-config> <mime-mapping> <extension>ico</extension> <mime-type>image/x-icon</mime-type> </mime-mapping></web-app>Hibernate配置文件(hibernate.cfg.xml):<?xmlversion='1.0'encoding='UTF-8'?><!DOCTYPEhibernate-configurationPUBLIC"-//Hibernate/HibernateConfigurationDTD3.0//EN"":///hibernate-configuration-3.0.dtd"><!--GeneratedbyMyEclipseHibernateTools.--><hibernate-configuration><session-factory> <propertyname="dialect"> </property> <propertyname="connection.datasource"> java:comp/env/jdbc/zxcs </property> <propertyname="show_sql">false</property> <propertyname="jdbc.batch_size">20</property> <mappingresource="org/zlj/zxcs/vo/TSubjects.hbm.xml"/> <mappingresource="org/zlj/zxcs/vo/TExamParam.hbm.xml"/> <mappingresource="org/zlj/zxcs/vo/TQuestions.hbm.xml"/> <mappingresource="org/zlj/zxcs/vo/TExams.hbm.xml"/> <mappingresource="org/zlj/zxcs/vo/TTeachers.hbm.xml"/> <mappingresource="org/zlj/zxcs/vo/TStudents.hbm.xml"/> <mappingresource="org/zlj/zxcs/vo/TQElements.hbm.xml"/> <mappingresource="org/zlj/zxcs/vo/TClass.hbm.xml"/> <mappingresource="org/zlj/zxcs/vo/TExamElements.hbm.xml"/> <mappingresource="org/zlj/zxcs/vo/TChapts.hbm.xml"/></session-factory></hibernate-configuration>Hibernate映射文件中问题表映射文件〔TQuestions.hbm.xml〕<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"":///hibernate-mapping-3.0.dtd"><!--MappingfileautogeneratedbyMyEclipse-HibernateTools--><hibernate-mapping><classname="org.zlj.zxcs.vo.TQuestions"table="T_QUESTIONS"schema="dbo"catalog="ONLINEEXAM"><idname="intId"type="java.lang.Integer"><columnname="intId"/><generatorclass="native"/></id><propertyname="strContent"type="java.lang.String"><columnname="strContent

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论