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()">
时间: 2024-10-12 17:47:30

Ajax技术--考试计时并自动提交试卷的相关文章

bootstrapValidator的自动提交方式,用于ajax验证是需要点击两次提交才能成功提交

1 $('#defaultForm').bootstrapValidator({ 2 message: 'This value is not valid', 3 feedbackIcons: { 4 valid: 'glyphicon glyphicon-ok', 5 invalid: 'glyphicon glyphicon-remove', 6 validating: 'glyphicon glyphicon-refresh' 7 }, 8 fields: { 9 acGroupName:

ajax技术实现登录判断用户名是否重复以及利用xml实现二级下拉框联动

今天学了ajax技术,特地在此写下来作为复习. 一.什么是ajax? 客户端(特指PC浏览器)与服务器,可以在[不必刷新整个浏览器]的情况下,与服务器进行异步通讯的技术  即,AJAX是一个[局部刷新]的[异步]通讯技术, 说白了就是局部刷新. 二.ajax的原理如下图 附上ajax与服务器之间的几种状态,但 4是所有浏览器都支持的的 三.ajax包含的技术如下图 四.ajax开发步骤 步一:创建ajax对象,例如:ajax = createAjax(); 步二:开启异步对象:例如:ajax.o

高校云平台——学生在线抽取试题及提交试卷

参加高校云平台项目有一段时间了,我主要负责学生端,我觉得学生端一大难点就在于抽取试题和提交试卷. 因为我们的试题都是动数据库都出来的,而每个试题下的选项是由单选框实现的,根据单选框的属性我们需要实现的是,单个试题下的四个单选框name必须相同,而试题与试题之间的单选框name必须不同,为的是实现每道题下都能且只能选择一个选项. 而我们为了实现起来方便并不是为每道试题下都通过代码添加四个选项,而是写好四个选项之后通过foreach遍历每一道试题,为每道试题添加选项.难就难在这里,如果通过遍历,每道

AJAX技术简介及入门实例

最近在学校参加暑期实习,参与的是一个社交网站项目,学长那边分配给的任务是前端开发,需要学习AJAX技术. 对于一个像我一样刚刚接触Web开发且无多少实际项目经验的新手而言,AJAX技术显得复杂而又深奥.经过两天的baidu.google,我对AJAX的基本原理有了一个大致的认识,在此总结一下. 1. 什么是AJAX? AJAX全称是异步的JavaScript和XML,是Asynchronous JavaScript and XML的缩写.AJAX技术用于创建交互式网页应用的网站开发,至于何为异步

Django---CSRF的装饰器,CSRF的流程,JSON数据格式,ajax技术(基于JQ实现)

Django---CSRF的装饰器,CSRF的流程,JSON数据格式,ajax技术(基于JQ实现) 一丶CSRF相关的装饰器 from django.utils.decorators import method_decorator # 给cbv加上装饰器 from django.views import View from django.views.decorators.csrf import csrf_exempt, csrf_protect ### 在FBV模式下 # csrf_exempt

ajax技术初识与应用

一.ajax技术初识 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.Ajax不是一种新的编程语言,而是使用现有标准的新方法.AJAX可以在不重新加载整个页面的情况下,与服务器交换数据.这种异步交互的方式,使用户单击后,不必刷新页面也能获取新数据.使用Ajax,用户可以创建接近本地桌面应用的直接.高可用.更丰富.更动态的Web用户界面. Ajax技术包括: XHTML和CSS 使用文档对象

Ajax 技术学习

一.Ajax 基础 1.1 什么是 Ajax? 1.2 在哪里我们会用到 ajax 1.3 ajax 的工作原理 1.4 XMLHttpRequest 对象 1.4.1 XMLHttpRequest 常用方法 1.4.2 XMLHttpRequest 常用属性 二.让我们来试一试吧 2.1 简单的使用 ajax ,验证用户名是否合法 2.1.1 前端 demo (index.jsp) 2.1.2 JavaScript demo 2.1.3 2.1.4 后端 servlet 代码 2.2 运行截图

jQuery学习笔记10:Ajax技术

jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. jQuery 采用了三层封装:最底层的封装方法为:$.ajax(),而通过这层封装了第二层有三种方法:.load().$.get()和$.post(),最高层是$.getScript()和$.getJSON()方法. 函数 描述 jQuery.ajax() 执行异步 HTTP (Ajax) 请求. .ajaxComplete() 当 Ajax 请求完成时注册要调用的处理程序.这是一个

在 PHP 中结合 Ajax 技术进行图片上传

前面几则日志中讲述了在 PHP 中上传文件,相信大家对 PHP 中如何进行文件上传已经初步掌握.本文来继续探讨在 PHP 中上传文件的技术,不同的是,本次上传将仅限于图片文件的上传,并且将采用 Ajax 技术. 本例将要实现这样的效果:当用户选择图片,开始上传后,后台上传完成时,随即会显示到当前页面.由于,从开始上传到上传完成,再到图片显示均在一个页面上 完成(从表面上看).所以使用 Ajax 技术是必须的.但如何使用这些操作在一个页面上来完成呢?考虑到这样的情况,当文件开始上传后,便开始打开