AJAX和JSON

第一章Ajax

1.1 Ajax 概念

"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。

1.2 AJAX原理分析

AJAX引擎会在不刷新浏览器地址栏的情况下,发送异步请求

1.1 使用JavaScript获得浏览器内置的AJAX引擎(XMLHttpRequest对象)

1.2 使用js确定请求路径和请求参数

1.3  AJAX引擎对象根据请求路径和请求参数进行发送请求

服务器接收到ajax引擎的请求进行处理

2.1     服务器获得请求参数数据

2.2     服务器处理请求业务(调用业务层代码)

2.3     服务器响应数据给ajax引擎

AJAX引擎获得服务器响应的数据,通过执行JavaScript的回调函数将数据更新到浏览器页面具体位置。

3.1     通过设置给AJAX引擎的回调函数获得服务器响应的数据

3.2     使用JavaScript在指定的位置,显示响应数据,从而局部修改页面的数据,达到局部刷新目的。

1.3 js原生的ajax开发

1.3.1. js原生的ajax的开发步骤
1)创建Ajax引擎对象(浏览器创建)
2)为Ajax引擎对象绑定监听(监听服务器已将数据响应给引擎)
3)绑定提交地址
4)发送请求
5)监听里面处理响应数据

开发参照w3cschool文档
XMLHttpRequest 是 AJAX 的基础
准备资源:编写外部js (在html中导入依赖!!)

 

1531470878996.png

  • 内容:
// 获取ajax开发核心对象
function getXhr() {
    var xmlhttp;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    return xmlhttp;
}
//  通过id 获取dom对象 自定一个方法 这里以 $(id) 为例 ,也可以 _(id) 等
function  $(id) {
    return document.getElementById(id);
}
  • 准备资源页面 ajax_get.html
<body>
<input type="button" value="ajax_get请求" onclick="sendGet();"><br>
<input type="button" value="ajax_Post请求" onclick="sendPost();"><hr>
<div id="mydiv"></div>
</body>
  • get请求
 //  ajax开发 发送get请求  更新 div标签 内容来自服务器servlet响应数据

        function sendGet() {
            // 1.  创建XMLHttpRequest
            var xhr = getXhr();
            // 2. 点击按钮 发送异步请求  后台servlet发送请求  获取response数据更新 div
            //  建立请求参数  参数1  请求方式  get/post   参数2 请求服务器地址   参数3  true 异步 默认 true
            xhr.open("get", "ajaxGetServlet?id=10101&name=lisi", true);

            // 4 服务器响应 接受服务器response回送数据  函数 一开始不执行的!  回调函数注册
            xhr.onreadystatechange = function ()
                //  事件 绑定函数  当服务器响应时,该事件触发了函数执行  dom更新
            {   
               //当服务器相应码为200且xhr的readyState参数为4的时候,执行dom更新
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var data = xhr.responseText;//  服务器回送数据字符
                   $("mydiv").innerHTML = data;//调用自定义函数
                }
            }

            //3 发送请求
            xhr.send(null);//  get 请求  send null

        }

  • post请求
//  ajax开发 发送get请求  更新 div标签 内容来自服务器servlet响应数据

        function sendPost() {
            // 1.  创建XMLHttpRequest
            var xhr = getXhr();
            // 2. 点击按钮 发送异步请求  后台servlet发送请求  获取response数据更新 div
            //  建立请求参数  参数1  请求方式  get/post   参数2 请求服务器地址   参数3  true 异步 默认 true
            xhr.open("post", "ajaxGetServlet", true);

            // 4 服务器响应 接受服务器response回送数据  函数 一开始不执行的!  回调函数注册
            xhr.onreadystatechange = function ()
                //  事件 绑定函数  当服务器响应时,该事件触发了函数执行  dom更新
            {
               //  alert("1");
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var data = xhr.responseText;//  服务器回送数据字符
                    $("mydiv").innerHTML = data;
                }
            }

            //3 post发送请求
            xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            xhr.send("id=9999");//  post 请求
        }
  • 编写服务器servlet接受ajax请求
package cn.itheima.ajax.get;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/ajaxGetServlet")
public class AjaxGetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String id = request.getParameter("id");
        System.out.println("客户端提交id = "+id);
       response.setContentType("text/html;charset=utf-8");
       response.getWriter().print("<font color='red'>你好A贾克斯</font>");
    }
}

 


 

1.4 get/post小结:

  • 相同点:
1. 开发的四步骤结构代码是一样: 
2. 获取XMLHttpRequest代码相同的
3. open("get/post","url",true);
4. xhr.onreadystatechange=function(){  //  dom更新。。。} 
5. 都是通过xhr.send()方法发送请求!
  • 不同点:
1.xhr.open("get/post"); 
2.get请求 xhr.send(null)   
post请求需要添加固定头信息和send参数
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(key=value)

 


 

第5节 jQuery框架的ajax(***)

jquery是一个优秀的js框架,自然对js原生的ajax进行了封装,封装后的ajax的操 作方法更简洁,功能更强大,与ajax操作相关的jquery方法有如下几种,但开发中 经常使用的有三种:

请求方式语法
GET请求$.get(url, [data][callback][type])
POST请求$.post(url, [data][callback][type])
AJAX请求$.ajax([settings])
Load请求$(element).load(url);

5.1 GET请求方式

语法:$.get(url, [data], [callback], [type])
url:待载入页面的URL地址
data:待发送 Key/value 参数。
callback:载入成功时回调函数。
type:返回内容格式,xml, html, script, json, text, _default。
示例1:
$("button").click(function(){
  $.get("demo_test.asp",function(data,status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});

示例2:
$.get("test.cgi", { name: "John", time: "2pm" },
  function(data){
    alert("Data Loaded: " + data);
  });

5.2 POST请求方式

示例1:使用 ajax 请求发送表单数据:
$.post("test.php", $("#testform").serialize());

示例2:获得 test.php 页面返回的 json 格式的内容::
$.post("test.php", { "func": "getNameAndTime" },
   function(data){
     alert(data.name); // John
     console.log(data.time); //  2pm
   }, "json");

5.3 AJAX请求方式

$.ajax({key:value,key:value})

属性名称解释
url请求的服务器端url地址
async(默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false
data发送到服务器的数据,可以是键值对形式,也可以是js对象形式
type(默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET"
dataType预期的返回数据的类型,取值可以是 xml, html, script, json, text, _defaul等
success请求成功后的回调函数
error请求失败时调用此函数
示例:
         $.ajax({
                        //type默认为get
                        type:"post",
                        url:"searchServlet",
                        data:{name:word},
                        dataType:"json",
                        success:function (result) {
                            //判断数据是否为空,result返回的是一个列表数据,就是js数组
                            if(result.length>0){
                                //result为json数组例如 [{id:1,name:aa,password:123},...]
                                //每一个用户名就是一个div
                                var html="";//用于拼接结果
                                for(var i=0;i<result.length;i++){
                                    var user = result[i];
                                    html+="<div>"+user.name+"</div>";
                                }
                                //将html更新到show里面并显示出来
                                $(".show").html(html).show();
                            }
                        },
                        error:function () {
                            alert("没有成功获取数据");
                        }
                     });                 

第六章. json数据格式

简介:JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

json对象有三种数据格式,分别如下:

类型语法解释
对象类型{name:value,name:value...}其中name是字符串类型,而value是任意类型
数组/集合类型[value,value,value...]或[{},{}... ...]其中value是任何类型(比如js对象,或数组)
混合类型{name:[]... ...}合理包裹嵌套对象类型和数组类型
 <script language="JavaScript">

    /**

     * 案例一 -json对象的定义和调用说明

     *  var person={key:value,key:value}

     *  

     * class Person{

     *    String firstname = "张";

     *    String lastname = "三丰";

     *    Integer age = 100;

     * }

     * 

     * Person p = new Person();

     * System.out.println(p.firstname);

     */

    

     //json的定义

     var person = {"firstname":"张","lastname":"三丰","age":100};

     

     //json解析

     alert(person.firstname);

     alert(person.lastname);

     alert(person.age);

    

  </script>


<script language="JavaScript">

    /**

     * 案例二 - json对象数组使用说明

     *  [{key:value,key:value},{key:value,key:value}]

     *  

     */

    var json = [

                    {"firstname":"张","lastname":"三丰","age":100},

                    {"firstname":"张","lastname":"翠山","age":58},

                    {"firstname":"张","lastname":"无忌","age":23}

                 ];

    

    for(var i=0;i<json.length;i++){

        alert(json[i].lastname);

    }

 

  </script>
<script language="JavaScript">

  /**

    * 案例三 -json对象数组嵌套

    * {

    *   "param1":[{key:value,key:value},{key:value,key:value}],

    *   "param2":[{key:value,key:value},{key:value,key:value}],

    *   "param3":[{key:value,key:value},{key:value,key:value}]

    * }

    *  

    *  

    */

    var json = {

               "baobao":[

                           {"name":"小双","age":18,"addr":"扬州"},

                           {"name":"建宁","age":18,"addr":"北京海淀"},

                           {"name":"龙儿","age":38,"addr":"岛国"},

                           {"name":"阿珂","age":17,"addr":"台湾"}

                         ],

               "haohao":[

                           {"name":"楠楠","age":23,"addr":"北京昌平修正"},

                           {"name":"倩倩","age":18,"addr":"上海"}

                         ]

        }

    

    

    //取倩倩

    alert(json.haohao[1].name);



 </script>

java对象需要转为json格式的字符串回调给浏览器。

常见的json转换工具

工具名称介绍
JsonlibJava 类库,需要导入的jar包较多
Gsongoogle提供的一个简单的json转换工具
Fastjsonalibaba技术团队提供的一个高性能的json转换工具
Jackson开源免费的json转换工具,springmvc转换默认使用jackson

fastjson依赖包:

 

fastjson依赖包

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //模拟数据库
        ArrayList<User> users = new ArrayList<User>();
        users.add(new User(1,"lanzhiyi",26));
        users.add(new User(2,"Bill",56));
        users.add(new User(3,"Tang",36));
        users.add(new User(4,"周杰伦",36));
        //集合转换json数组字符串 这里依赖fast
        response.setContentType("text/json;charset=utf-8");
        //fastjson依赖包的方法:java->json
        String s = JSON.toJSONString(users);
        System.out.println("s = " + s);
        //s = [{"age":26,"id":1,"name":"lanzhiyi"},{"age":56,"id":2,"name":"Bill"},{"age":36,"id":3,"name":"Tang"},{"age":36,"id":4,"name":"周杰伦"}]
        response.getWriter().print(s);

    }

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.11.3.js" type="application/javascript"></script>
    <script>
        function jsonDemo() {
            $("#mytab").empty();
            var str = "";
            $.get("jsonServlet",function(data){
                $(data).each(function () {
                    str+="<tr><td>"+this.id+"</td><td>"+this.name+"</td><td>"+this.age+"</td></tr>"
                })
                $("#mytab").append("<tr>\n" +
                    "        <td> 编号</td>\n" +
                    "        <td> 姓名</td>\n" +
                    "        <td> 年龄</td>\n" +
                    "    </tr>").append(str)
            });
        }
    </script>
</head>
<body>
<input type="button" value="显示用户列表信息" onclick="jsonDemo();"><br>
<table id="mytab" border="1px " style=" border-color: darkgray" width="30%">

</table>
</body>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值