JSON、Ajax
目录
- 一、JSON
- 1、JSON定义
- 2、JSON数据格式
- 二、Ajax
- 1、什么是Ajax
- 2、什么是同步,什么是异步
- 三、JSON数据和Java对象的相互转换
- 四、练习
- 1、登录
- 2、省市区三级联动
一、JSON
1、JSON定义
定义:是一种轻量级的数据交换格式
JSON是JavaScript Object Notation缩写
特点:
1.易于程序员阅读和编写。
2.易于计算机解析和生成。
3.其实是javascript的子集:原生javascript支持JSON
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>var student = {name: 'zhansgan',age: 23,study: function() {console.log(this.name + '的年龄是' + this.age + '岁');}};console.log(student.name);student.study();</script>
</head>
<body>
</body>
</html>
JSON是一种与语言无关的数据交换的格式,作用:
1、使用ajax进行前后台数据交换
2、移动端与服务端的数据交换
2、JSON数据格式
JSON的语法规则十分简单,可称得上“优雅完美”,总结起来有:
JSON有两种结构:
1、对象格式:{“key1”:obj1, “key2”:obj2, “key3”:obj3…}
2、数组/集合格式: [obj1,obj2,obj3…]
注意:JSON的key是字符串,JSON的value是任意类型
元素值可具有的类型:string, number, object, array, true, false, null
1、对象(Object)用大括号({})表示
Student:
{"id" : 12,"name" : "java1711","age" : 20,"gender" : "男"
}
2、数组(Array)用方括号([])表示:
List: [{},{},{}]
[{"id" : 12,"name" : "java1711","age" : 20,"gender" : "男"},{"id" : 13,"name" : "java1712","age" : 21,"gender" : "女"}
]
二、Ajax
1、什么是Ajax
Ajax: asynchronous javascript and xml (异步js和xml)
synchronized: 同步
其是可以与服务器进行(异步/同步)交互的技术之一
Ajax的语言载体是JavaScript
最大特点:异步请求,不刷新整个页面,只刷新局部也叫局部刷新。
2、什么是同步,什么是异步
同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态
异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随意做其他事情,不会被卡死
易懂的理解:
1.同步请求:你现在传输,我要亲眼看着你传输完成,我才去做别的事。
2.异步请求:你传输吧,我去做我的事了,你传输完了告诉我一声。
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html>
<head><title>Title</title>
</head>
<body><button onclick="ajaxGet()">ajax get</button><button onclick="ajaxPost()">ajax post</button><button onclick="ajax()">ajax</button><script src="/static/jquery-2.1.4.js"></script><script>function ajaxGet(){//$.get(url, [data], [callback], [type]) 后面三个是可选的可以没有//url为前台往后台发送的请求地址//data为前台往后台发送的数据//callback为回调函数//type为后台希望返回的数据类型$.get("/ajax1",{'name': "张三1"},function (jsonObj) {console.log(jsonObj);//打印数据为{name: '李四1', age: 23}//通过打印数据可知这里的jsonObj其实已经转换为了js对象(name没有加引号)},'json');}function ajaxPost(){$.post(//$.post(url, [data], [callback], [type]) 后面三个是可选的可以没有"/ajax1",{'name': "张三2"},function (jsonObj){console.log(jsonObj);},'json');}function ajax(){//$.ajax( { option1:value1,option2:value2... } ); 语法:$.ajax({键值对});$.ajax({async: true,//不写默认是true,发生异步请求url: '/ajax1',type: 'GET',data: {'name': '王五'},success: function (jsonObj){console.log(jsonObj);},dataType: 'json'});}</script></body>
</html>
@WebServlet("/ajax1")
public class Ajax1Servlet extends HttpServlet {//浏览器发送的get请求默认访问这个doGet@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Ajax1Servlet.doGet");String name = req.getParameter("name");System.out.println(name);//转义:转换你原来的意思// {"name": "李四","age":23}resp.setContentType("text/html;charset=UTF-8");resp.getWriter().write("{\"name\": \"李四\",\"age\":23}");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Ajax1Servlet.doPost");String name = req.getParameter("name");System.out.println(name);try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}//转义:转换你原来的意思// {"name": "李四","age":23}resp.setContentType("text/html;charset=UTF-8");resp.getWriter().write("{\"name\": \"李四2\",\"age\":24}");}
}
三、JSON数据和Java对象的相互转换
常见的JSON解析器:Jsonlib,Gson,fastjson,jackson(SpringMVC内置的解析器)
1、导入jackson的相关jar包
2、创建Jackson核心对象 ObjectMapper
3、调用ObjectMapper的相关方法进行转换
3.1、JSON转为Java对象
readValue(json字符串数据,Class)
3.2、Java对象转换JSON
writeValueAsString(obj):将对象转为json字符串
public class Person {private Integer id;private String name;@JsonIgnoreprivate Integer age;private String gender;@JsonFormat(pattern = "yyyy-MM-dd")private Date birthday; // java.util.Date
} public class JSONTest {//Java对象转为JSON字符串@Testpublic void test1() throws JsonProcessingException {//1、创建Person对象Person person = new Person();person.setId(2);person.setName("张三");person.setAge(23);person.setGender("男");person.setBirthday(new Date());//2、创建Jackson核心对象 ObjectMapperObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(person);//{"id":2,"name":"张三","gender":"男","birthday":"2025-03-08"}System.out.println(json);}//演示 JSON字符串转为Java对象@Testpublic void test3() throws IOException {// 1、创建一个json字符串// String json = "{"id":2,"name":"张三","gender":"男","birthday":"2025-03-08"}";//转义String json = "{\"id\":2,\"name\":\"张三\",\"gender\":\"男\",\"birthday\":\"2025-03-08\"}";//2、创建ObjectMapperObjectMapper mapper = new ObjectMapper();//3、json字符串转换为java对象Person person = mapper.readValue(json, Person.class);//Person{id=2, name='张三', age=null, gender='男', birthday=Sat Mar 08 08:00:00 CST 2025}System.out.println(person);}
}
四、练习
1、登录
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><form>用户名<input type="text" name="name" id="nameId"><span id="nameSpanId"></span><br>密码<input type="text" name="password" id="passwordId"><br><input type="submit" value="注册"></form><script src="/static/jquery-2.1.4.js" type="text/javascript" charset="utf-8"></script><script>//页面加载完再执行的function$(function () {$('#nameId').blur(function (){//this为当前失去焦点的输入框,为JSDOM对象$.post('/ajax2',//{'name' : this.value()},{'name' : $(this).val()},function (jsonObj){console.log(jsonObj);//{exist: true, msg: '此用户已经存在,请更换一个'}//{exist: false, msg: '该用户可用'}if (jsonObj.exist){$('#nameSpanId').html(jsonObj.msg);$('#nameSpanId').css('color','red');}else {$('#nameSpanId').html(jsonObj.msg);$('#nameSpanId').css('color','green');}},'json')})})</script>
</body>
</html>
package com.easy.web.servlet;import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@WebServlet("/ajax2")
public class Ajax2Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Ajax2Servlet.service");String name = req.getParameter("name");System.out.println(name);//用map保存exist、msg信息Map<String,Object> map = new HashMap<>();//先不连接数据库,简单认为tom为已存在的用户//{exist: true, msg: '此用户已经存在,请更换一个'}//{exist: false, msg: '该用户可用'}if ("tom".equalsIgnoreCase(name)){map.put("exist",true);map.put("msg","此用户已经存在,请更换一个");}else {map.put("exist",false);map.put("msg","该用户可用");}resp.setContentType("text/html;charset=UTF-8");//创建Jackson核心对象 ObjectMapper//调用ObjectMapper的相关方法进行json数据格式和java对象的转换ObjectMapper objectMapper = new ObjectMapper();//将java对象转换为json格式objectMapper.writeValue(resp.getWriter(),map);}
}
2、省市区三级联动
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>省份:<select id="provinceId"><option>---请选择省份--</option></select>城市:<select id="cityId"><option>---请选择城市--</option></select>区县:<select id="areaId"><option>---请选择区县--</option></select><script src="/static/jquery-2.1.4.js" type="text/javascript" charset="utf-8"></script><script>$(function () {$.post("/ajax3?method=selectProvince",function (jsonObj) {//遍历province作为option追加到provinceId中//jsonObj: [{id: 220000, name: '吉林省'},{id: 230000, name: '黑龙江省'}] jsonObj为集合对象console.log(jsonObj);$(jsonObj).each(function () {//this {id: 220000, name: '吉林省'}//当 <option> 标签所在的 <select> 表单被提交时,服务器接收到的是选中项的 value 属性值,而不是标签中间的文本内容//如果未设置 value 属性,浏览器会默认将标签内的文本内容作为提交值$('#provinceId').append('<option value="'+this.id+'">'+this.name+'</option>')})},'json')$('#provinceId').change(function () {//this为JSDOM对象$.post("/ajax3?method=selectCity",{"provinceId":$(this).val()},function (jsonObj) {console.log(jsonObj);//清除上一次追加的option//选中cityId下的option,“:”为筛选的意思$('#cityId option:gt(0)').remove();//$('#cityId option:not(:first)').remove();$(jsonObj).each(function () {$('#cityId').append('<option value="'+this.id+'">'+this.name+'</option>')})},'json')})$('#cityId').change(function () {//this为JSDOM对象$.post("/ajax3?method=selectArea",{"cityId":$(this).val()},function (jsonObj) {console.log(jsonObj);//清除上一次追加的option//选中cityId下的option,“:”为筛选的意思$('#areaId option:gt(0)').remove();//$('#cityId option:not(:first)').remove();$(jsonObj).each(function () {$('#areaId').append('<option value="'+this.id+'">'+this.name+'</option>')})},'json')})})</script>
</body>
</html>
package com.easy.web.servlet;import com.easy.web.pojo.Area;
import com.easy.web.pojo.City;
import com.easy.web.pojo.Province;
import com.easy.web.util.JDBCUtil;
import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;@WebServlet("/ajax3")
public class Ajax3Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Ajax3Servlet.service");String method = req.getParameter("method");switch (method){case "selectProvince":selectProvince(req,resp);break;case "selectCity":selectCity(req,resp);break;case "selectArea":selectArea(req,resp);break;}}private void selectArea(HttpServletRequest req, HttpServletResponse resp) throws IOException {System.out.println("Ajax3Servlet.selectArea");String cityId = req.getParameter("cityId");Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;List<Area> list = new ArrayList<>();try {connection = JDBCUtil.getConnection();String sql = "select id,name from tm_area where city_id=?";statement = connection.prepareStatement(sql);statement.setInt(1, Integer.parseInt(cityId));System.out.println(statement);resultSet = statement.executeQuery();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");Area area = new Area(id,name);list.add(area);}} catch (SQLException e) {throw new RuntimeException(e);}resp.setContentType("text/html;charset=UTF-8");ObjectMapper mapper = new ObjectMapper();mapper.writeValue(resp.getWriter(), list);}private void selectCity(HttpServletRequest req, HttpServletResponse resp) throws IOException {System.out.println("Ajax3Servlet.selectCity");String provinceId = req.getParameter("provinceId");Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;List<City> list = new ArrayList<>();try {connection = JDBCUtil.getConnection();String sql = "select id,name from tm_city where province_id=?";statement = connection.prepareStatement(sql);statement.setInt(1, Integer.parseInt(provinceId));System.out.println(statement);resultSet = statement.executeQuery();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");City city = new City(id, name);list.add(city);}} catch (SQLException e) {throw new RuntimeException(e);}resp.setContentType("text/html;charset=UTF-8");ObjectMapper mapper = new ObjectMapper();mapper.writeValue(resp.getWriter(), list);}private void selectProvince(HttpServletRequest req, HttpServletResponse resp) throws IOException {System.out.println("Ajax3Servlet.selectProvince");Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;List<Province> list = new ArrayList<>();try {connection = JDBCUtil.getConnection();String sql = "select id,name from tm_province";statement = connection.prepareStatement(sql);System.out.println(statement);resultSet = statement.executeQuery();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");Province province = new Province(id, name);list.add(province);}} catch (SQLException e) {throw new RuntimeException(e);}//与Ajax2Servlet同样的操作resp.setContentType("text/html;charset=UTF-8");ObjectMapper mapper = new ObjectMapper();mapper.writeValue(resp.getWriter(), list);}
}