Ajax异步刷新技术

应用场景

有的时候,我们需要让本次的响应内容和下一次响应的内容,同时展示给客户端。使用Ajax就可以在当前的网页显示响应post请求内容。

简单实例

假如有这样的页面:

<input type="button" onclick="getData()" value="测试Ajax请求"/>
<div id="showDiv">
</div>

那么我的js是直接写死的修改div中的数据:

var getData = function(){
    var sd = document.getElementById("showDiv");
    sd.innerHTML="嘿嘿";
}

假如这个嘿嘿的字段是从后台动态获取的,那么如何实现呢?

var getData = function(){
    //创建Ajax引擎对象
    var ajax;
    if(window.XMLHttpRequest){
        //FireFox(火狐浏览器)
        ajax = new XMLHttpRequest();
    }else if(window.ActiveXObject){
        //IE(IE浏览器)
        ajax = new ActiveXObject("Msxml2.XMLHTTP");
    }
    //复写onReadyStatement()
    ajax.onreadystatechange = function(){
        //状态函数会被触发4次,所以需要判断状态码
        if(ajax.readyState==4){
            //处理响应内容
            var result = ajax.responseText;
            var sd = document.getElementById("showDiv");
            sd.innerHTML=result;
        }
    }
    //打开链接
    ajax.open("get","ajax");
    //发送请求
    ajax.send(null);
}

然后配置ajax的Servlet:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ajax")
public class A extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        //设置请求响应编码的格式
        res.setCharacterEncoding("utf-8");
        res.setContentType("text/html;charset=utf-8");
        //处理请求信息
        res.getWriter().write("我是处理Ajax请求的数据");
    }
}

注意:这么写其实还不够完善,因为,当我们的响应是错误的,例如404的时候,那么页面必然显示404啊,这样的用户体验极差,所以我门还需要判断相应的状态码。

//复写onReadyStatement()
ajax.onreadystatechange = function(){
    //状态函数会被触发4次,所以需要判断状态码
    if(ajax.readyState==4){
        //判断响应的状态码
        if(ajax.status==200){
            //处理响应内容
            var result = ajax.responseText;
            var sd = document.getElementById("showDiv");
            sd.innerHTML=result;
        }
    }
}

这样就可以了,除此之外,还可以加一些其他的处理方式。

异步和同步

首先假设我们的代码是这个样子的:

var getData = function(){
//创建Ajax引擎对象
var ajax;
if(window.XMLHttpRequest){
    //FireFox(火狐浏览器)
    ajax = new XMLHttpRequest();
}else if(window.ActiveXObject){
    //IE(IE浏览器)
    ajax = new ActiveXObject("Msxml2.XMLHTTP");
}
//复写onReadyStatement()
ajax.onreadystatechange = function(){
    //状态函数会被触发4次,所以需要判断状态码
    if(ajax.readyState==4){
        //判断响应的状态码
        if(ajax.status==200){
            //处理响应内容
            var result = ajax.responseText;
            var sd = document.getElementById("showDiv");
            sd.innerHTML=result;
 //注意这里的Alert
            alert(result);
        }
    }
}
//打开链接
ajax.open("get","ajax");
//发送请求
ajax.send(null);
//先编写一个Alert
alert("我是一个Alert");

这里我写了两个Alert打印相关信息,由于ajax默认是异步的,那么我们打开浏览器访问的时候,必然是先弹出result的内容,然后才是最下面的我是一个Alert的对话框。

梳理一下:

  1. ajax.open("get","ajax",true);:true表示异步,先弹出对话框我是一个Alert
  2. ajax.open("get","ajax",false);:false表示同步,后弹出对话框我是一个Alert

实现一个进度条

首先我们自己随便弄个图片:


然后修改一下我们的ajax请求:

var getData = function(){
    //创建Ajax引擎对象
    var ajax;
    if(window.XMLHttpRequest){
        //FireFox(火狐浏览器)
        ajax = new XMLHttpRequest();
    }else if(window.ActiveXObject){
        //IE(IE浏览器)
        ajax = new ActiveXObject("Msxml2.XMLHTTP");
    }
    //复写onReadyStatement()
    ajax.onreadystatechange = function(){
        //状态函数会被触发4次,所以需要判断状态码
        if(ajax.readyState==4){
            //判断响应的状态码
            if(ajax.status==200){
                //处理响应内容
                var result = ajax.responseText;
                var sd = document.getElementById("showDiv");
                sd.innerHTML=result;
            }
        }else{
            var sd = document.getElementById("showDiv");
            //插入进度条图片
            sd.innerHTML="<img src='img/2.png' width='100px' height='100px'/>";
        }
    }
    //打开链接
    ajax.open("get","ajax");
    //发送请求
    ajax.send(null);
}

为了让这个效果比较明显,我们还需要在Servlet当中沉睡3秒。

那么我们运行起来的效果:


然后过一段时间就能打印信息啦。

请求方式

  • get请求:请求实体放在URL后面
  • post请求:有单独的请求实体

首先编写一下处理get请求的代码:

package jxb.ajax;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ajax")
public class A extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        System.out.println("处理啦请求编码");
        req.setCharacterEncoding("utf-8");
        //设置请求响应编码的格式
        res.setCharacterEncoding("utf-8");
        res.setContentType("text/html;charset=utf-8");
        //处理请求信息
        res.getWriter().write(req.getParameter("name")+":"+req.getParameter("pass"));
    }
}

然后是ajax的代码:

var getData = function(){
    //创建Ajax引擎对象
    var ajax;
    if(window.XMLHttpRequest){
        //FireFox(火狐浏览器)
        ajax = new XMLHttpRequest();
    }else if(window.ActiveXObject){
        //IE(IE浏览器)
        ajax = new ActiveXObject("Msxml2.XMLHTTP");
    }
    //复写onReadyStatement()
    ajax.onreadystatechange = function(){
        //状态函数会被触发4次,所以需要判断状态码
        if(ajax.readyState==4){
            //判断响应的状态码
            if(ajax.status==200){
                //处理响应内容
                var result = ajax.responseText;
                var sd = document.getElementById("showDiv");
                sd.innerHTML=result;
                alert(result);
            }
        }
    }
    //GET方式请求:
    ajax.open("get","ajax?name=张三&pass=123");
    //发送请求
    ajax.send(null);
}

我们仔细看一下get请求:

//GET方式请求:
ajax.open("get","ajax?name=张三&pass=123");
//发送请求
ajax.send(null);

因为get请求的参数是拼接在url后面的,所以send(null)即可,但是post请求的实体必须要单独send:

//Post方式:
ajax.open("post","ajax");
//设置请求实体的格式为键值对
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//Post请求实体需要单独发送:
ajax.send("name=张三&pass=123");

这就是唯一的一点差别。

Json格式的数据响应

当我们需要从后台获取对象的时候,可以使用json的格式把对象存成一个字符串,这里需要用到一个叫做gson.jar的工具包,然后在前端js收到这个字符串后使用eval(string)转成对象,然后使用dom元素操作,把对象中的数据插入到界面元素中。
如下是核心部分源码:


前端js代码:

XML格式的数据

做XML格式数据处理的时候,需要先把响应的格式修改为setContentType("text/xml;charset=utf-8")


然后需要在前端js中的响应改写为ajax.responseXMLxml响应:

function getXML() {
    //创建ajax引擎对象
    var ajax;
    if (window.XMLHttpRequest) {//火狐
        ajax = new XMLHttpRequest();
    } else if (window.ActiveXObject) {//ie
        ajax = new ActiveXObject("Msxml2.XMLHTTP");
    }
    //复写onreadystatechange
    ajax.onreadystatechange = function() {
        //判断Ajax状态吗
        if (ajax.readyState == 4) {
            //判断响应状态吗
            if (ajax.status == 200) {
                //获取响应内容
                var doc = ajax.responseXML;
                //处理响应内容
                //获取元素对象
                alert(doc.getElementsByTagName("name")[0].innerHTML);
            }
        }
    }
    //发送请求
    ajax.open("get", "xml.jsp", true);
    ajax.send(null);
}

ajax.responseXML返回的是一个document对象,然后我们可以直接使用getElementsByTagName()获取元素的数组。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • HTML相关 1、XHTML和HTML有什么区别 HTML是一种基本的WEB网页实际语言,XHTML是一种基于XM...
    杀破狼real阅读 351评论 0 2
  • 全局刷新和局部刷新 B/S结构项目中,浏览器(Browse)负责把用户的请求和参数通过网络发送给服务器(Serve...
    苦难_69e0阅读 299评论 0 2
  • 1.javascript的typeof返回哪些数据类型 object number function boolea...
    洛珎阅读 247评论 0 0
  • 这个笔记主要是针对于我看了JS权威编程指南后偶有感悟写的由于我昨天已经看了五十页,现在就从中间开始写吧现在是JS的...
    你的操作666阅读 356评论 0 2
  • 题目&答案 介绍一下 JS 的基本数据类型。 Undefined、Null、Boolean、Number、Stri...
    August007_0751阅读 1,513评论 0 0