Ajax异步刷新技术

作者: AIGame孑小白 | 来源:发表于2021-06-10 00:55 被阅读0次

应用场景

有的时候,我们需要让本次的响应内容和下一次响应的内容,同时展示给客户端。使用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()获取元素的数组。

相关文章

  • Ajax

    Ajax简介 通过AJAX (Asynchronous JAvaScript and XML) 实现异步刷新 用于...

  • Ajax异步刷新技术

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

  • 2018 10 21

    学习jQuery下的ajax方法获取异步刷新数据

  • jquery ajax

    Ajax(Asynchronous Javascript + XML)异步刷新起到了无可比拟的作用,以前写Ajax...

  • echarts的异步数据加载及更新

    echarts可以使用ajax实现异步刷新数据 //后台代码 前台代码

  • SpringMVC-Ajax

    ajax:异步刷新技术,可以在步刷新整个页面的前提下,刷新部分页面,节省资源 环境搭建:1、搭建好SpringMV...

  • AJAX

    通过AJAX(Asynchronous JavaScript And XML)实现异步刷新,与服务器交换数据并更新...

  • ajax的操作原理、以及请求到的数据转码和解码

    实际ajax是单线程操作的,只是因为有一个回调函数从新调取而实现的异步刷新技术 单线程:分有前驱和后驱。前驱没有前...

  • dajngo实现ajax异步刷新

    前言 实现前后端分离,异步刷新 1.应用文件中配置路由urls.py 2.配置views.py 3.配置html ...

  • 无标题文章

    ajax是异步javascript +xml的缩写,页面异步刷新。 json 是一种轻量级的数据交换格式,json...

网友评论

    本文标题:Ajax异步刷新技术

    本文链接:https://www.haomeiwen.com/subject/ldaeeltx.html