Ajax
AJAX (Asynchronous JavaScript And XML),其含义为异步的 JavaScript 和 XML。其中 JavaScript 表明该技术和前端相关;XML 是指以此进行数据交换。
AJAX 作用有以下两方面:
- 与服务器进行数据交换:通过AJAX可以给服务器发送请求,服务器将数据直接响应回给浏览器。
- 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用校验等等。
- 同步:浏览器页面在发送请求给服务器,在服务器处理请求的过程中,浏览器页面不能做其他的操作。只能等到服务器响应结束后,浏览器页面才能继续做其他的操作。
- 异步:浏览器页面发送请求给服务器,在服务器处理请求的过程中,浏览器页面还可以做其他的操作。
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}
评论