JSON&原生AJAX

发布于:2024-05-07 ⋅ 阅读:(19) ⋅ 点赞:(0)


JSON

JavaScript Object Notation:JavaScript对象文本表示形式

【1】json在js中是一个对象,在java中是字符串
建议:json的name书写在双引号中,值如果是字符类型建议书写在双引号中

【2】json是目前 前后端数据交互的主要格式之一

【3】json是一种特殊的 js 对象

#json的语法主要有两种:
        1. 对象 { }
        2. 数组 [ ]
        
1. 对象类型
		{name:value,name:value} 
		
2. 数组类型
		[
            {name:value,name:value}, 
            {name:value,name:value},
            {name:value,name:value}
		]
		
3. 复杂对象
		{
            name:value,
            wives:[{name:value},{},{}],
            son:{name:value}
		}
#注意: 
	1. 其中name必须是string类型
		json在js中,name的双引号可以省略
	2. value必须是以下数据类型之一:
		字符串
		数字 
		对象(JSON 对象)
		数组
		布尔
		Null
	3. JSON 中的字符串必须用双引号包围。(单引号不行!)	

Fastjson

fastjson引入

为了方便服务器解析,这要求服务端在响应之前,需要将响应的数据转换成符合Json格式的字符串
Snipaste_2024-05-06_13-33-28.png
通过拼接字符串的形式,将Java对象转换成json格式字符串无疑是非常麻烦的,在开发中我们一般使用转换工具来实现
所谓的转换工具是通过java封装好的一些jar工具包,可以直接将java对象或集合转换成json格式的字符串
常见的json转换工具
Snipaste_2024-05-06_13-37-16.png

fastjson 常用API

fastjson作用

  1. 将java对象转成json字符串=》响应给前端
  2. 将json字符串转成java对象=》接受前端的json数据封装到对象中

常用API

fastjson API 入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成

public static final String toJSONString(Object object); // 将java中任意对象序列化为JSON文字符串

//下面的两个方法是将页面获取json数据封装到实体类对象中

public static final T parseObject(String text, Class clazz); // 把JSON字符串text解析成指定类型JavaBean

public static final T parseObject(InputStream is, Class clazz); // 将从页面获取的字节输入流中的字符数据解析成指定类型JavaBean

举例:User user = JSON.parseObject(request.getInputStream(), User.class);
注意:
1)request.getInputStream():表示获取关联浏览器的字节输入流
2)使用parseObject方法将前端接收的json数据转换为对应实体类对象,要求前端传递的json数据的key必须和实体类对象的成员变量名一致
举例:
{“username”:“张子枫”,“password”:1234} 来自于前端浏览器
实体类:
class User{
private String username;//这里的成员变量必须前端提交json格式的数据的key一致,必须是username
private String password;
}

使用实例

  1. 导包
 <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
  1. 写实体类
  2. 利用上面方法进行转换

ajax和json综合(重要)

请求参数和响应数据都是普通字符串

Snipaste_2024-05-06_16-53-32.png


@WebServlet("/ajaxJsonTest01Servlet")
public class AjaxJsonTest01Servlet 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 username = request.getParameter("username");
        String password = request.getParameter("password");

        User user = new User(username, password);
        System.out.println(username +"---"+ password);

        response.getWriter().print(user);
    }
}

响应数据改为json格式

Snipaste_2024-05-06_16-54-47.png

@WebServlet("/ajaxJsonTest02Servlet")
public class AjaxJsonTest02Servlet 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 {

        //请求是字符串,获得响应是json

        //获取前端发过来的字符串
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        User user = new User(username, password);
        System.out.println(username +"---"+ password);

        String s = JSON.toJSONString(user);
        response.getWriter().print(s);
    }
}

请求和响应都是js数据

Snipaste_2024-05-06_16-57-17.png

@WebServlet("/ajaxJsonTest03Servlet")
public class AjaxJsonTest03Servlet 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 {

        //请求是json,获得响应是json

        //获取前端发过来的字符串
        User user = JSON.parseObject(request.getInputStream(), User.class);

        System.out.println(user);

        //响应给前端
        //模拟从数据库中查找
        ArrayList<User> list = new ArrayList<>();

        Collections.addAll(list,
                new User("张三","1234"),
                new User( "李四","1234"),
                user);

        String s = JSON.toJSONString(list);
        response.getWriter().print(s);
    }
}

封装到Result类和抽取到BaseController

Snipaste_2024-05-06_16-56-06.png

package com.example.json;

public class Result {

    private boolean flag;
    private String message;
    private Object userList;

    //用于增删改表单,不需要查看数据
    public Result(boolean flag, String message) {
        this.flag = flag;
        this.message = message;
    }

    //用于查询表单
    public Result(boolean flag, String message, Object userList) {
        this.flag = flag;
        this.message = message;
        this.userList = userList;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getUserList() {
        return userList;
    }

    public void setUserList(Object userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "Result{" +
                "flag=" + flag +
                ", message='" + message + '\'' +
                ", userList=" + userList +
                '}';
    }
}

public class BaseController {

    //解析json为object
    public static <T> T getObject(HttpServletRequest request,Class<T> clazz) throws IOException {

        T t = JSON.parseObject(request.getInputStream(), clazz);
        return t;
    }

    public static void getJson(HttpServletResponse response,Object obj) throws IOException {

        String s = JSON.toJSONString(obj);
        response.getWriter().print(s);

    }
}

@WebServlet("/ajaxJsonTest04Servlet")
public class AjaxJsonTest04Servlet 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 {

        //请求是json,获得响应是json

        //获取前端发过来的字符串
        //User user = JSON.parseObject(request.getInputStream(), User.class);
        User user = BaseController.getObject(request, User.class);

        System.out.println(user);

        //响应给前端
        //模拟从数据库中查找
        ArrayList<User> list = new ArrayList<>();

        Collections.addAll(list,
                new User("张三","1234"),
                new User( "李四","1234"),
                user);

        Result result = new Result(true, "查询列表成功", list);
//        String s = JSON.toJSONString(result);
//        response.getWriter().print(s);
        BaseController.getJson(response,result);
    }
}

原生Ajax

AJAX的执行流程

Snipaste_2024-05-06_19-17-32.png
流程说明:

  1. 用户访问的时候,由JavaScript底层创建一个请求对象:XMLHttpRequest对象。
  2. 请求对象创建一个回调函数,回调函数用于处理服务器返回的响应
  3. 请求对象用于发送请求给服务器
  4. 服务器接收到浏览器发过来的请求,并且对数据进行处理。
  5. 将数据以XML的格式发送回浏览器,由XMLHttpRequest请求对象的回调函数接收数据
  6. 使用HTML和CSS更新网页最新结果

XMLHttpRequest对象

创建XMLHttpRequest对象 说明
new XMLHttpRequest() 构造方法直接创建对象
XMLHttpRequest对象的事件 说明
on ready state change 每当 readyState 改变时,就会触发 onreadystatechange 事件
XMLHttpRequest对象的属性 说明
readyState 准备状态的值,当它等于4的时候,表示服务器数据接收完毕
status 服务器的状态码。等于200的时候,服务器正确响应
responseText 接收服务器返回的字符串数据
XMLHttpRequest对象的方法 说明
open(“GET”,“URL”,true) 打开服务器的连接
1. GET或POST表示请求的方式
2. URL访问服务器的地址
3. true 表示异步,false表示同步。
同步是指要等待服务器响应回来以后,才继续向后执行。
send() 发送请求,如果是GET方法send()不需要参数。
如果是POST,send()需要传递浏览器端的数据

#post发送参数前,需要设置编码格式,否则后台获取不到数据,post请求是模拟form表单提交数据
//application/x-www-form-urlencoded 表示form表单操作类型
xmlHttp.setRequestHeader(“CONTENT-TYPE”,“application/x-www-form-urlencoded”);

说明:
readyState属性是XMLHttpRequest对象的属性,它是表示当前ajax引擎和服务器交互过程中的变化情况,也就是对象状态(表示请求状态),通过5个数字体现状态变化:
0 : 表示客户端建立了XMLHttpRequest对象,但并没有和服务器进行交互(请求未初始化).
1 : 表示客户端已经调用XMLHttpRequest对象中的open方法,打开了和服务器的连接(请求正在加载).
2 : 表示客户端已经调用XMLHttpRequest对象中的send方法,发送出了请求数据(请求已加载).
3 : 表示服务器已经处理完请求但还没有给客户端响应数据(交互中).
4 : 表示服务器响应数据正常结束(请求完成).
Snipaste_2024-05-06_19-40-20.png
get请求

Snipaste_2024-05-06_19-42-03.png
post请求
Snipaste_2024-05-06_19-42-40.png** **

使用原生的AJAX

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax的get请求</title>
</head>
<body>
        <button id="btn">发送get请求</button>
</body>
<script>
    //给按钮绑定事件
    document.getElementById("btn").onclick = function () {
        //ajax发送get请求

        //1.创建xhr  XMLHttpRequest ajax引擎    发送请求
        var xhr = new XMLHttpRequest();;

        //2.监听请求和响应状态  请求   响应
        xhr.onreadystatechange = function () {
            //请求和响应  OK
            if(xhr.readyState == 4 && xhr.status == 200){
                //接收响应数据    ajax能够接收的响应数据类型:1.字符串  2.xml
                var responseText = xhr.responseText;
                alert(responseText);
            }
        }

        //3.设置请求参数   get post   数据
        //1.method   get post
        //2.url      请求地址
        //3.async     同步?异步?    默认异步==true
        xhr.open("GET","/ajaxGetServlet?name=张三&age=19",true);

        //4.发送请求
        xhr.send();
    }
</script>
</html>

java

@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 username = request.getParameter("username");
        String age = request.getParameter("age");

        System.out.println(username+"==="+age);

        response.getWriter().print("请求已收到");
    }
}