ajax与json

一、Ajax技术和原理

1.1、简介

AJAX=Asynchronous Javascript and Xml (异步的javascript和xml)
Ajax不是一种新的编程语言,而是一种使用现有标准的新方法。
Ajax与服务器交换数据并更新部分网页的艺术,在于不重新加载整个页面。

1.2、包含的技术

使用CSS和XHTML来显示
使用DOM模型来交互和动态显示
使用XMLHttpRequest来和服务器进行异步通信
使用javascript来绑定和调用

Ajax的核心是XMLHttpRequest对象
不同的浏览器创建XMLHttpRequest对象的方法是有差异的。
IE浏览器使用ActiveXObject,而其他浏览器使用XMLHttpRequest的内置对象。

1.3、Ajax的工作原理

Ajax的工作原理相当于在用户和服务器之间加了一个中间层(Ajax引擎),使用户操作和服务器响应异步化。并不是所有的用户请求都提交给服务器。像一些数据验证和处理都交给Ajax引擎自己来做,只有确定从服务器读取新数据时再有Ajax代为向服务器提交请求。

在这里插入图片描述
在这里插入图片描述

交互方式对比:
在这里插入图片描述
在这里插入图片描述

使用Ajax的优势:
1、减少了从服务器的下载量。
2、消除用户每次输入时的页面刷新。
在这里插入图片描述

1.4、XMLHttpRequest常用属性

1.4.1、onreadystatechange

存储服务器响应的函数。
xmlHttp.onreadystatechange=function(){
//处理代码逻辑
}

1.4.2、readyState

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

状态描述
0请求未初始化( 在调用open()之前 )
1请求已提出( 在调用send()之前 )
2请求已发送( 通常可以从响应得到内容头部 )
3请求处理中( 响应中通常有部分数据可用,但服务器还没有完成响应 )
4请求已完成(可以访问服务器响应并使用它)
xmlHttp.onreadystatechange=function(){
    if(xmlHttp.readyState==4){
        //获取服务器response内容
    }
}
1.4.3、responseText

取回又服务器返回的数据。

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

其他属性
在这里插入图片描述

1.5、XMLHttpRequest的常用方法

1.5.1、open()

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

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

send()方法将请求送往服务器。

xmlHttp.send(null);

其他方法
在这里插入图片描述

二、Ajax编程步骤

ajax使用流程:

创建XMLHttpRequest对象
设置请求方式
调用回调函数
发送请求

2.1、创建XMLHttpRequest对象

//第一步:创建XMLHttpRequest对象

var xmlHttp;
if(window.XMLHttpRequest){
    //非IE
    xmlHttp=new XMLHttpRequest();
}else if(window.ActiveXObject){
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}

2.2、设置请求方式

在web开发中,请求方式有两种,get和post。使用XMLHttpRequest对象的open()方法来设置。

名称功能参数
open()规定请求类型、URL以及是否异步处理请求参数1:设置请求类型,POST或者GET;参数2:服务器上接口请求地址;参数3:是否异步,是为true,否为false

//第二步,设置和服务器端交互的相应方式

var url="http://localhost:8080/JSLearning/getAjax";
xmlHttp.open("POST",url,true);

GET/POST:
get更简单更快,大多数情况下都能使用。然而上传文件或者大数据时请使用post请求。
同步/异步:
很多服务器在处理请求时相当费时,ajax出现前可能会引起程序挂起或者停止。而使用ajax可以在等待服务器响应同时继续执行其他脚本,当响应就绪后对响应进行处理。

2.3、调用回调函数

如果ajax使用异步传输,就需要回调函数来处理服务器响应。XMLHttpRequest对象有一个onreadystatechange属性,回调函数传递给该属性:xmlHttp.onreadystatechange=function(){}
所谓回调函数就是,请求在后台处理完,再返回前台所实现的功能。
//第三步,注册回调函数

xmlHttp.onreadystatechange=function(){
    if(xmlHttp.readyState==4){
        if(xmlHttp.status==200){
            var obj=document.getElementById(id);
            obj.innerHtml=xmlHttp.responseText;
        }else{
            alert("ajax服务器返回错误!");
        }
    }
}

上述代码中:
xmlHttp.readyState存有XMLHttpRequest状态(0:请求初始化;1:服务器连接已建立;2:请求已接收;3:请求处理中;4:请求已完成)
xmlHttp.status是服务器返回的结果(200:正确;404:未找到页面)
xmlHttp有两个属性用来获取后台返回数据:responseText和responseXML,前者获取字符串形式响应,后者获取XML形式响应。使用哪一种由后台返回数据决定。

2.4、发送请求

//第四步,设置请求参数,发送请求

var uname=document.getElementsByName("userName")[0].value;
var upass=document.getElementsByName("userPass")[0].value;
var params="userName="+uname+"&userPass="+upass+"&time="+Math.random();
//增加time随机数,防止读取缓存
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8");
//向请求添加请求头,如果post请求有数据一定要加!!!
xmlHttp.send(params);

如果想像HTTP表单那样POST数据,请使用setResquestHeader()添加请求头。

2.5、AJAX状态码说明

1:请求收到,继续处理
2:操作成功收到,分析、接受
3:完成此请求必须进⼀步处理
4:请求包含⼀个错误语法或不能完成
5:服务器执⾏⼀个完全有效请求失败
再具体就如下:
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新⽂件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,⽤户代理必须复位当前已经浏览过的⽂件
206——服务器已经完成了部分⽤户的GET请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问⽅式
304——客户端已经执⾏了GET,但⽂件未变化
305——请求的资源必须从服务器指定的地址得到
306——前⼀版本HTTP中使⽤的代码,现⾏版本中不再使⽤
307——申明请求的资源临时性删除
400——错误请求,如语法错误
401——请求授权失败
402——保留有效ChargeTo头响应
403——请求不允许
404——没有发现⽂件、查询或URl
405——⽤户在Request-Line字段定义的⽅法不允许
406——根据⽤户发送的Accept拖,请求资源不可访问
407——类似401,⽤户必须⾸先在代理服务器上得到授权
408——客户端没有在⽤户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且⽆进⼀步的参考地址411——服务器拒绝⽤户定义的Content-Length属性请求
412——⼀个或多个请求头字段在当前请求中错误
413——请求的资源⼤于服务器允许的⼤⼩
414——请求的资源URL⻓于服务器允许的⻓度
415——请求资源不⽀持请求项⽬格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If
Range请求头字段
417——服务器不满⾜请求Expect头字段指定的期望值,如果是代理服务器,可能是下⼀级服务器不能
满⾜请求
500——服务器产⽣内部错误
501——服务器不⽀持请求的函数
502——服务器暂时不可⽤,有时是为了防⽌发⽣系统过载
503——服务器过载或暂停维修
504——关⼝过载,服务器使⽤另⼀个关⼝或服务来响应⽤户,等待时间设定值较⻓
505——服务器不⽀持或拒绝⽀请求头中指定的HTTP版本

三、Jquery的ajax操作

3.1、传统方式实现ajax的不足

步骤繁琐
方法、属性、常用值太多不好记忆

3.2、Ajax()方法

可以通过发送http请求获取远程数据,是Jquery最底层的ajax实现,具有较高灵活性。
. a j a x ( [ s e t t i n g s ] ) ; / / 参 数 s e t t i n g s 是 .ajax([settings]); //参数settings是 .ajax([settings]);//settings.ajax()方法的参数列表,用于配置ajax请求的键值对集合。

$.ajax({
     url:请求地址,
     type:"get|post|put|delete", //默认为get
     data:{"id":"123","pwd":"123456"}, //请求参数
     dataType:"html|text|json|xml|script|jsonp",//请求参数类型
     success:function(data,dataTextStatus,jqxhr){},//请求成功回调
     error:function(jqxhr,textStatus,error){}  //请求失败回调
});

3.3、get()方法

$.get(url,data,function(result){

});

参数说明:
url:请求的路径
data:发送的数据
success:成功回调函数
result:返回的数据

3.4、post()方法

$.post(url,data,function(result){

});

参数说明:
url:请求的路径
data:发送的数据
success:成功回调函数
result:返回的数据

四、JSON

4.1、json的概念

JSON(javascript object notation)一种轻量级数据交换格式。易于阅读编写,解析生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition -December 1999的⼀个⼦集。
JSON采用完全独立于语言的文本格式,但也使用了类似于C语言家族的习惯。

4.2、JSON对象的定义与使用

定义格式:

var 变量名={
    "key1":value,            //Number
    "key2":"value",           //字符串
    "key3":[],               //数组
    "key4":{},                //json对象
    "key5":[{},{}]           //json数组
};

使用:【对象名.属性名】

<script type="text/javascript">
    //json定义
    var jsons={
        "key1":123,            //Number
        "key2":"234",           //字符串
        "key3":[123,"234"],               //数组
        "key4":{"key4_1":123,"key4_2":"234"},                //json对象
        "key5":[{"key5_1_1":123,"key5_1_2":"234"},
        {"key5_2_1":123,"key5_2_2":"234"}]           //json数组
    }
    //访问json属性
    alert(jsons.key1);
    alert(jsons.key2);
    alert(jsons.key3[1]);
    alert(jsons.key4.key4_1);
    alert(jsons.key5[0].key5_1_1);
</script>

4.3、JSON在JAVA中的使用

json和java对象的转换需要使用第三方包:
在这里插入图片描述

1、单个对象或者map集合
java->json

Users user2=new Users();
user2.setUserName("张三");
user2.setPassword("123");
user2.setAge(20);
JSONObject obj=JSONObject.fromObject(user2);

json->java

String str="{'userName':'李四','password':'admin','age':20}"
JSONObject json=JSONObject.fromObject(str);
Users user=(Users)JSONObject.toBean(json,Users.class);

2、对象集合和json的转换
java集合->json数组

List list=new ArrayList();
list.add("aa");
list.add("bb");
JSONArray obj=JSONArray.fromObject(list);//set转换一样

json数组->java集合(1)

String str="[{'age':20,'password':'abc','userName':'李四'},
{'age':19,'password':'aaa','userName':'张三'}]";
JSONArray json=JSONArray.fromObject(str);
Object[] objs=(Object[])JSONArray.toArray(json,Users.class);

json数组->java集合(2)

String str="[{'age':20,'password':'abc','userName':'李四'},
{'age':19,'password':'aaa','userName':'张三'}]";
JSONArray json=JSONArray.fromObject(str);
List<Users> list=(List<Users>)JSONArray.toCollection(json,Users.class);

3、实例

<html>
<head>
    <script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
    <script>
        $(function () {
            $("input[name='uId']").blur(function () {
                var uId = $(this).val();
                $.ajax({
                    url: "getUser",
                    data: "userId=" + uId,
                    type: "post",
                    dataType: "json",//服务器响应数据格式
                    success: function (rs) {
                        $("input[name='uName']").val(rs.userName);
                        $("input[name='address']").val(rs.address);
                        if (rs.sex == '男') {
                            $('#boy')[0].checked = true;
                        } else if (rs.sex == '女') {
                            $('#girl')[0].checked = true;
                        }
                    }
                });
            });
        });
    </script>
</head>
<body>
userId:<input type="text" name="uId"/><br>
userName:<input type="text" name="uName"/><br>
address:<input type="text" name="address"/><br>
sex:<input type="radio" name="sex" id="boy"/><input type="radio" name="sex" id="girl"/></body>
</html>
public class User {
    private Long userId;
    private String userName;
    private String address;
    private String sex;

    public User() {
    }

    public User(Long userId, String userName, String address, String sex) {
        this.userId = userId;
        this.userName = userName;
        this.address = address;
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
@WebServlet(name = "userServlet",urlPatterns = "/getUser")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String userId=req.getParameter("userId");
        User user=new User();
        switch (userId){
            case "1":
                user.setUserName("张三");
                user.setAddress("北京");
                user.setSex("男");
                break;
            case "2":
                user.setUserName("李四");
                user.setAddress("北京");
                user.setSex("女");
                break;
            case "3":
                user.setUserName("王平");
                user.setAddress("兰州");
                user.setSex("男");
                break;
            default:
                user.setUserName("");
                user.setAddress("");
                user.setSex("");
        }
        //将User对象响应给客户端
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        //对象转换成json格式
        JSONObject jsonObject = JSONObject.fromObject(user);
        writer.println(jsonObject);
    }
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

笑谈子云亭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值