AJAX&&JSON转换工具

    技术2025-01-06  20

    Ajax && JSON

    一 Ajax概述

    AJAX(Asynchronous JavaScript And XML):异步的 JavaScript 和 XML

    本身不是一种新技术,而是多个技术综合。用于快速创建动态网页的技术 一般的网页如果需要更新内容,必需重新加载个页面 而 AJAX 通过浏览器与服务器进行少量数据交换,就可以使网页实现异步更新。也就是在不重新加载整个页面的情况下,对网页的部分内容进行局部更新
    同步与异步方式的区别
    同步方式发送请求 由浏览器发送请求给服务器,它们之间是串行操作,如果服务器没有响应回来,我们不能进行下一步的操作,这期间浏览器只能等待 异步方式发送请求 由 JavaScript 生成一个对象,这个对象 XMLHttpRequest,由这个对象去发送请求给服务器,并且是后台发送的,不会影响用户操作体验。而且浏览器与服务器之间是并行操作的。

    二 原生 JavaScript 实现 AJAX

    什么是原生的ajax
    所有的 AJAX 的操作代码都使用纯 JS 去完成,不使用任何框架。开发效率相对低,代码量会更大一些
    核心对象XMLHttpRequest
    用于在后台与服务器交换数据。可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 创建 XMLHttpRequest 对象说明new XMLHttpRequest()创建一个请求对象 XMLHttpRequest 对象的事件说明onreadystatechange当这个请求对象的准备状态发生改变时,激活这个事件如:后台操作的时候,发送请求给服务器,这个状态就会发生变化。如:响应回来,这个状态也会发生变化 XMLHttpRequest 对象的属性说明readyState这个属性用来得到准备状态的值,如果这个值等于 4 表示请求结束并且服务器已经响应回来。status状态码,服务器状态码是 200,表示响应正确responseText取得从服务器发送回来的数据,文本格式 XMLHttpRequest 对象的方法说明open(“GET”,“URL”,true)作用: 打开与服务器的连接参数:1. GET 或 POST,以什么方式打开连接。GET 方式的参数在 URL 上传递。2. URL 服务器的访问地址3. true 代码异步执行,false 代码同步执行send()作用: 发送请求给服务器
    案例

    姓名文本框失去焦点事件 验证用户是否可用

    环境准备 <body> <form autocomplete="off"> 姓名:<input type="text" id="username"> <span id="uSpan"></span> <br> 密码:<input type="password" id="password"> <br> <input type="submit" value="注册"> </form> </body> <script> //1.为姓名绑定失去焦点事件 文本框失去焦点,得到文本框中的姓名 document.getElementById("username").onblur = function () { //2 创建 XMLHttpRequest 请求对象 let xmlHttp = new XMLHttpRequest(); //3 设置请求的 URL 路径 let username = document.getElementById("username").value; //4调用 open 方法,设置提交给服务器的请求方式和访问地址 xmlHttp.open("GET","userServlet?username="+username,true) //5 调用 send 方法发送请求 xmlHttp.send(); //6 设置请求对象的 onreadystatechange 事件,即"准备状态改变"事件 xmlHttp.onreadystatechange = function () { //a 当 readyState 等于 4,并且服务器 status 响应码为 200 则表示响应成功 if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { //b 通过 responseText 得到响应的字符串,服务器返回的是一个字符串数组 //c 将响应的数据显示到span标签 document.getElementById("uSpan").innerHTML = xmlHttp.responseText; } } }

    三 jQuery 的 方式实现 AJAX

    3.1 jQuery 的 GET 方式实现 AJAX

    核心语法
    $.get(url,[data],[callback],[type]); url:请求的资源路径。 data:发送给服务器端的请求参数,格式可以是key=value,也可以是 js 对象。 callback:当请求成功后的回调函数,可以在函数中编写我们的逻辑代码。 type:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。 //1.为用户名绑定失去焦点事件 $("#username").blur(function () { let username = $("#username").val(); //2.jQuery的GET方式实现AJAX $.get( //请求的资源路径 "userServlet", //请求参数 "username=" + username, //回调函数 function (data) { //将响应的数据显示到span标签 $("#uSpan").html(data); }, //响应数据形式 "text" ); });

    3.2 jQuery 的 POST 方式实现 AJAX

    核心语法
    $.post(url,[data],[callback],[type]); url:请求的资源路径。 data:发送给服务器端的请求参数,格式可以是key=value,也可以是 js 对象。 callback:当请求成功后的回调函数,可以在函数中编写我们的逻辑代码。 type:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。 <script> //1.为用户名绑定失去焦点事件 $("#username").blur(function () { let username = $("#username").val(); //2.jQuery的POST方式实现AJAX $.post( //请求的资源路径 "userServlet", //请求参数 "username=" + username, //回调函数 function (data) { //将响应的数据显示到span标签 $("#uSpan").html(data); }, //响应数据形式 "text" ); }); </script>

    3.3 jQuery 的通用方式实现 AJAX

    核心语法
    $.ajax({name:value,name:value,}); url:请求的资源路径。 async:是否异步请求,true-是,false-(默认是 true)。 data:发送到服务器的数据,可以是键值对形式,也可以是 js 对象形式。 name=value&name=value&... {key:value, key:value,...} type:请求方式,POST 或 GET (默认是 GET)。 dataType:预期的返回数据的类型,取值可以是xml, html, js, json, text等。 success:请求成功时调用的回调函数。 error:请求失败时调用的回调函数。 //1.为用户名绑定失去焦点事件 $("#username").blur(function () { let username = $("#username").val(); //jQuery的val()方法 //2.jQuery的通用方式实现AJAX $.ajax({ //请求资源路径 url:"userServlet", //是否异步 // async:true, async:true, //请求参数 data:"username="+username, //请求方式 type:"POST", //数据形式 dataType:"text", //请求成功后调用的回调函数 success:function (data) { //将响应的数据显示到span标签 $("#uSpan").html(data); }, //请求失败后调用的回调函数 error:function () { alert("操作失败..."); } });

    JSON

    一 JSON 回顾

    概述
    JSON(JavaScript Object Notation):是一种轻量级的数据交换格式 它是基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于计算机解析和生成,并有效的提升网络传输效率。
    API
    类型语法说明对象类型{name:value,name:value,…}name是字符串类型,value可以是任意类型数组/集合类型[{name:value,…},{name:value,…}]同上混合类型{name:[{name:value,…},{name:value,…}]}同上
    常用方法
    成员方法说明stringify(对象)将指定对象转换为json格式字符串parse(字符串)将指定json格式字符串解析成对象

    二 JSON 转换工具

    介绍
    JSON 的转换工具是通过 JAVA 封装好的一些 JAR 工具包 可以将 JAVA 对象或集合转换成 JSON 格式的字符串,也可以将 JSON 格式的字符串转成 JAVA 对象 Jackson:开源免费的 JSON 转换工具,SpringMVC 转换默认使Jackson。 1. 导入 jar 包。 2. 创建核心对象。 3. 调用方法完成转换。
    常用类
    类名说明ObjectMapper是Jackson工具包的核心类, 它提供一些方法来实现 JSON 字符串和对象之间的转换TypeReference对集合泛型的反序列化,使用TypeReference可以明确的指定反序列化的对象类型

    ObjectMapper 常用方法

    方法名说明String writeValueAsString(Object obj)将Java对象转换成JSON字符串 T readValue(String json, Class valueType)将JSON字符串转换成Java对象 T readValue(String json, TypeReference valueTypeRef)将JSON字符串转换成Java对象,多用于含有自定义类的转换

    三 JSON 工具转换练习

    环境准备 创建一个User类 public class User { private String name; private Integer age; ..构造方法.. set和get... //2 创建jackson工具包核心类 private ObjectMapper mapper = new ObjectMapper(); 1. java 对象转 JSON, JSON 转 java对象 User user = new User("张三",23); String json = mapper.writeValueAsString(user); System.out.println("json字符串:" + json); //json转User对象 // User user2 = mapper.readValue(json, User.class); User user2 = mapper.readValue(json, User.class); System.out.println("java对象:" + user2); 输出结果: json字符串:{"name":"张三","age":23} java对象:User{name='张三', age=23} 2. Map<String,String>转 JSON, JSON 转 Map<String,String>//map<String,String>转json HashMap<String,String> map = new HashMap<>(); map.put("姓名","张三"); map.put("性别","男"); String json = mapper.writeValueAsString(map); System.out.println("json字符串:" + json); //json转map<String,String> HashMap<String,String> map2 = mapper.readValue(json, HashMap.class); System.out.println("java对象:" + map2); 3. Map<String,User>转 JSON, JSON 转 Map<String,User>//map<String,User>转json HashMap<String,User> map = new HashMap<>(); map.put("黑马一班",new User("张三",23)); map.put("黑马二班",new User("李四",24)); String json = mapper.writeValueAsString(map); System.out.println("json字符串:" + json); //json转map<String,User> HashMap<String,User> map2 = mapper.readValue(json,new TypeReference<HashMap<String,User>>(){}); System.out.println("java对象:" + map2); 4. List<String>转 JSON, JSON 转 List<String>//List<String>转json ArrayList<String> list = new ArrayList<>(); list.add("张三"); list.add("李四"); String json = mapper.writeValueAsString(list); System.out.println("json字符串:" + json); //json转 List<String> ArrayList<String> list2 = mapper.readValue(json,ArrayList.class); System.out.println("java对象:" + list2); 5. List<User>转 JSON, JSON 转 List<User>//List<User>转json ArrayList<User> list = new ArrayList<>(); list.add(new User("张三",23)); list.add(new User("李四",24)); String json = mapper.writeValueAsString(list); System.out.println("json字符串:" + json); //json转List<User> ArrayList<User> list2 = mapper.readValue(json,new TypeReference<ArrayList<User>>(){}); System.out.println("java对象:" + list2);

    综合练习 一 搜索联想

    分析

    页面 1. 为用户名输入框绑定鼠标点击事件。 2. 获取输入的用户名数据。 3. 判断用户名是否为空。 4. 如果为空,则将联想提示框隐藏。 5. 如果不为空,则发送 AJAX 请求,并将响应的数据显示到联想框 控制层 1. 获取请求参数。 2. 调用业务层的模糊查询方法。 3. 将返回的数据转成 JSON,并响应给客户端

    综合练习 二 分页

    分析
    如何确定当前显示的数据已经浏览完毕 公式:(滚动条距底部的距离 + 滚动条上下滚动的距离 + 当前窗口的高度) >= 当前文档的高度 当前文档高度:存储10条数据,100px。 滚动条距底部的距离:1px。//避免出现相加达不到 当前文档的高度 //或者(滚动条上下滚动的距离 + 当前窗口的高度)>= 当前文档的高度*0.9 当前窗口的高度:80px。 滚动条上下滚动的距离:>=19px。 方法说明$(function(){})页面加载事件$(window)获取当前窗口对象scroll()鼠标滚动事件$(window).height()当前窗口的高度$(window).scrollTop()滚动条上下滚动的距离$(document).height()当前文档的高度

    实现 - ->服务器

    1. 获取请求参数。 2. 根据当前页码和每页显示的条数,调用业务层的方法,得到分页 Page 对象。 3. 封装 PageInfo 对象。 4. 将得到的数据转为 json。 5. 将数据响应给客户端。

    实现 - ->页面

    1. 引入分页插件的样式文件和 js 文件。 2. 定义当前页码和每页显示的条数。 3. 调用查询数据的函数。 4. 定义请求查询分页数据的函数,发起 AJAX 异步请求。 5. 为分页按钮区域设置页数参数(总页数和当前页)6. 为分页按钮绑定单击事件,完成上一页下一页查询功能。
    Processed: 0.010, SQL: 9