基于jsp在线考试系统设计(编辑修改稿)内容摘要:

案字段中。 另外就是非选择性题目,即需要输入文字的题 目,此时把输入的文字存入成元素表中对应的学生答案字段中。 其中需要说明的是在实际编写代码时,对数据库做了一些改进。 如问题表( T_QUESTIONS)与科目表( T_SUBJECTS)间的关联是用问题表中的科目名称( strSUBName)与科目表中的科目名称( strNAME)。 同时教师和科目间的关联关系,在本系统中还没有应用到,但是出于以后的扩展考虑,仍然在教师表中建立一个字段科目的 id。 所以在设计数据库时并不是一味的追求数据库设计的规范性,而是结合实际情况,以提高系统效率为目的。 因此某些冗余字段的出现,也正是 出于此目的,例如试卷参数表(试卷参数表)中的试卷名称 strNAME 与学生试卷表中的试卷名称 strName,就是冗余字段,当需要查出某学生参加的考试名称时就无需关联试卷参数表,这样就可以减少系统的开销,提高查询速度。 第 10 页 共 43 页 图 41:系统数据库模型图 第 11 页 共 43 页 题库管理模块 该模块主要是 教师用户可以增加、修改、删除、查询题库中的试题。 本系统的试题种类包括单选、多选、填空、判断、简答和编程。 其中问题的选项也可以进行管理,并且教师可以指定这些问题的作用范围,例如是否可以用于在线测试等。 实现对题库中的试题的增加、删除、 修改、查询时,始终直接操作都是相关的 Java 对象 QuestionDAO,在这个 java 类里封装了对试题对象 TQuestions 的操作 .这样的一个开发模式就是 DAO(数据访问对象)模式。 而最终把对象转换到数据库中的是利用 Hibernate 来实现的。 下面就详细的介绍这个模块的实现和用到的相关技术。 保存、更新、删除试题 Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要接口,它提供了基本的保存、更新、删除和查询方法。 Session 具有一个缓存,位于缓存中的对象处于持久化状态 ,它和数据库中的相关记录对应, Session 能够在某些时间点,按缓存中持久化对象的属性变化来同步更新数据库,这一过程被称为清理缓存。 除了持久化状态,对象还能处于其他状态, Session 的特定方法能使对象从一个状态转换到另一个状态。 对于需要被持久化的 Java 对象,在它的生命周期中,可处于以下三个状态 . 临时状态 (transient):刚刚用 new 语句创建,还没有被持久化,不处于 Session 的缓存中。 没有和数据库记录相关联的 Java 对象被称为临时对象。 . 持久化状态 (persistent):已经被 持久化,加入到 Session 的缓存中。 被固化到数据库中的 Java 对象被称为持久化对象。 . 游离状态 (detached):已经被持久化,但不再处于 Session 的缓存中。 其对应的 Session 实例己被关闭的 Java 对象被称为游离对象。 Java对象的完整状态转换图如图 41所示 ,Session的特定方法触发 Java对象由一个状态转换到另一个状态。 从图 41 看出, 当 Java 对象处于临时状态或游离状态,只要不被 任何 变量引用,就会结束生命周期,它占用的内存就可以被JVM 的垃圾回收器回收。 当处于持久化状态,由于 Session 的缓存会引用它,因此它始终处于生命周期中。 第 12 页 共 43 页 图: 42Hibernate 中对象状态转换图 下面是更新问题和删除问题的部分代码: ** * 更新问题 * @param obj 问题 * @return true/false */ private boolean update(TQuestions obj){ Transaction tx = ()。 try { (obj)。 ()。 return true。 } catch (HibernateException e) { ()。 // TODO Autogenerated catch block ()。 return false。 } } /** * 按 id删除问题, * @param id * @return */ public boolean delete(Integer id){ 第 13 页 共 43 页 Transaction tx = ()。 try { String hql=delete from TQuestions where intId=?。 Query q=(hql)。 (0, id)。 ()。 ()。 return true。 } catch (HibernateException e) { ()。 // TODO Autogenerated catch block ()。 return false。 } } 从上面的代码中可以看出操作的是一个 Java 对象,而在底层有 Hibernate处理,把对象的操作,转换成对数据库的操作。 查询试题 从数据库中检索对象是使用 Hibernate 最复杂的部分。 HQL 检索 ,HQL( Hibernate Query Language)是与其相似的关系型查询语言SQL 的面向对象方言。 它可以实现分页查询功能,而且利用占位符可以有效的避免 SQL语句错误造成的系统异常甚至崩溃。 并且它支持分页查询,在大量数据中可以只分页获取数据减小服务器的不必要的资源开销。 下面是一个分页查询题库中的试题的一个公共的方法。 /** * 按试卷id查出所有与试卷相关的问题 * @param examId * @param start * @param count * @return List 问题 */ public List queryPage(int examId, int start, int count) { session=()。 String hql = select questions , from TQuestions as questions,TExamElements as exelements where = and =?。 Query q = (hql)。 (0, examId)。 if (count != 0) { 第 14 页 共 43 页 (start)。 (count)。 } List l = ()。 ()。 return l。 } 试题与选项关联 本系统同时支持对试题选项的管理与维护,教师用户可以对试题的选项进行增加、删除、修改的操作。 并且试题选项数量不限。 同试题一样,也是在一个DAO 类 QElementDAO 中封装了 对试题选项类 TQElementDAO 的一系列的操作。 然而试题选项与试题是有关联关系的,那么如何处理这种关联呢。 先看一下这一部分的数据库设计如表 43和 44 表: 43试题表 T_QUESTIONS 列名称 数据类型 是否主键 是否为空 备注 intID INT 是 否 问题 id strContent VARCHAR( 3000) 问题内容 strCHAPT varchar(20) 问题所属章节 strTYPE varchar(20) 问题所属类型(单选0,多选 1,填空 2,判断 3,简答 4, 编程 5 strSUBName varchar(20) 所属科目 strLEVEL varchar(20) 难度等级(难 0,正常 1,简单 2) strUSESTATE varchar(10) 问题有效范围( 000所有范围都不能用 , 001只能用于正式测验, 010只能用于模拟测验, 011适用于正式测验,模拟测验, 100只适用于练习, 101适用于练习 ,正式测验 110适用于练习 ,模拟测验 intCounts Int 被抽取的次数 intCreateId Int 创建人 id strCreator Varchar(20) 创建人姓名 dcreateDate Datetime 创建日期 第 15 页 共 43 页 表: 43试题选项表 T_Q_ELEMENTS 列名称 数据类型 是否主键 是否为空 备注 intID INT 是 否 选项 id strCONTENT VARCHAR( 3000) 选项内容 intISANSWER INT 是否为答案 (0 不是 ,1是 ) intQID INT 问题 id 在试题选项表中有一个试题的主键 intQID 作为外键 ,所以从试题到试题选项的一对多的关联关系是用试题的 id关联上去的。 那么如何在 Java 对象中体现这种关系呢。 在 TQuestions 试题对象中用一个 Set 集合来存储它所关联的所有试题选项对象,在查询到某个试题时候就可以关联查出对应的所有试题选项了。 两个类的部分代码如下: /** * @author zheng * */ package。 import。 import。 import。 public class TQuestions implements { // Fields private Integer intId。 //id private String strSubName。 //科目名称 private String strContent。 //内容 private String strChapt。 //章节 private String strType。 //类型 private String strLevel。 //难度等级 private String strUsestate。 //问题有效范围 private Integer intCounts。 //被抽取的次数 private Integer intCreateId。 //创建人 id private String strCreator。 //创建人姓名 private Date dcreateDate。 //创建日期 private Set tqelementset = new HashSet(0)。 // Constructors „„ set and get package。 /** * TQElements generated by MyEclipse Hibernate Tools */ public class TQElements implements { 第 16 页 共 43 页 private Integer intId。 private TQuestions TQuestions。 private String strContent。 private Integer intIsanswer。 到此类中的关系有了,下面要做的就是要在 Hibernate 的映射文件中配置对象与数据间的转换关系了。 部分配置代码如下: hibernatemapping class name= table=T_Q_ELEMENTS schema=dbo catalog=ONLINEEXAM id name=intId type= column name=intId / generator class=native / /id manytoone name=TQuestions class= fetch=select cascade=none column name=intQID / /manytoone property name=strContent type= column name=strCONTENT length=3000 / /property property name=intIsanswer type= column name=intISANSWER / /property /class /hibernatemapping hibernatemapping class name= table=T_QUE。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。