Ajax和Json
文章目录
一、AJAX
1. 概念
AJAX:ASynchronous JavaScript And XML 异步的JavaScript 和 XML
AJAX是一种在无需加载整个页面的情况下,能够更新部分网页的技术
通过在后台与服务器进行少量的数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个页面的情况下,对网页的某部分进行更新。
提升用户的体验
- 异步和同步
- 同步:客户端必须等待服务器的响应,在等待的期间,客户端不能做其他操作
- 异步:客户端不需要等到服务器端的响应。在服务器处理请求的过程中,客户端可以进行其他的操作
2. 实现方式
2.1 原生的JS实现方式(了解)
//1.创建核心对象
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
//2. 建立连接
/*
参数:
1. 请求方式:GET、POST
* get方式,请求参数在URL后边拼接。send方法为空参
* post方式,请求参数在send方法中定义
2. 请求的URL:
3. 同步或异步请求:true(异步)或 false(同步)
*/
xmlhttp.open("GET","ajaxServlet?username=tom",true);
//3.发送请求
xmlhttp.send();
//4.接受并处理来自服务器的响应结果
//获取方式 :xmlhttp.responseText
//什么时候获取?当服务器响应成功后再获取
//当xmlhttp对象的就绪状态改变时,触发事件onreadystatechange。
xmlhttp.onreadystatechange=function()
{
//判断readyState就绪状态是否为4,判断status响应状态码是否为200
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
//获取服务器的响应结果
var responseText = xmlhttp.responseText;
alert(responseText);
}
}
2.2 jQuery的实现方式
-
$.ajax()
-
语法:
$.ajax({键值对});
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>AJAX</title> <script src="jquery-3.3.1.min.js"></script> <script> function fun() { // 使用$.ajax()发送异步请求 $.ajax({ url: "../ajaxServlet", // 请求路径 type: "POST", //请求方式 // 第一种方式 // data: "username=tom&age=23", // 携带参数 // 第二种方式 data: {"username": "tom", "age": 23}, //JSON格式携带参数 // 响应成功后的回调函数 success: function (data) { alert(data); }, error: function () { alert("出错啦!") }, dataType: "text" }); } </script> </head> <body> <input type="button" value="发送异步请求" onclick="fun();"> <br> <input type="text"> </body> </html>
-
-
$.get():发送get请求
$.get(url, [data], [callback], [type])
- 参数:
- url:请求路径
- data:请求参数
- callback:回调函数
- type:响应结果的类型
- 参数:
-
$.post():发送post请求
jQuery.post(url, [data], [callback], [type])
二、JSON
1. 概念
JavaScript Object Notation JavaScript对象对象表示法
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
var p = {"name":"张三","age":23,"gender":"男"};
- json现在多用于存储数据和交换文本信息的语法
- 进行数据的传输
2. 语法
2.1 基本规则
- 数据在名称/值对中:json数据是由键值对构成的**(键值对)**
- 键用引号(单双都行)引起来,也可以不使用引号
- 值的取值类型
- 数字(整型或浮点型)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
{"people":[{""},{""}]}
- 对象(在花括号中)
{"address":{"province":"山东",...}}
- 数据由逗号分隔:多个键值对由逗号分隔
- 花括号保存对象:使用{}定义json 格式
- 方括号保存数组:[]
2.2 获取数据
-
json对象.键名
-
json对象[“键名”]
-
数组对象[索引]
-
遍历
var person = {"name": "张三", "age": 23, "gender": true}; var ps = [ {"name": "zhangsan", "age": 23, "gender": true}, {"name": "lisi", "age": 44, "gender": true}, {"name": "wangwu", "age": 17, "gender": false} ]; // 遍历 // 获取person对象中所有的键和值 // for in新欢 /*for (var key in person) { alert(key + ":" + person[key]); }*/ // 数组遍历 // 获取ps中的所有值 for (var i = 0; i < ps.length; ++i) { for (var key in ps[i]) { alert(key + ":" + ps[i][key]); } }
2.3 JSON数据和Java对象的相互转换
-
JSON解析器:
- 常见的解析器:Jsonlib,Gson,fastjson,jackson
-
JSON转换为Java对象
-
使用步骤
- 导入Jackson的相关jar包
- 创建Jackson核心对象,ObjectMapper
- 调用ObjectMapper的相关方法进行转换
readValue(Json字符串数据,Class)
-
-
Java对象转换为JSON
-
使用步骤
- 导入Jackson的相关jar包
- 创建Jackson核心对象,ObjectMapper
- 调用ObjectMapper的相关方法进行转换
writeValue(参数1,obj):
- 参数1:
- File:将obj对象转换为JSON字符串,并保存到文件中
- Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
- OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
- 参数2:对象
- 参数1:
writeValueAsString(obj):
将对象转换为json字符串
-
代码
package cn.edu.tjpu.test; import cn.edu.tjpu.domin.Person; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import java.io.File; import java.io.FileWriter; public class JacksonTest { /** * Java对象转换为JSON字符串 */ @Test public void test1() throws Exception { // 1.创建对象 Person person = new Person(); person.setName("张三"); person.setAge(23); person.setGender("男"); // 2.创建Jackson的核心对象 ObjectMapper mapper = new ObjectMapper(); // 3.调用方法转换 /* 转换方法: writeValue(参数1,obj): 参数1: File:将obj对象转换为JSON字符串,并保存到文件中 Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中 OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中 writeValueAsString(obj):将对象转换为json字符串 */ /*String json = mapper.writeValueAsString(person); System.out.println(json); // {"name":"张三","age":23,"gender":"男"}*/ // writeValue // 将数据写到文件中去 //mapper.writeValue(new File("d://a.txt"), person); // 将数据关联到writer中 mapper.writeValue(new FileWriter("d://b.txt"), person); } }
-
-
注解:
- @JsonIgnore:排除属性
- @JsonFormat:属性值的格式化
-
复杂的Java对象转换
- List集合:数组
- Map集合:对象的格式一致
三、案例
- 校验用户名是否存在
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
<script src="jquery-3.3.1.min.js"></script>
<script>
$(function () {
$("#username").blur(function () {
// var username = $("#username").val();
$.ajax({
url: "../registerServlet", // 请求路径
type: "POST", //请求方式
// 第一种方式
// data: "username=tom&age=23", // 携带参数
// 第二种方式
data: {"username": $("#username").val()}, //JSON格式携带参数
// 响应成功后的回调函数
success: function (data) {
if (data.userExist) {
// 1:已经存在
$("#reg-status").text(data.msg);
} else {
// 0:用户名不存在
$("#reg-status").text(data.msg);
}
},
dataType: "json"
});
});
/*$("#username").blur(function () {
alert($("#username").val())
});*/
});
</script>
</head>
<body>
<form action="">
用户名:<input type="text" id="username"><span id="reg-status"></span>
<br>
密码:<input type="password" id="password">
<br>
<input type="button" value="注册" id="btn_reg">
</form>
</body>
</html>
package cn.edu.tjpu.web.servlet;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 获取用户名
String username = request.getParameter("username");
Map<String, Object> map = new HashMap<>();
// 检查有没有该用户名
if ("zhangsan".equals(username)) {
map.put("userExist", true);
map.put("msg", "该用户已存在,请换一个!");
} else {
// 不存在
map.put("userExist", false);
map.put("msg", "用户名可用!");
}
// 将map转换为json
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getWriter(), map);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
存在问题:
- 服务器响应的数据,在客户端使用时,想要当做json数据格式使用
- $.get(tyep):将最后一个参数type指定为"json"
- 在服务器端设置MIME类型
response.setContentType("application/json;charset=utf-8");