基于Ajax技术实现考试倒计时并自动提交试卷
1.概述
在开发网络考试系统时,考试计时并自动提交试卷是必不可少的功能。由于在答卷过程中,试卷不能刷新,所以需要使用ajax实现无刷新操作。运行本实例,访问准备考试页面index.jsp,在该页面中,单击“开始考试”按钮,将打开新窗口显示开始考试的页面,如图10.1所示,页面会自动计时,当考试时间结束时,将自动提价试卷。
2.技术要点
主要是利用ajax异步提交技术和servlet技术实现的。显示在考试页面中的计时时间是在servlet中设置的,需要通过ajax的异步提交不断的请求servlet,从而获得服务器返回的最新的计时时间的数据。为了便于维护和代码的重用,可以将ajax的请求方法封装到一个js文件中,该方法可以作为一个公共方法,在程序中使用时可以直接调用。
3.具体实现代码
在js文件中构建xmlhttprequest对象以及请求方法,如下代码所示:
/** * 构建xmlhttprequest对象并请求服务器 * @param reqtype:请求类型(get或post) * @param url:服务器地址 * @param async:是否异步请求 * @param resfun:响应的回调函数 * @param parameter :请求参数 * @return :xmlhttprequest对象 */ function httprequest(reqtype,url,async,resfun,parameter){ var request = null; if( window.xmlhttprequest ){ //非ie浏览器,创建xmlhttprequest对象 request = new xmlhttprequest(); }else if( window.activexobject ){ //ie浏览器,创建xmlhttprequest对象 var arrsignatures = ["msxml2.xmlhttp", "microsoft.xmlhttp", "microsoft.xmlhttp", "msxml2.xmlhttp.5.0", "msxml2.xmlhttp.4.0", "msxml2.xmlhttp.3.0", "msxml2.xmlhttp"]; for( var i = 0; i < arrsignatures.length; i++ ){ request = new activexobject( arrsignatures[i] ); if( request || typeof( request ) == "object" ) break; } } if( request || typeof( request ) == "object" ){ if(reqtype.tolowercase()=="post"){ //以post方式提交 request.open(reqtype, url, true); //打开服务器连接 //设置mime类型 request.setrequestheader("content-type", "application/x-www-form-urlencoded"); request.onreadystatechange = resfun; //设置处理响应的回调函数 parameter = encodeuri(parameter); //将参数字符串进行编码 request.send(parameter); //发送请求 } else{ //以get方式提交 url = url+"?"+parameter; request.open(reqtype, url, true); //打开服务器连接 request.onreadystatechange = resfun; //响应回调函数 request.send(null); //发送请求 } } else{ alert( "该浏览器不支持ajax!" ); } return request; }
(1)新建index.jsp页,该页面是用户访问的初始页。在页面中主要包含一个“开始考试”按钮,该按钮的onclick事件将调用打开考试窗口的javascript函数,关键代码如下:
function showwindow(){ window.open('startexam?action=startexam','','width=750,height=500,scrollbars=1'); }
(2)新建名为startexam的servlet实现类,该类用创建考试的开始时间和剩余时间。在该类中,创建一个全局变量examtime,用于记录考试时间,该变量的值是在web.xml中设置的,关键代码如下:
<servlet> <servlet-name>startexam</servlet-name> <servlet-class>com.lh.servlet.startexam</servlet-class> <init-param> <param-name>examtime</param-name> <param-value>20</param-value> </init-param> </servlet>
(3)在startexam类中,编写用于将页面转发到开始考试页面的方法startexam()。关键代码如下:
public void startexam(httpservletrequest request,httpservletresponse response) throws servletexception,ioexception{ httpsession session = request.getsession(); request.setattribute("time", examtime); //保存考试时间 session.setattribute("starttime1",new date().gettime()); //保存当前时间的毫秒数 request.getrequestdispatcher("startexam.jsp").forward(request, response); }
(4)新建showstarttime.jsp页,用于输出计时开始时间。关键代码如下:
<%@page contenttype="text/html" pageencoding="gbk"%> ${showstarttime}
(5)新建showremaintime.jsp页,用于输出计时剩余时间。关键代码如下:
<%@page contenttype="text/html" pageencoding="gbk"%> ${showremaintime}
(6)新建开始考试页面startexam.jsp页,在该页中通过调用ajax请求方法请求startexam类,获得考试的开始时间和剩余时间。关键代码如下:
var request1= false; var request2 = false; //请求servlet获得开始时间 function showstarttime(){ var url = "startexam"; //此处需要加&nocache="+new date().gettime(),否则将出现时间不自动走动的情况 var parameter="action=showstarttime&nocache="+new date().gettime(); request1 = httprequest("post",url,true,callbackfunc,parameter); } //回调函数 function callbackfunc(){ if( request1.readystate==4 ){ if( request1.status == 200 ){ showstarttimediv.innerhtml=request1.responsetext; } } } //请求servlet获得剩余时间 function showremaintime(){ var url = "startexam"; var parameter="action=showremaintime&nocache="+new date().gettime(); request2 = httprequest("post",url,true,callbackfunc_r,parameter); } //回调函数 function callbackfunc_r(){ if( request2.readystate==4 ){ if( request2.status == 200 ){ h=request2.responsetext; showremaintimediv.innerhtml=h; h=h.replace(/\s/g,""); //去除字符串中的unicode空白符 showremaintimediv.innerhtml=h; if(h=="00:00:00"){ form1.submit(); } } } }
(7)为了实现页面加载后自动计时,需要在开始考试页面的 <body>标签中通过onload事件应用window.setinterval()方法调用showstarttime()函数和showremailtime()函数,关键代码如下:
<body onload="showstarttime();showremaintime();" onkeydown="keydown()">
以上所述是小编给大家介绍的基于ajax技术实现考试倒计时并自动提交试卷 的相关知识,希望对大家有所帮助
上一篇: mac下给python3安装requests库和scrapy库的实例
下一篇: Vue响应式原理详解