Ajax编程详解

本文深入探讨了Ajax异步请求的原理与应用,包括传统请求与异步请求的区别,Ajax核心对象XMLHttpRequest的使用,以及GET和POST请求的实现。同时,文章详细介绍了JSON数据交换机制,展示了如何在前后端间传输JSON格式数据,并提供了JQuery对Ajax的封装示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.传统请求和异步请求

传统请求:基于超级链接、地址栏、form表单、location.href 发起的请求全部是传统请求。

特点:请求之后,刷新整张页面。

缺点:由于刷新了整张页面,用户操作被中断,造成大量网络流量的浪费。

异步请求:基于ajax发起的请求都是异步请求。

特点:多个请求并行发生,请求之间互不影响,请求之后页面不动,刷新页面的局部

2.什么是Ajax

Ajax即 Asynchronous Javascript And XML(异步JavaScript和XML)。他不是一种新的编程语言,而是一种通过异步实现网页的局部刷新技术。

3.Ajax的核心对象

XML HttpRequest对象是一个javascript对象,存在着浏览器差异,简称xhr对象

1) IE(内核)  new ActiveXObject("Microsoft.XMLHTTP")

2) Webkit(内核) new XMLHttpRequest()

4.Ajax的编程思路

1.创建xhr对象

var xhr;
if(window.XMLHttpRequest){
    //true  Webkit内核
    xhr = new XMLHttpRequest();
}else{
    //false  IE内核
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
}

2.发送请求并传递参数

xhr.open("GET|POST","url?参数"); 
xhr.send(null);

3.处理响应并渲染页面

xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){
    console.log(xhr.resonseText);
    }
}

5.发送GET方式请求

        //1. 创建xhr对象
        var xhr ;
        if(window.XMLHttpRequest){
            xhr = new XMLHttpRequest();
        }else{
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        //2.发送请求,并传递参数
        xhr.open("GET", "/ajax_day2/test?name=zhangsan");
        xhr.send();
        //3.处理响应
        xhr.onreadystatechange = function(){
            if(xhr.readyState==4 && xhr.status==200){
                console.log(xhr.responseText);
            }
        }

6.发送POST方式请求

        //1. 创建xhr对象
        var xhr;
        if (window.XMLHttpRequest) {
            xhr = new XMLHttpRequest();
        } else {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        //2.发送请求,并传递参数
        xhr.open("POST", "/ajax_day2/test");
        xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
        xhr.send("name=zhangsan");
        //3.处理响应
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && xhr.status == 200) {
                console.log(xhr.reponseText);
            }
        }

7.Ajax的数据交换机制

JSON (JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式。

1.如果服务端响应的不再是字符串而是对象或者是集合类型时,无法直接将对象响应给客户端。

     如:User   List<User>   Map<String,User> 此时需要将对象转为json格式字符串响应给ajax。

2.如何将对象转为json格式的字符串

User user = new User("21","chenyn",23,123.0);
String userJson = JSONObject.toJSONString(user); // 需要导入阿里的fastjson依赖 json
response.setContentType("application/json;charset=UTf-8");
PrintWriter writer = response.getWriter();
writer.out(userJson);

3.前端的ajax函数中应该如何处理json格式的字符串

xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && xhr.status == 200) {
        var json = xhr.responseText;// json
        var userObj = eval("(" + xhr.responseText + ")"); //转为js对象" 
        console.log(userObj.id);//
        console.log(userObj.name);
    }
}

4.处理json字符串中的日期格式问题

var userJson = JSONObject.toJsonStringWithDateFormat(user,"yyyy-MM-dd");

8.JQuery对Ajax的封装

前提是先引入对应JQuery的核心JS文件

1.JQuery提供了一个全局函数

$.ajax({
    type: "POST|GET",
    url: "",
    data: "name=张三|{key:value}",
    dataType: "JSON",
    success: function (result) {
        console.log(result);
    }
});

2.发送GET方式的异步请求

$.get(url,data,function(result){},"JSON"); 发送请求、传递参数、处理响应并指定相应的数据类型 
$.get(url);  发送get方式请求、不传递参数、不处理响应
$.get(url,data);  发送get方式请求、传递参数、不处理响应
$.get(url,function (result) {});  发送get方式请求、不传递参数、处理响应
或者:$.getJSON(url,function(result){ });

3.发送POST方式的异步请求

$.post(url,data,function(result){},"JSON");
其他的与GET方式类似

9. 案例

        $(function () {

            $("#loginButtonId").click(function () {

                var username = $("#form-username").val();
                var password = $("#form-password").val();
                var code = $("#form-code").val();

                $.ajax({

                    type: "post",
                    //dataType: "json",
                    data: {username:username,password:password,code:code},
                    url: "${pageContext.request.contextPath}/admin/login",
                    success:function (data) {
                        if('登录成功'  == data){
                            window.location.href = "${pageContext.request.contextPath}/index.jsp"
                        }else{
                            //empty是将标签内的值清除,标签还在,remove标签就不在了
                            $("#msgDiv").empty();
                            $("#msgDiv").append(data);
                        }
                    },
                    error:function () {
                        alert("出错了");
                    }
                });

            });

        });

注意:

1.当后台响应json格式数据时如果指定了响应类型为application/json时,jquery封装的ajax会自动转为js对象|数组。

2.如果在前台发送ajax请求时明确指定dataType属性为JSON时,即使后台不设置响应类型结果也会自动转为js对象|数组。

3.推荐前台设置响应类型,服务器端同样设置响应类型,结果一定为js对象|数组。

4.如果发送的请求没有响应结果void,或者响应结果不是JSON类型数据,是String或者其他类型数据,则前台一定不要指定 dateType为JSON,否则会报错,会进入error function()中,不会进入success function()中。

5.ajax可以发送同步请求:同步请求发送之后,在请求响应完毕之前浏览器处于锁定状态。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值