欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于Ajax技术实现考试倒计时并自动提交试卷

程序员文章站 2023-02-21 21:03:09
1.概述 在开发网络考试系统时,考试计时并自动提交试卷是必不可少的功能。由于在答卷过程中,试卷不能刷新,所以需要使用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技术实现考试倒计时并自动提交试卷 的相关知识,希望对大家有所帮助