Ajax

AJAX (Asynchronous JavaScript And XML),其含义为异步的 JavaScript 和 XML。其中 JavaScript 表明该技术和前端相关;XML 是指以此进行数据交换。

AJAX 作用有以下两方面:

  1. 与服务器进行数据交换:通过AJAX可以给服务器发送请求,服务器将数据直接响应回给浏览器。
  2. 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用校验等等。
    • 同步:浏览器页面在发送请求给服务器,在服务器处理请求的过程中,浏览器页面不能做其他的操作。只能等到服务器响应结束后,浏览器页面才能继续做其他的操作。
    • 异步:浏览器页面发送请求给服务器,在服务器处理请求的过程中,浏览器页面还可以做其他的操作。

Ajax 简单使用

服务端:

 1package web.servlet;
 2
 3import javax.servlet.ServletException;
 4import javax.servlet.annotation.WebServlet;
 5import javax.servlet.http.HttpServlet;
 6import javax.servlet.http.HttpServletRequest;
 7import javax.servlet.http.HttpServletResponse;
 8import java.io.IOException;
 9
10@WebServlet("/ajaxServlet")
11public class AjaxServlet extends HttpServlet {
12    @Override
13    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
14        // 返回给客户端响应数据
15        resp.getWriter().write("Hello Ajax!");
16    }
17
18    @Override
19    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
20        this.doGet(req, resp);
21    }
22}

客户端:

 1//1. 创建核心对象
 2let xhttp;
 3if (window.XMLHttpRequest) {
 4    xhttp = new XMLHttpRequest();
 5} else {
 6    // code for IE6, IE5
 7    xhttp = new ActiveXObject("Microsoft.XMLHTTP");
 8}
 9
10//2. 发送请求
11xhttp.open("GET", "http://localhost:8080/ajax-demo/ajaxServlet");
12xhttp.send();
13
14//3. 获取响应
15xhttp.onreadystatechange = function() {
16    if (this.readyState == 4 && this.status == 200) {
17        // 处理从服务端发送过来的响应数据
18        alert(this.responseText);
19    }
20};

Axios

Axios 是一个对原生的AJAX进行封装,简化书写的前端框架。

使用 Axios 进行交互

Axios 的使用分为以下两步:

  • 引入 Axios 的 js 文件

    1<script src="js/axios.js"></script>
    
  • 使用 Axios 发送请求,并获取响应结果:

    • 发送 GET 请求的基本形式:

      1axios({
      2    method: "get",
      3    // 请求参数会传递给服务器,此处请求参数可以转义也可以不转义
      4    url: "http://localhost:8080/axios-demo/demo?message=Hello%20World"
      5}).then(function (resp){
      6    // 对响应数据进行处理
      7    alert(resp.data);
      8})
      
    • 发送 POST 请求的基本形式:

      1axios({
      2    method: "post",
      3    url: "http://localhost:8080/axios-demo/demo",
      4    data: "message=Hello World"
      5}).then(function (resp){
      6    alert(resp.data);
      7});
      

其中:

  • axios() 是用来发送异步请求的,小括号中使用 js 对象传递请求相关的参数:

    • method 属性:用来设置请求方式的。

      取值为 get 或者 post。

    • url 属性:用来书写请求的资源路径。

      如果是 get 请求,需要将请求参数拼接到路径的后面,格式为: url?参数名=参数值&参数名2=参数值2。

    • data 属性:作为请求体被发送的数据。

      即,如果是 post 请求的话,数据需要作为 data 属性的值。

  • then() 需要传递一个匿名函数。

    then() 中传递的匿名函数称为回调函数,意思是该匿名函数在发送请求时不会被调用,而是在成功响应后调用的函数。

    而该回调函数中的 resp 参数是对响应的数据进行封装的对象,通过 resp.data 可以获取到响应的数据。

请求方法别名

为了方便起见, Axios 已经为所有支持的请求方法提供了别名。如下:

  • get 请求:

    1axios.get(url[,config])
    
  • delete 请求:

    1axios.delete(url[,config])
    
  • head 请求:

    1axios.head(url[,config])
    
  • options 请求:

    1axios.option(url[,config])
    
  • post 请求:

    1axios.post(url[,data[,config])
    
  • put 请求:

    1axios.put(url[,data[,config])
    
  • patch 请求:

    1axios.patch(url[,data[,config])
    

this 作用域问题

使用请求方法别名和箭头函数可以解决this作用域问题,防止this指向错误:

  • GET请求:

    1axios.get(
    2    "http://localhost:8080/axios-demo/demo?message=Hello World"
    3).then(resp => {
    4    // 对响应数据进行处理
    5    alert(resp.data);
    6})
    
  • POST请求:

    1axios.post(
    2    "http://localhost:8080/axios-demo/demo",
    3    "message=Hello World"
    4).then(resp => {
    5    // 对响应数据进行处理
    6    alert(resp.data);
    7})
    

JSON

JSON(JavaScript Object Notation)是指 JavaScript 对象表示法。

JSON的优点:数据格式简单,所占的字节数少等。

JSON 的格式

JSON 本质就是一个字符串,但是该字符串内容是有一定的格式要求的:

1{
2	"key_1": value_1,
3	"key_2": value_2,
4	"key_3": value_3,
5    ...,
6    "key_n": value_n
7}
  • JSON 格式中的键要求必须使用双引号括起来。
  • Value 的数据类型分为如下:
    • 数字(整数或浮点数)
    • 字符串(使用双引号括起来)
    • 逻辑值(true或者false)
    • 数组(在方括号{}中)
    • 对象(在花括号[]中)
    • null

在 js 中定义 json:

1var 变量名 = `{
2        "key1":value1,
3        "key2":value2,
4        ...
5    }`;

在 JS 中使用 JOSN

JS 提供了一个对象 JSON ,该对象有如下两个方法:

  • parse(str):将 JSON串转换为 js 对象。

    使用方式:

    1var jsObject = JSON.parse(jsonStr);
    
  • stringify(obj):将 js 对象转换为 JSON 串。

    使用方式:

    1var jsonStr = JSON.stringify(jsObject)
    

携带JSON发送异步请求

可以使用 JSON.stringify() 将js对象转换为 JSON 串,再将该 JSON 串作为 axios 的 data 属性值进行请求参数的提交。

但其实只需要将需要提交的参数封装成 js 对象,并将该 js 对象作为 axios 的 data 属性值。axios 会自动将 js 对象转换为 JSON 串进行提交。

发送异步请求时,如果请求参数是 JSON 格式,那请求方式必须是 POST。因为 JSON 串需要放在请求体中。

Fastjson

Fastjson 是阿里巴巴提供的一个Java语言编写的高性能功能完善的 JSON 库,是目前Java语言中最快的 JSON 库,可以实现 Java 对象和 JSON 字符串的相互转换。

依赖坐标:

1<dependency>
2    <groupId>com.alibaba</groupId>
3    <artifactId>fastjson</artifactId>
4    <version>1.2.62</version>
5</dependency>

JOSN 和 Java对象的相互转换包含:

  • 请求数据(反序列化):

    JSON字符串转为Java对象。

    将 json 转换为 Java 对象,只需要使用 Fastjson 提供的 JSON 类中的 parseObject() 静态方法即可。

    1String toJSONString(Object object)
    
  • 响应数据(序列化):

    Java对象转为JSON字符串。

    将 Java 对象转换为 JSON 串,只需要使用 Fastjson 提供的 JSON 类中的 toJSONString() 静态方法即可。

    1<T> T parseObject(String jsonStr, Class<T> clazz)
    

Example:

  • 导入坐标。

  • 编写pojo类:

     1package pojo;
     2
     3public class User {
     4    private Integer id;
     5    private String username;
     6    private String password;
     7
     8    public Integer getId() {
     9        return id;
    10    }
    11
    12    public void setId(Integer id) {
    13        this.id = id;
    14    }
    15
    16    public String getUsername() {
    17        return username;
    18    }
    19
    20    public void setUsername(String username) {
    21        this.username = username;
    22    }
    23
    24    public String getPassword() {
    25        return password;
    26    }
    27
    28    public void setPassword(String password) {
    29        this.password = password;
    30    }
    31
    32    @Override
    33    public String toString() {
    34        return "User{" +
    35                "id=" + id +
    36                ", username='" + username + '\'' +
    37                ", password='" + password + '\'' +
    38                '}';
    39    }
    40}
    
  • 编写FastJsonDemo:

     1package web.servlet;
     2
     3import com.alibaba.fastjson.JSON;
     4import pojo.User;
     5
     6public class FastJsonDemo {
     7    public static void main(String[] args) {
     8        // 1. Java对象转JSON字符串
     9        User user = new User();
    10        user.setId(1);
    11        user.setUsername("zhangsan");
    12        user.setPassword("123");
    13
    14        String jsonString = JSON.toJSONString(user);
    15        System.out.println(jsonString);
    16        // 输出:{"id":1,"password":"123","username":"zhangsan"}
    17
    18        // 2. 将JSON字符串转为Java对象
    19        User u = JSON.parseObject(
    20                "{\"id\":1,\"password\":\"123\",\"username\":\"zhangsan\"}",
    21                User.class);
    22        System.out.println(u);
    23    }
    24}