摘 要
SMART系统是一个采用新思路、新架构、新技术开发出来的一个新型智能在线考试信息管理系统,该系统主要实现了学生在线考试与评估以及对各种评估信息的管理和维护。本文针对教育工作的具体需求,用struts + spring + hibernate搭建的框架为设计平台,以B/S(Browser/Server)模式开发与设计题库及试卷管理模块。本设计为Smart系统的一部分。主要设计和实现了学校考试的出卷方式与试题库的管理。论文首先阐述了题库管理及试卷管理系统的详细需求分析、数据库的合理设计以及系统设计原理,给出了计算机管理环境下的题型分类、试卷生成的方法,并从科学、实用的角度构造系统功能模块,包括试题录入、题库维护、生成试卷、试卷管理等功能。其次介绍了各个模块功能的具体实现,包括:题库权限管理、手动出卷、自动出卷等。最后通过本模块的应用,可以满足评估系统中考试需求,对教育评估的发展起到一定的促进作用。
关键词:Struts;Spring;Hibernate;卷生成;题库;卷管理
3.1 题库管理
3.1.1 试题管理需求分析
试题管理是整个系统非常核心的模块,它基于知识点模块、章节模块、课程模块、题型管理模块完成的基础上的。其中核心元素是试题,通过试题将题库中的各模块连接起来。
试题管理分为题库录入和题库维护两部分组成。试题录入是整个题库管理模块的灵魂所在,所以试题录入十分重要。由于试题类型很多和试题录入、查询时方便快捷、管理的便利等各个因素考虑,不同种题型的试题分别保存在不同的试题库中。同时考虑到整系统的实用性,每一个题库都要有一个相应的答案库。答案库是独立的,这样设计是为了避免答案的泄露。
题库管理模块用来维护题库中的试题的,对题库中的试题提供增加、删除、修改及其查询等功能。其中题库生成是一个独立的子模块。
题库是有使用权限的,只有拥有权限的管理员与教师才可以向题库中添加各种类型且符合要求的试题,也可以对它们进行修改和删除。所添加的试题可以通过试题来源来设计试题库,例如:可以设计某某老师的题库。这样设计可以使老师在出卷的时候直接调用自己的题库来出试卷。这样方便了教师的出卷,缩减了教师的工作量和时间。
3.1.2 试题管理设计方案
试题录入:首先进入,选择年级,课程,章节,知识点,只有知识点不为空的时候点确定,才会跳出试题的具体设置信息,否则会提示“请首先选择知识点”要选择对应的试题类型,才能跳出对应的选项。比如选单选才能跳出单选对应的内容。所涉及的表的操作主要是保存。
题库管理:进入初始化页面,将所有的试题查询出来显示在页面上。
(1)查询:为用户提供3种查询方式——按知识点查找(通过年级→课程→章节→知识点),按试题类型查找和按试题来源查找。通过3种查询方式,分别显示出符合条件的试题,显示在页面上。
(2)删除:主要实现对试题的删除操作。通过试题左端的复选框,实现单个试题的删除或者批量的删除。
(3)修改:主要实现对试题的修改功能。通过点击试题对应的id,或者通过选择复选框,进入到修改页面。
a.修改页面要先加载整个试题的内容,单用户修改完内容点击保存的时候,能够更新数据库中对应的字段的内容。
b.修改页面还要实现对本试题的删除,以及返回到初始页面的功能。
(4)主要涉及表有:
物理年级表:smart_real_grade 课程表:smart_course
章节表:smart_section 知识点表:Smart_knowledge_point
判断题目表:smart_judgement 单选题目表:smart_single_choice
多选题目表:smart_multi_choice 试题来源表:smart_source
标准答案表:smart_answer
3.2试卷管理
3.2.1 试卷管理需求分析
功能主要实现试卷由试题组成,而试题又来自于题库,所以试卷管理模块依赖于题库。试卷管理对试卷提供管理,包括试卷的增删改查。试卷管理中最重要的是试卷的生成,试卷生成的结果存储到试卷库。
试卷的生成可能根据多种条件来生成,可以人工出题,自动出题,试卷应具有“单元测试、学年/半学年测试、学年考试、年级统考等多种性质,以适合不同场合的需要。可以由出卷人来设定,试卷生成与题型管理结合非常紧密。
手动出卷:老师可以定制出卷的一些参数,比如:总题目数、试题的类型,每种类型试题中具体小题的数目,每道题的分数,每个年级的题所占比例,相关题目的难度比例、试题的范围等,在此基础上,系统会根据出卷人的参数,按类型分类筛选出符合条件的试题,以可翻页的方式显示,由出卷人选择确定后生成一套完整的试卷。
自动出卷:老师可以定制出卷的一些参数,比如:总题目数、试题的类型,每种类型试题中具体小题的数目,每个年级的题所占比例,相关题目的难度比例、试题的范围等,在此基础上,系统会根据出卷人的参数,自动生成一套完整试卷。
鉴于主观题的主观性,目前无法实现系统自动阅卷,所以本系统只作客观题部分。一般情况下,单选题往往在四个供选的答案A、B、C、D中选择唯一正确的答案;多选题是在供选答案中有多个选择;而判断题实质上就相当于有两个选项的单选题。因而,本系统中所涉及的单选题和多选题跟过去的大体相同。还有判断题部分。并且假设多选题一般情况下也是最多提供八个备选答案,标准答案至少有一个。故各题型的样题设计如下:
单选题:password的意思是: A、密码 B、经过 C、单词 D、通路
正确答案为A
多选题:下面的表达式为真的有:A、1>2 B、7%5=2
C、sin(30)=1/2 D、Cint(7/5)=1
正确答案为B、C、D
3.2.2 试卷管理设计方案
试卷生成:当用户进入试题管理的模块新建一份试卷时,给用户提供试卷类型、出题方式、使用年级、及其相应的科目和适用考试名称的选项,用户只要选择就可以了,避免手动输入,给用户提供了很大的方便,同时也节省了宝贵时间。其余的就是让用户设置试卷的相关内容,为接下来的试卷的试题的具体添加做好准备。如果设置的各个类型的题目的总分没有和开始设置的整张试卷的总分一致是无法进入下一步进行添加各种试卷具体类型的题目的。只有第一步骤设置都满足条件后就可以进一步完成出卷。当用户进入步骤二时看到页面显示的所有参数都是有步骤一设定的。如试题类型和每一类型题型要选的题目数的数目都是通过前面的设定来的,接着用户就可以设定各种参数从数据库抽题目,如选题的时候可以按书本查询、章节查询、各个知识点查询。提高了选题的速度和准确度,体现了出题的智能化。试题被选中显示在页面刷新。就采用了ajax技术避免传输,并实现了分页显示。当用户选定了相应的题目的时候,点击添加试题的时候。也是采用的ajax技术传到后台函数进行处理,把数据保存相应的session中,处理成功后会给用户一个对话框提示“临时保存成功”。用户就可以进行下一类型试题的添加了。
试卷管理:进入初始化页面,将所有的试选查询出来显示在页面上。可以通过点击列表的每一列表头,可以对所以试卷对应相关属性进行排序,用户使用十分方便快捷。
(1)查看:用户可以点击所要查看的试卷所在行的查看图片,就可以看到此试卷的所有内容。
(2)删除:主要实现对试卷的删除操作。通过试卷左端的复选框,实现单个试卷的删除或者批量的删除。
(3)修改:主要实现对试卷的修改功能。通过点击试卷对名称链接进入到修改页面,进行修改操作。
4.2 系统实现
4.2.1 题库管理模块实现
图6试题录入页面
通过设定各个条件,选择整道试题的属性,试题内容的录入采用的是一个编辑器,可以对试题进行排版,保存的时候以html标签的形式保存,图片会放到相应的文件夹下。避免了将图片的格式转换成二进制流保存到数据库和显示时的格式转换的繁琐的步骤。减少了开发过程中难度。部分代码实现如下:
//页面调用编辑器方法
<SCRIPT language="javascript">
function eWebEditorPopUp(form, field, width, height) { window.open("eWebEditor/popup.htm?style=popup&form="+form+"&field="+field,"", "width="+width+",height="+height+" ");}
</SCRIPT>
//Acition 的保存方法
public ActionForward save(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {
//通过form 得到页面所有的值
FactoryTopicAddForm factoryform=(FactoryTopicAddForm) form;
Map params=new HashMap();
String sourceNo=(String)request.getParameter("sourceNo");//试题来源no
params.put("sourceNo",sourceNo);
//调用逻辑事务层的“ShowSource”方法
SmartSource source = (SmartSource) this.call(new Carrier(params,
BusinessConstants.FACTORY_TOPIC_BUSINESS,"ShowSource"));
String number=factoryform.getSelect2();//选项
if(number.equals("单选")){
SmartSingleChoice single= new SmartSingleChoice();
single.setOptionA(factoryform.getOptiona());
…………
String s = Desc.replaceAll("<", "<");//替换标签
…………
//掉用保存方法最终保存到数据库
params.put("single", single);
List result = (List) this.call(new Carrier(params,
BusinessConstants.FACTORY_TOPIC_BUSINESS,
"SaveSingleChoice"));
}
}
图7试题管理页面
实现了按多种条件的查询和删除修改功能,各种题型是保存在不同的表中,整个框架采用的是hibernate连接数据库,要查询出所有的试题内容涉及的多张表的操作,所以在查询过程中用了存储过程进行查询。
具体代码如下:
/**定义一个实体类**/
public class QuestionSearch extends PersistenceObject implements Audit,
java.io.Serializablei {
private String questionNo;
public String getQuestionNo() {……}
public void setQuestionNo(String questionNo) {……}
}
}
/**定义一个业务逻辑层的方法**/
public Object processSearchQuestion(Carrier vo) {
Map data = vo.geitData();
Object[] params = new Object[5];// 定义一个数组
params[0] = (datai.get("knowledgeNo") != null) ? data.get("knowledgeNo"): "";// 将参数存放进数组
……
List result = ((FactoryDAO) getDao()).searchQuestion(params);//调用方法
return result;
}
/**定义一个相应的xml配置文件**/
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!—- 定义存储过程调用的实体类及其类中的各个元素的名称-- >
<class name="com.smart.entity.resource.QuestionSearch">
<id name="questionNo" type="string" />//
......
</class>
<sql-query name="SearchQuestionBySource">//存储过程的名称
<!—-- 将存储过程中的从数据库查出的列名定义成与实体类中的元素名称相对应-- >
<return class="com.smart.entity.resource.QuestionSearch">
<return-property name="questionNo" column="question_no" />
......
</return>
{ call SP_SearchQuestionBySource(?,?,?,?,?) }//调用存储过程
</sql-query>
</hibernate-mapping>
4.2.2 试卷管理模块实现
用户进入试卷管理模块的界面,在页面就提供添加,删除,修改的相应功能。所以用户就可以选择相应的操作进行试卷的管理。界面如下:
图8试卷列表页面
试卷基础信息设置页面的主要功能就先设置试卷的整体信息,设置完毕后进入下一添加页面,并把相应的信息传到下一页面,采用javascript传参。避免从后台操作增加系统的负担。
图9试卷基础信息设置页面
试卷添加页面接收到信息设置页面传的参数后就显示相应的信息,如图9中设置了单选、多选、判断等相应的题型,图10的试题类型框相应显示了单选题、多选题、判断题。效果图如下图:
图10 具体试题内容添加页面
功能实现:采用AJAX 技术避免页面刷新,从数据库查出相应的试题,在后台用xml封装,在页面处解析xml节点。相应的数据显示在页面上。
具体代码实现:
public ActionForward search(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
response.setContentType("text/xml;charset=GBK");//为xml格式封装传到页面
/*****以下代码是接收页面传到后台的相应参数**********************/
String dati = toChi(request.getParameter("dati"));
String bookNo = request.getParameter("bookNo");
String sectionNo = request.getParameter("sectionNo");
String knowledgeNo = request.getParameter("knowledgeNo");
/********以下代码是把接收到的相应参数放进HashMap中存放*******/
String entityType = "";
String entityTypeNo = "";
if (dati.equals("单选")) {
entityType = "SmartSingleChoice";
}
Map map = new HashMap();
map.put("entityType", entityType);
map.put("bookNo", bookNo);
map.put("sectionNo", sectionNo);
map.put("knowledgeNo", knowledgeNo);
if (entityType.equals("SmartSingleChoice")) {
List result = null;
if (sectionNo.equals("--") && knowledgeNo.equals("--")) {
/**在存放好参数后,就调用事务逻辑层的business中的SearchQuestions 方法*****/
result = (List) this.call(new Carrier(map,
BusinessConstants.PAPER_MANAGE_BUSINESS,
"SearchQuestions"));
}
/**通过逻辑层的方法把从数据库查到的数据集以list的形式保存**/
Iterator it = result.iterator();//调用java的遍历方法
PrintWriter out = response.getWriter();//得到一个向jsp页面输出的对象
StringBuffer sb = new StringBuffer(//调用缓存,写一个xml文件头
"<?xml version=\"1.0\" encoding=\"GBK\"?><classList>");
while (it.hasNext()) {//采用遍历方法,得到list中的数据
SmartSingleChoice entity = (SmartSingleChoice) it.next();
sb.append("<questionsList");//定义一个xml节点开头
sb.append(" value=\"");
sb.append(entity.getChoiceNo() + "/"
+ entity.getSmartKnowledgePoint().getKnowledgeNo());
sb.append("\">");//封装节点相应的数据
sb.append("</questionsList>");//定义一个xml节点结束
.......
}
sb.append("</classList>");
out.write(sb.toString());//向页面输出对象。
}
return null;
}//完成后台封装xml整个过程。
标签:java,试题,试卷,模块,题库,出卷,Smart,页面 From: https://blog.csdn.net/shmp54xmu/article/details/139248938