Ajax 简明教程

Ajax

用来实现异步

所谓异步,我们举个例子,我在这边看电视,手上也在写作业,等作业写完了,电视节目也播完了。我写作业的过程,并没有打扰我去看电视,这就是异步的过程

Ajax 使用例

js:

function  test() {
        //发送异步请求
       //1.创建XMLHttpRequest对象
      var xmlhttp;
      if(window.XMLHttpRequest){
        //非IE
        xmlhttp=new XMLHttpRequest();
      }else if(window.ActiveXObject) {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
       //2.打开链接
      var uname= document.getElementById("uname").value;
      //xmlhttp.open("get","/testuname?username="+uname,true);
       xmlhttp.open("post","/testuname",true);
       //3.指定回调函数
      xmlhttp.onreadystatechange=function(){
        //3.1 判断状态   4  表示成功(200)
        if(xmlhttp.readyState==4){
          //3.2 接收返回的数据
          var responseText = xmlhttp.responseText;
          document.getElementById("rs").innerText=responseText;
        }
      }
       //4.发送数据
       //xmlhttp.send();
       //post
       xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8");
       xmlhttp.send("username="+uname);
     }

html:

页面实现的效果,是当鼠标移出输入框后,向后端发送 ajax 请求,并返回是否符合要求

<body>
  <h1>index.jsp</h1>
  username:<input type="text" id="uname" onblur="test()"><span id="rs"></span>
</body>

传统过程和 Ajax方式的区别

传统:

image-20210515130156946

Ajax:

image-20210515130226560

其实,Ajax和多线程有点类似。如果一个用户的请求没有完成,他可以在出结果前,去执行其他的操作,因为结果是异步传输给用户的,用户在同时做其他事情,也就不会有使用的卡顿感

XMLHttpRequest对象常用属性和方法

XMLHttpRequest 是我们的常用对象,要对其进行了解

———— 属性————

1、onreadystatechange 属性

onreadystatechange 属性存有处理服务器响应的函数。 下面的代码定义一个空的函数,可同时对 onreadystatechange 属性进行设置:

我们一般在这个属性里,写回调函数

xmlHttp.onreadystatechange = function() { //我们需要在这写一些代码}

2、readyState 属性

readyState 属性存有服务器响应的状态信息。每当 readyState 改变时,onreadystatechange 函数就会 被执行。

readyState 属性可能的值:

image-20210515130924482

我们要向这个 onreadystatechange 函数添加一条 If 语句,来测试我们的响应是否已完成(意味着可获得 数据):

 xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4) {
		//从服务器的response获得数据 }
}

3、responseText 属性

可以通过 responseText 属性来取回由服务器返回的数据。
在我们的代码中,我们将把时间文本框的值设置为等于 responseText:

 xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4) {
        document.myForm.time.value = xmlHttp.responseText;
    }
}

4、其他属性

使用的不会很多

image-20210515131105840

———— 方法————

1、open() 方法

open() 有三个参数。第一个参数定义发送请求所使用的方法,第二个参数规定服务器端脚本的URL,第 三个参数规定应当对请求进行异步地处理。

 xmlHttp.open("GET","test.php",true);

2、send() 方法

xmlHttp.send(null);

3、其他方法

image-20210515131407811

JQuery操作Ajax

之前介绍的,都是传统方式操作Ajax

下面,我们介绍 JQuery 操作Ajax的方式

我们将我们之前,验证用户是否可用的代码,用新的方式重写

$.ajax({
  url:"/testuname",
  data:"username="+uname,
  type:"post",
  dataType:"text",
  success:function(rs){
    $("#rs").html(rs);
  }
});

当然,也要简略写法:

$.post(url,data,function(result) { 
   //省略将服务器返回的数据显示到⻚面的代码
});

Ajax 中使用 JSON

现在流行的数据传输方式,都是JSON了,听说,还有老人,在使用 xml 格式进行数据传输,太可怕了…

JSON 格式定义

 
var 变量名 = { 
  “key” : value ,   // number类型
  “key2” : “value” , 	// 字符串
  “key3” : [] , 	// 数组
  “key4” : {}, 	// 对象
  “key5” : [{},{}] 	// 对象数组
};

前端使用 JSON

使用:

前端获得 JSON格式的内容,直接使用就可以了

向后端传输:

let data = {
	"name" : "xxx",
	"age"  : 20
}
$.ajax({
    url: 'localhost:8080/api/xxxxx',
    dataType: 'json',
    type: 'post',
    data: JSON.stringify(data),
    contentType: 'application/json;charset=utf-8',
    success: function (resp) {
        console.log(resp);
    }
});

需要注意的两点:

  1. data参数需要使用JSON.stringify()方法序列化成JSON字符串
  2. contentType需要显示指定为’application/json;charset=utf-8’,这样浏览器才会把需要传输的data认为时JSON字符串传输,否则浏览器还是会将其作为Form Data传输,这样后端接收到的参数会出现反序列化错误。

后端使用 JSON

分成 JSON 的生成,和解析

这里,我们使用 FastJson

FastJson Maven:

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.75</version>
            </dependency>

具体的使用方式,可以看我之前写的 JSON 相关的博客

我们只要知道, Servlet 将JSON字符串传给前端的方式,是使用 HttpServletResponse.Writer.out就行了

image-20210515141320074

如果我们乐意,可以封装一个返回,然后返回一个通用返回值,里面包含:

**boolen success:**信息是否正确

**String message:**如果返回错误,所包含的错误信息

**T Content:**返回的信息(可以是任意类型)

然后,将这个通用返回值,转换为JSON格式,发送到后端

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FARO_Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值