在线考试系统--实现论文.doc_第1页
在线考试系统--实现论文.doc_第2页
在线考试系统--实现论文.doc_第3页
在线考试系统--实现论文.doc_第4页
在线考试系统--实现论文.doc_第5页
免费预览已结束,剩余24页可下载查看

下载本文档

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

文档简介

远东在线考试系统简述1. 功能概述2. 需求分析3. 数据库设计4. 考试系统预览5. 项目难点分析与解决方案6. 项目优势与特色一功能概述本考试系统是真正的零安装、; 全b/s架构的在线考试系统、网上自测和模拟考试平台,易学易用; 采用最新web2.0技术和ajax技术,强调与用户的交互,更加人性化; 提供了市面上考试系统里最全面的试卷支持:采用独创与全面革新性的“所见即所得”的在线试卷录入技术, 支持单选题、判断题、填空题、图片题; 支持录入各种文字、图片和表格内容,就跟在word里编辑一样的; 支持系统自评分 可以匿名练习,练习结束自动评分,练习期间也可以查看正确答案,自动判错,查看答题情况。 可以注册登录后考试,自动保存答卷和成绩供随时查阅;可以进行统一地考试、阅卷和成绩管理等; 自动临时保存机制可以有效防止意外断电、死机造成的考试中断; 以树形结构来管理所有科目,以科目为单位来管理试卷和考试,极大的方便用户使用。 。 支持在电脑教室、培训室、企事业单位内部网络上实现真正的统一考试模式; 可以完成分发试卷、集中监考、学生交卷或强制收卷、防舞弊等一系列的考试流程;老师也可以集中阅卷、查看所有学生的答卷和成绩; 支持禁止窗口切换、试题选项随机顺序等防舞弊机制。功能概述 全功能的在线考试系统本在线考试系统是针对各类学校设计的新一代纯b/s架构的在线考试系统,它支持帐户管理、班级管理、科目管理、试卷录入管理,支持网上自测和模拟考试/作业练习/考核测评/班级统一考试等不同的考试需求,支持系统自评分,成绩查阅、成绩管理等、防舞弊等一系列的考试流程。 系统架构 新一代纯b/s架构的在线考试系统本系统属于纯b/s架构,无需安装任何客户端,学生用户通过浏览器登录系统,参加考试、完成作业或练习、查看考试成绩等;教师用户通过浏览器登录系统,进行学生管理、班级管理、完成试卷录入、组织班级统一考试、集中处理阅卷和成绩管理等。二需求分析1 学生注册和登录(可以上传个人头像)2 学生在线练习3 学生在线考试(增加故障保护完全保障开始的正常进行)4 考试和练习在线判卷5 后台管理(对整个数据库信息的管理)6 学生管理7 试卷管理8 成绩管理9 管理员信息管理(增加了信息搜索功能和试卷自动生成功能)ems后台设计分析文挡采用了工厂设计模式:如图添加时序图:如图运用动态代理统一处理事务transaction如图:(1)学生在线考试流程(2)管理员管理流程三数据库设计adminstrator表设计:exampaper表设计:messageprotect表设计:score表设计:student表的设计:score视图的设计:四考试系统预览登录界面个人信息试卷选择页面练习页面吗考试页面注册页面管理员登录首页管理页面五项目难点分析与解决方案1. 登录实现的javabean代码package com.fe.ems.util;import java.sql.connection;import java.sql.preparedstatement;import java.sql.resultset;import java.sql.sqlexception;public class login string s_password;string id;string s_name;boolean examstates = true;/答题状态,为true时允许进入答题页面,否则不准进入。boolean b = true; /在updatephoto.jsp页面用来控制框架reload。为true时reload,为false时禁止reload。boolean success = false; /用户登陆状态变量boolean adminsuccess = false;/管理员登陆状态变量string backnews = ;/反馈用户登陆信息stringbuffer sb = new stringbuffer();/string adminbacknews = ;/反馈管理员登录信息public string handlestring(string s)trybyte bb = s.getbytes(gbk);s = new string(bb);catch(exception e)return s;此处省去了get()和set()方法。public void login(string sid,string spassword)/返回真登陆成功,返回假登陆失败/if(!success)if(true)if(true)connection conn = null;preparedstatement sql = null;resultset rs = null;try conn = db.getconnection();boolean boo = (sid = ? false:true) & (spassword = ? false:true);/ 判断密码是否为空string condition = select * from student where s_id=?;sql = conn.preparestatement(condition);if(boo)sql.setstring(1, sid);rs = sql.executequery();boolean m = false;rs.next();if(rs.getstring(s_password).equals(spassword)m = true;if(m = true)this.id = sid;this.s_password = spassword;s_name = rs.getstring(s_name);backnews = 登陆成功;success = true;elsebacknews = formatindex + 您输入的用户名不存在,或密码不匹配;success = false;elsebacknews = formatindex + 您输入的用户名或密码为空。;success = false; catch (sqlexception e) /system.out.println(e);success = false;backnews = formatindex + 您输入的用户名或密码错误!;catch(exception e)backnews = formatindex + 您输入的用户名或密码错误!;finally db.close(rs);db.close(sql);db.close(conn); 2. 登录成功后用javascript实现动态跳转代码function divmessagebox(title, msg, w, h) var showtime= 2000;var t = showtime/1000;var titleheight = 22px; / 提示窗口标题高度 var bordercolor = #278bbb; / 提示窗口的边框颜色 var titlecolor = #ffffff; / 提示窗口的标题颜色 var titlebgcolor = #4cd7f1; / 提示窗口的标题背景色var bgcolor = #0195c2; / 提示内容的背景色var iwidth = document.documentelement.clientwidth; var iheight = document.documentelement.clientheight; var bgobj = document.createelement(div); bgobj.style.csstext = position:absolute;left:0px;top:0px;width:+iwidth+px;height:+math.max(document.body.clientheight, iheight)+px;filter:alpha(opacity=30);opacity:0.3;background-color:#000000;z-index:101;document.body.appendchild(bgobj); http:var msgobj=document.createelement(div);msgobj.style.csstext = position:absolute;font:11px 宋体;top:+(iheight-h + 200)/2+px;left:+(iwidth-w+ 240) /2+px;width:+w+px;height:+h+px;text-align:center;border:1px solid +bordercolor+;background-color:+bgcolor+;padding:1px;line-height:22px;z-index:102;document.body.appendchild(msgobj);var table = document.createelement(table);msgobj.appendchild(table);table.style.csstext = margin:0px;border:0px;padding:0px;table.cellspacing = 0;var tr = table.insertrow(-1);var titlebar = tr.insertcell(-1);titlebar.style.csstext = width:100%;height:+titleheight+px;text-align:left;padding:3px;margin:0px;font:bold 13px 宋体;color:+titlecolor+;border:1px solid + bordercolor + ;cursor:move;background-color: + titlebgcolor;titlebar.style.paddingleft = 10px;titlebar.innerhtml = title;var movex = 200;var movey = 300;var movetop = 200;var moveleft = 300;var moveable = false;var docmousemoveevent = document.onmousemove;var docmouseupevent = document.onmouseup;titlebar.onmousedown = function() var evt = getevent(); moveable = true; movex = evt.clientx; movey = evt.clienty; movetop = parseint(msgobj.style.top); moveleft = parseint(msgobj.style.left); document.onmousemove = function() if (moveable) var evt = getevent(); var x = moveleft + evt.clientx - movex; var y = movetop + evt.clienty - movey; if ( x 0 &( x + w 0 & (y + h iheight) ) msgobj.style.left = x + px; msgobj.style.top = y + px; ; document.onmouseup = function () if (moveable) document.onmousemove = docmousemoveevent; document.onmouseup = docmouseupevent; moveable = false; movex = 0; movey = 0; movetop = 0; moveleft = 0; ;var closebtn = tr.insertcell(-1);closebtn.style.csstext = cursor:pointer; padding:2px;background-color: + titlebgcolor;closebtn.innerhtml = ;closebtn.onclick = divmessagesclose;var msgbox = table.insertrow(-1).insertcell(-1);msgbox.style.csstext = font:12pt 宋体;height:50px;msgbox.colspan = 3;msgbox.innerhtml = msg;/显示剩余的时间数var time = table.insertrow(-1).insertcell(-1);time.style.csstext = font:9pt 宋体;time.innerhtml = t+ 秒后自动跳转!;/ 获得事件event对象,用于兼容ie和firefox function getevent() return window.event | arguments.callee.caller.arguments0; /处理自动关闭事件function autoclose() -t;if(t0) time.innerhtml = t+ 秒后自动跳转!; settimeout(autoclose,1000);else settimeout(divmessagesclose,1000); /跳转的页面! location = student/index.jsp; /关闭function divmessagesclose() document.body.removechild(bgobj); document.body.removechild(msgobj); /处理入口settimeout(autoclose,1000); 3图片上传到服务器package com.fe.ems.util;import java.io.ioexception;import java.io.printwriter;import javax.servlet.servletexception;import javax.servlet.http.httpservlet;import javax.servlet.http.httpservletrequest;import javax.servlet.http.httpservletresponse;import mons.fileupload.*;import java.util.*;import java.util.regex.*;import java.io.*;import mons.fileupload.servlet.*;import mons.fileupload.disk.diskfileitemfactory;/* * 创建日期 2005-4-10 * * todo 要更改此生成的文件的模板,请转至 * 窗口 首选项 java 代码样式 代码模板 */* * author gaolong1 * * todo 要更改此生成的类型注释的模板,请转至 窗口 首选项 java 代码样式 代码模板 */public class fileupload extends httpservlet /* * destruction of the servlet. */private string uploadpath = ; / 用于存放上传文件的目录private file temppath = new file(d:addnetfiletmp); / 用于存放临时文件的目录public void destroy() super.destroy(); / just puts destroy string in log/ put your code here/* * the dopost method of the servlet. * * this method is called when a form has its tag value method equals to * post. * * param request * the request send by the client to the server * param response * the response send by the server to the client * throws servletexception * if an error occurred * throws ioexception * if an error occurred */public void dopost(httpservletrequest req, httpservletresponse res)throws servletexception, ioexception res.setcontenttype(text/html; charset=gb2312);printwriter out = res.getwriter();system.out.println(req.getcontentlength();system.out.println(req.getcontenttype();diskfileitemfactory factory = new diskfileitemfactory();/ maximum size that will be stored in memoryfactory.setsizethreshold(4096);/ the location for saving data that is larger than getsizethreshold()factory.setrepository(new file(d:fileaddnetfiletemp);servletfileupload upload = new servletfileupload(factory);/ maximum size before a fileuploadexception will be thrownupload.setsizemax(1000000);string sid = ;try list fileitems = upload.parserequest(req);/ assume we know there are two files. the first file is a small/ text file, the second is unknown and is written to a file on/ the serveriterator iter = fileitems.iterator();/ 正则匹配,过滤路径取文件名string regexp = (.+)$;/ 过滤掉的文件类型string errortype = .exe, .com, .cgi, .asp ;pattern p = ppile(regexp);while (iter.hasnext() fileitem item = (fileitem) iter.next();if (item.isformfield() if (sid.equals(item.getfieldname() sid = item.getstring();/ 忽略其他不是文件域的所有表单信息if (!item.isformfield() string name = item.getname();name = name.substring(name.lastindexof()+1);long size = item.getsize();if (name = null | name.equals() & size = 0)continue;matcher m = p.matcher(name);boolean result = m.find();if (result) for (int temp = 0; temp errortype.length; temp+) if (m.group(1).endswith(errortypetemp) throw new ioexception(name + : wrong type);try string temp = req.getsession().getservletcontext().getrealpath(images/item);system.out.println(temp= + temp);/ 保存上传的文件到指定的目录/ 在下文中上传文件至数据库时,将对这里改写item.write(new file(uploadpath + sid + .jpg);out.print(name +    + size + );res.sendredirect(req.getcontextpath() + /student/iframe_update.jsp); catch (exception e) out.println(e); else throw new ioexception(fail to upload); catch (ioexception e) out.println(e); catch (fileuploadexception e) out.println(e);/ 保存上传的文件到指定的目录/ 在下文中上传文件至数据库时,将对这里改写/* * initialization of the servlet. * * throws servletexception * if an error occure */public void init() throws servletexception this.uploadpath = this.getservletconfig().getinitparameter(upload_path);/public void init(servletconfig config) throws servletexception /super.init(config);/this.uploadpath = config.getinitparameter(upload-path);/4考试页面随机出题实现代码将数据库中的试题题号存放在一个数组里,然后将数组里的值随机交换。 for ( var i= ; i = 0 ; i- ) /alert(i); var v = parseint(math.random()*(i+1); var tmp = timuidv; timuidv = timuidi; timuidi = tmp; 5 在线考试系统最大的难点就是考试期间的异常,如突然断电,电脑死机等等事件。对于考试的稳定性来说是非常致命的。解决对策用户每做三个题或是两个题就向protectmessage表中存一次数据,将用户的答案和剩余时间存到表中。当异常发生时,用户再次登录,将进行信息验证,把表中的剩余时间和答案反馈到用户考试界面。确保了考试的正常进行。int questioncount = 0; /用来控制保存答案的频率/每答完3个题保存一次if(questioncount = 2)examtime.settimeleft(seconds,login.getid(),examtime.getp_id();examtime.setanswer(str,login.getid(),examtime.getp_id();questioncount = 0;elsequestioncount +;用到javabean中的方法public string gettimeleft(string id,string p_id)string time = ;string sql = select timeout from messageprotect where s_id=? and p_id=?;connection conn = null;preparedstatement pstmt = null;resultset rs = null;papermodel paper = null;try conn = db.getconnection();pstmt = conn.preparestatement(sql);pstmt.setstring(1, id);pstmt.setstring(2, p_id);rs = pstmt.executequery();if (rs.next() time = rs.getstring(1);elsecatch(sqlexception e) e.printstacktrace();finally db.close(rs);db.close(pstmt);db.close(conn); return time;/* * 设置用户答题剩余时间 * param timeout * param id */public void settimeleft(int timeout,string id,string p_id)connection conn = null;preparedstatement pstmt = null;try conn = db.getconnection();string condition = update messageprotect set timeout=? where s_id=? and p_id=?;pstmt = conn.preparestatement(condition);pstmt.setint(1, timeout);pstmt.setstring(2, id);pstmt.setstring(3, p_id);pstmt.executeupdate(); catch (sqlexception e) e.printstacktrace();finally db.close(pstmt);db.close(conn);/* * 获取用户答案。 * param id * return */public string getanswer(string id,string p_id)string time = ;string sql = select answer from messageprotect where s_id=? and p_id=?;connection conn = null;preparedstatement pstmt = null;resultset rs = null;papermodel paper = null;try conn = db.getconnection();pstmt = conn.preparestatement(sql);pstmt.setstring(1, id);pstmt.setstring(2, p_id);rs = pstmt.executequery();if (rs.next() time = rs.getstring(1);elsecatch(sqlexception e) e.printstacktrace();finally db.close(rs);db.close(pstmt);db.close(conn); return time;/* * 设置用户答案。 * param answer用户答案 * param id用户学号* param p_id试卷id */public void setanswer(string answer,string id,string p_id)stringbuffer answerbuffer = new stringbuffer();for(int i=0; ianswer.length; i+)if(answeri != null)answerbuffer.append(answeri);string answers = answerbuffer.tostring();/system.out.println(提交到数据库中的答案为: + answers);connection conn = null;preparedstatement pstmt = null;try conn = db.getconnection();string condition = update messageprotect set answer=? where s_id=? and p_id=?;pstmt = conn.preparestatement(condition);pstmt.setstring(1, answers);pstmt.setstring(2, id);pstmt.setstring(3, p_id);pstmt.executeupdate(); catch (sqlexception e) e.printstacktrace();finally db.close(pstmt);db.close(conn);6考试页面防止刷新和用户由于错误操作关闭浏览器提示用javascript实现代码如下: /解决返回和刷新问题!function before() if(tijiao = false) event.returnvalue = 您还没有提交试卷,离开页面会退出考试成绩无效,您是否继续?; function unload()/关闭网页再重新打开登录界面 if(tijiao = false)var n = window.event.screenx - window.screenleft; var b = n document.documentelement.scrollwidth-20; if(b & window.event.clienty 0 | window.event.altkey) /关闭 else /刷新 document.getelementbyid(iie) function brs()/插入object if(tijiao = false) /document.body.innerhtml += /; window.attachevent(onbeforeunload,before); window.attachevent(onload,brs); window.attachevent(onunload,unload); var tal = document.getelementbyid(ta); var newtr; var newtd; for(var i=0;i 5;i+) newtr = tal.insertrow(-1);/添加行 for(var j=0;j20;j+) newtd = newtr.insertcell(-1);/添加列 newtd.innerhtml = i*20 + j + 1;/设置内容 newtd.id = td+(i*20 + j + 1);/设置id newtd.onclick =function()jiazaitimu(this.innerhtml);/添加事件 7. 图片在上传成功的时候,用户个人信息头像没有刷新。 设置一个boolean变量,当值为true时页面reload一次,否则正常执行。 window.parent.location.reload();/alert(头像重新加载啦!);8. 日志记录的实现:使用spr

温馨提示

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

评论

0/150

提交评论