Ajax & JSON

Ajax

概念

  1. 什么是Ajax?
    Asynchronous JavaScript and XML , 异步的JSXML.异步的客户端和服务器交互技术
    Ajaxjs提供的,代码是js代码,需要写在Script标签体里
    Ajax在客户端和服务器进行交互的时候,数据默认是使用XML格式传输的--已经被json取代了

  2. 作用

    • 局部刷新
    • 异步加载
  3. 异步与同步的概念
    同步: 客户端发起请求,然后客户端处于服务器的等待状态,这个状态下,客户端不能进行其他操作.类似于"假死"状态.
    异步: 客户端发起请求, 然后客户端可以自由进行其他操作,不会处于“假死”状态;一旦服务器响应完成,可以继续后续操作

JS 的 Ajax

步骤
  • 创建一个Ajax引擎对象
  • 给Ajax引擎对象绑定事件,监听Ajax引擎的状态变化.一旦监听到接受服务器响应完成,要执行响应行为
  • 设置请求的参数数据
  • 发送请求
js 的 get方法-异步
function ajaxGet() {
        //创建一个Ajax引擎对象
        var xmlHttp = new XMLHttpRequest();
        //2.给Ajav引擎对象绑定事件,监听Ajax的引擎状态变化,一旦监听到接收服务器响应完成,要执行响应行为
        xmlHttp.onreadystatechange = function (ev) {
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                    document.getElementById("tip").innerText = xmlHttp.responseText;
                }
            }
        }
        //3.这是请求的参数数据,open()方法:请求方式,请求地址,是否异步(默认true,异步)
        //get方法传参
        xmlHttp.open("get", "/ajax/ajaxServlet?username=tom", true);
        //4. 发送请求
        xmlHttp.send();  
js的post方法-异步
    function ajaxPost() {
        //1. 创建一个Ajax引擎对象
        var xmlhttp = new XMLHttpRequest();
        // 2. 给Ajax引擎对象绑定事件,监听Ajax引擎的状态变化.一旦监听到接受服务器响应完成,要执行响应行为
        xmlhttp.onreadystatechange = function (ev) {
            if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 200) {
                    document.getElementById("tip").innerHTML = xmlhttp.responseText;
                }
            }
        }
        // 3. 设置请求的参数数据:请求方式,请求地址,是否异步(//不写true,默认是异步的)
        xmlhttp.open("post", "ajaxServlet", true);
        // 4. 发送请求
        xmlhttp.setRequestHeader("Content-type","application/x-www/form-urlencode")
        xmlhttp.send("username=tom");
    }
js的post和get方法-同步模式

只需要将 xmlhttp.open(method,url,async)中的aync参数该为false即可

请求参数的格式
  • 格式一:"username=tom&password=123"
  • 格式二:{username:"tom",password:"123"}
关于路径
  • HTML里写路径的时候,建议使用相对路径.好处是不需要关注context path.
  • jsp或者Servlet里面,写绝对路径 ./资源路径 或者 /contextpath/资源路径
  • 当前页面的资源路径:/jsajax.html
    请求的目标资源路径:/ajaxServlet
    在当前页面里请求/ajaxServlet,路径就可以写成:./ajaxServlet,简写成:ajaxServlet

jQuery 的 Ajax

原生的 JavaScript 提供的 Ajax,重复代码比较多,而且存在浏览器兼容问题。jQuery 对 js 的 Ajax 做了二次封 装,封装后提供了一些方法。这些方法一样可以实现 Ajax 的效果,但是比原生 js 的 Ajax 更为简单,并且解决了浏览器兼 容性问题.

Post方法 (最常用)
语法: jQuery.post(url,[params],[callback],[responseType])
参数: url 请求的地址,必须
     params 请求的参数
        格式1: username=tom&password=123
        格式2:  {username:"tom",password:"123"}
     callback 当Jquery监听到服务端响应完成之后,调用的函数对象
        function(result){
            //result:服务器响应回来的数据
        }
    responseType 服务端响应回来的数据类型。text/json
//var params = "username=tom";
        var params = {username:"tom"};
        $.post("ajaxServlet", params, function (result) {
            alert(result);
        })
Get方法
语法: jQuery.get(url,[params],[callback],[responseType])
参数: url 请求的地址,必须
     params 请求的参数
        格式1: username=tom&password=123
        格式2:  {username:"tom",password:"123"}
     callback 当Jquery监听到服务端响应完成之后,调用的函数对象
        function(result){
            //result:服务器响应回来的数据
        }
    responseType 服务端响应回来的数据类型。text/json
 var params = {username:"tom"}
        $.get("/ajax/ajaxServlet",params,function (result) {
            alert(result);
        })

注意: get/post方法,只能发异步的. 如果要发送同步的请求,需要使用ajax方法

Ajax方法
语法:$.ajax({settings});
参数:是以{}的对象形式,里边是键值对的方式配置相关的数据。有非常多的配置项,常用的有:
      url:请求的地址。必须
      data:请求参数。格式一:"username=tom&password=123"。 格式:{username:"tom",password:"123"}
      type:请求方式。get/post
      dataType:服务端响应回来的数据类型。text/json
      success:jQuery 监听到服务端响应完成后,调用的函数对象。
         function(result){
             //result:服务端响应回来的数据
         }
      async:是否异步。true/false
$.ajax({
    url: "/ajax/ajaxServlet",  // 请求地址,必填
    data: "username=tom", //请求参数
    type: "post", //请求方式
    dataType: "text", //服务器返回的参数类型
    success: function (result) { //监听到服务器响应完成后,调用函数对象
        alert(result);
    },
    async: true  //是否异步,默认true
});
jQuery3.0 的Ajax新增签名方式

待补充...下回分解....

JSON

概念

JavaS Object Notation JS对象标记法. 是一种轻量级数据格式,代替xml

定义和解析JSON

  • 定义:
    • 对象形式定义:var json = {"key":value, "key":value}
    • 数组形式定义:var arr = [obj1, obj2];
    • 两种混合定义:var arr = {"key":obj, "key":{}, "key":[]}
  • 解析: var v = json.key; var v = json[i].key
  • Demo
    • var json = {key:value,key:value}
    /*class Person{
       String name = "三丰";    
       Integer age = 100; 
    }*/
    var p = {"name":"三丰","age":100};
    var name = p.name;
    var age = p.age;
    
    • var arr = [object1,object2]
      //[{key:value,key:value},{key:value,key:value}]
      var json = [
          {"name":"张三","age":17},
          {"name":"李四","age":18}
      ];
      var name1 = json[0].name;
      var name2 = json[1].name;
      var age1 = json[0].age;
      var age2 = json[1].age;
      
    • var arr = {"key":"obj","key":{},"key":[]}
      //1. {"param":[{key:value,key:value},{key:value,key:value}]
      var json = {
          "department" :[
              {"name":"coco","age":17},
              {"name":"joy","age":18},
              {"name":"ceci","age":19}
          ]
      };
      var name = json.department[2].name;
      
      /**
       * 2. 
       * {
       *   "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 = {
          "department1": [
              {"name": "coco", "age": 17},
              {"name": "joy", "age": 18},
              {"name": "ceci", "age": 19}
          ],
          "department2": [
              {"name": "coco", "age": 17},
              {"name": "joy", "age": 18},
              {"name": "ceci", "age": 19}
          ]
      }
      var age = json.department2[1].age;
      alert(age);
      
      /**
       * 3
       * {
       *   "param1":"value1",
       *   "param2":{},
       *   "param3":[{key:value,key:value},{key:value,key:value}]
       * }
       */
      
      var json = {
          "school": "University",
          "info": {"schoolName": "ShenZhen-University", "address": "ShenZhen"},
          "student": [
              {"name": "coco", "age": 17},
              {"name": "joy", "age": 18},
              {"name": "ceci", "age": 19}
          ]
      }
      var schoolName = json.info.schoolName;
      var name = json.student[0].name;
      alert(schoolName);
      alert(name);
      

JSON转换工具

服务端经常要把 JavaBean 或者是 JavaBean 的集合转换成 json,返回响应给客户端,可以使用工具包来完成 这个转换的工作。

常见的有:

  • jsonlib:sun 公司的,依赖的 jar 包过多
  • gson:google 的工具包
  • fastjson:alibaba 的工具包
  • jackson:springMvc 默认使用的转换工具包
jsonlib
package json;

import domain.User;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class JsonLib_01 {
    public static void main(String[] args) {
        User user1 = new User("coco","123");
        User user2 = new User("xingxing","123");

        ArrayList userList = new ArrayList();

        userList.add(user1);
        userList.add(user2);

        Map map = new HashMap<>();
        map.put("user1",user1);
        map.put("user2",user2);
        
        //把user1转换为json格式
        JSONObject jsonObject = JSONObject.fromObject(user1);
        String json = jsonObject.toString();
        System.out.println(json);

        //把list转换为json格式
        JSONArray jsonArray = JSONArray.fromObject(userList);
        json = jsonArray.toString();
        System.out.println(json);

        //把map转换为json格式
        JSONObject jsonObject1 = JSONObject.fromObject(map);
        json = jsonObject1.toString();
        System.out.println(json);
    }
}

gson
package json;

import com.google.gson.Gson;
import domain.User;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Gson_02 {
    public static void main(String[] args) {
        User user1 = new User("coco", "123");
        User user2 = new User("xingxing", "123");

        ArrayList userList = new ArrayList();
        userList.add(user1);
        userList.add(user2);

        Map map = new HashMap<>();
        map.put("user1", user1);
        map.put("user2", user2);

        //把user转换为Json格式
        Gson gson = new Gson();
        String json = gson.toJson(user1);
        System.out.println(json);

        //把userList转换为Json格式
        json = gson.toJson(userList);
        System.out.println(json);

        //把map转换为Json格式
        json = gson.toJson(map);
        System.out.println(json);
    }
}

fastjson
package json;

import com.alibaba.fastjson.JSONObject;
import domain.User;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class FastJson_03 {
    public static void main(String[] args) {
        User user1 = new User("coco", "123");
        User user2 = new User("xingxing", "123");

        ArrayList userList = new ArrayList();

        userList.add(user1);
        userList.add(user2);

        Map map = new HashMap<>();
        map.put("user1", user1);
        map.put("user2", user2);

        //把user转换为Json格式
        String json = JSONObject.toJSONString(user1);
        System.out.println(json);

        //把userList转换为Json格式
        json = JSONObject.toJSONString(userList);
        System.out.println(json);

        //把map转换为Json格式
        json = JSONObject.toJSONString(map);
        System.out.println(json);
    }
}
jackson
package json;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import domain.User;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Jackson {
    public static void main(String[] args) throws JsonProcessingException {

        User user1 = new User("coco", "123");
        User user2 = new User("xingxing", "123");

        ArrayList userList = new ArrayList();

        userList.add(user1);
        userList.add(user2);

        Map map = new HashMap<>();
        map.put("user1", user1);
        map.put("user2", user2);

        ObjectMapper mapper = new ObjectMapper();
        
        //把user转换为Json格式
        String json = mapper.writeValueAsString(user1);
        System.out.println(json);
        
        //把userList转换为Json格式
        json = mapper.writeValueAsString(userList);
        System.out.println(json);
        
        //把map转换为Json格式
        json = mapper.writeValueAsString(userList);
        System.out.println(json);
    }
}

你可能感兴趣的