JavaWeb学习|JSON与AJAX

学习材料声明

所有知识点都来自互联网,进行总结和梳理,侵权必删。
引用来源:尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版

JSON

JSON (JavaScript Object Notation)
是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,而且很多语言都提供了对
json 的支持(包括 C, C++, C#, Java, JavaScript, Perl, Python等)。 这样就使得 JSON
成为理想的数据交换格式。 json 是一种轻量级的数据交换格式。 轻量级指的是跟 xml 做比较。
数据交换指的是客户端和服务器之间业务数据的传递格式。

1.如何在javaScript中使用

定义

var jsonObj = {
	"key1":12,
	"key2":"abc",
	"key3":true,
	"key4":[11,"arr",false],
	"key5":{
	"key5_1" : 551,
	"key5_2" : "key5_2_value"
	},
	"key6":[{
	"key6_1_1":6611,
	"key6_1_2":"key6_1_2_value"
	},{
	"key6_2_1":6621,
	"key6_2_2":"key6_2_2_value"
	}]
};

使用

alert(typeof(jsonObj));// object json 就是一个对象
alert(jsonObj.key1); //12
alert(jsonObj.key2); // abc
alert(jsonObj.key3); // true
alert(jsonObj.key4);// 得到数组[11,"arr",false]
// json 中 数组值的遍历
for(var i = 0; i < jsonObj.key4.length; i++) {
alert(jsonObj.key4[i]);
}
alert(jsonObj.key5.key5_1);//551
alert(jsonObj.key5.key5_2);//key5_2_value
alert( jsonObj.key6 );// 得到 json 数组
// 取出来每一个元素都是 json 对象
var jsonItem = jsonObj.key6[0];
// alert( jsonItem.key6_1_1 ); //6611
alert( jsonItem.key6_1_2 );

json 的存在有两种形式。
一种是:对象的形式存在,我们叫它 json 对象。
一种是:字符串的形式存在,我们叫它 json 字符串。
一般我们要操作 json 中的数据的时候,需要 json 对象的格式。
一般我们要在客户端和服务器之间进行数据交换的时候,使用 json 字符串。
JSON.stringify() 把 json 对象转换成为 json 字符串
JSON.parse() 把 json 字符串转换成为 json 对象

常用方法

// 把 json 对象转换成为 json 字符串
var jsonObjString = JSON.stringify(jsonObj); // 特别像 Java 中对象的 toString
alert(jsonObjString)
// 把 json 字符串。转换成为 json 对象
var jsonObj2 = JSON.parse(jsonObjString);
alert(jsonObj2.key1);// 12
alert(jsonObj2.key2);// abc

2.如何在java中使用:JavaBean的转换。这里涉及了List和Map

to和from
这里导入的包是谷歌的GSON
javaBean和json的互换

@Test
public void test1(){
	Person person = new Person(1,"国哥好帅!");
	// 创建 Gson 对象实例
	Gson gson = new Gson();
	// toJson 方法可以把 java 对象转换成为 json 字符串
	String personJsonString = gson.toJson(person);
	System.out.println(personJsonString);
	// fromJson 把 json 字符串转换回 Java 对象
	// 第一个参数是 json 字符串
	// 第二个参数是转换回去的 Java 对象类型
	Person person1 = gson.fromJson(personJsonString, Person.class);
	System.out.println(person1);
}

List和json的互换

// 1.2.2、List 和 json 的互转
@Test
public void test2() {
	List<Person> personList = new ArrayList<>();
	personList.add(new Person(1, "国哥"));
	personList.add(new Person(2, "康师傅"));
	Gson gson = new Gson();
	// 把 List 转换为 json 字符串
	String personListJsonString = gson.toJson(personList);
	System.out.println(personListJsonString);
	List<Person> list = gson.fromJson(personListJsonString, new PersonListType().getType());
	System.out.println(list);
	Person person = list.get(0);
	System.out.println(person);
}

这里需要自己创建一个PersonListType类。或者干脆使用内部类。

public class PersonListType extends TypeToken<List<Person>> {
}

Map和json的互换

/ 1.2.3、map 和 json 的互转
@Test
public void test3(){
	Map<Integer,Person> personMap = new HashMap<>();
	personMap.put(1, new Person(1, "国哥好帅"));
	personMap.put(2, new Person(2, "康师傅也好帅"));
	Gson gson = new Gson();
	// 把 map 集合转换成为 json 字符串
	String personMapJsonString = gson.toJson(personMap);
	System.out.println(personMapJsonString);
	// Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString, new
	PersonMapType().getType());
	Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString, new
	TypeToken<HashMap<Integer,Person>>(){}.getType());
	System.out.println(personMap2);
	Person p = personMap2.get(1);
	System.out.println(p);
}

AJAX请求

AJAX 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。
ajax 是一种浏览器通过 js 异步发起请求,局部更新页面的技术。
Ajax 请求的局部更新,浏览器地址栏不会发生变化
局部更新不会舍弃原来页面的内容

这里的异步很重要哦,可以很有效地提高用户体验感。
整个使用分四步咯:

<script type="text/javascript">
	// 在这里使用 javaScript 语言发起 Ajax 请求,访问服务器 AjaxServlet 中 javaScriptAjax
	function ajaxRequest() {
		// 1、我们首先要创建 XMLHttpRequest
		var xmlhttprequest = new XMLHttpRequest();
		// 2、调用 open 方法设置请求参数
		xmlhttprequest.open("GET","http://localhost:8080/16_json_ajax_i18n/ajaxServlet?action=javaScriptAjax",true);
		// 4、在 send 方法前绑定 onreadystatechange 事件,处理请求完成后的操作。
		xmlhttprequest.onreadystatechange = function(){
			if (xmlhttprequest.readyState == 4 && xmlhttprequest.status == 200) {
				var jsonObj = JSON.parse(xmlhttprequest.responseText);
				// 把响应的数据显示在页面上
				document.getElementById("div01").innerHTML = "编号:" + jsonObj.id + " , 姓名:" +
				jsonObj.name;
			}
		}
		// 3、调用 send 方法发送请求
		xmlhttprequest.send();
	}
</script>

1.在jQuery中如何请求

$("#ajaxBtn").click(function(){
	$.ajax({
		url:"http://localhost:8080/16_json_ajax_i18n/ajaxServlet",
		// data:"action=jQueryAjax",
		data:{action:"jQueryAjax"},
		type:"GET",
		success:function (data) {
		// alert("服务器返回的数据是:" + data);
		// var jsonObj = JSON.parse(data);
		$("#msg").html("编号:" + data.id + " , 姓名:" + data.name);
		},
		dataType : "json"
	});
});
// ajax--get 请求
$("#getBtn").click(function(){
	$.get("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQueryGet",function (data) {
	$("#msg").html(" get 编号:" + data.id + " , 姓名:" + data.name);},"json");
});
// ajax--post 请求
$("#postBtn").click(function(){
	$.post("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQueryPost",function (data){
	$("#msg").html(" post 编号:" + data.id + " , 姓名:" + data.name);
	},"json");
});
// ajax--getJson 请求
$("#getJSONBtn").click(function(){
	$.getJSON("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQueryGetJSON",function
	(data) {$("#msg").html(" getJSON 编号:" + data.id + " , 姓名:" + data.name);});
});

表单序列化 serialize()
serialize()可以把表单中所有表单项的内容都获取到,并以 name=value&name=value 的形式进行拼接。

在这里插入代码片// ajax 请求
$("#submit").click(function(){
	// 把参数序列化
	$.getJSON("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQuerySerialize&" +
	$("#form01").serialize(),function (data) {
	$("#msg").html(" Serialize 编号:" + data.id + " , 姓名:" + data.name);
	});
});

书城项目中的实践

1.使用 AJAX 验证用户名是否可用

在这里插入图片描述

protected void ajaxExistsUsername(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	// 获取请求的参数 username
	String username = req.getParameter("username");
	// 调用 userService.existsUsername();
	boolean existsUsername = userService.existsUsername(username);
	// 把返回的结果封装成为 map 对象
	Map<String,Object> resultMap = new HashMap<>();
	resultMap.put("existsUsername",existsUsername);
	Gson gson = new Gson();
	String json = gson.toJson(resultMap);
	resp.getWriter().write(json);
}
$("#username").blur(function () {
	//1 获取用户名
	var username = this.value;
	$.getJSON("http://localhost:8080/book/userServlet","action=ajaxExistsUsername&username=" + username,function (data{
		if (data.existsUsername) {
			$("span.errorMsg").text("用户名已存在!");
			} else {
			$("span.errorMsg").text("用户名可用!");
		}
	});
});

2.使用 AJAX 修改把商品添加到购物车

完全和第一点是一样的思路。
在这里插入图片描述
自己难以完成是如何修改对应的位置。

protected void ajaxAddItem(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
	// 获取请求的参数 商品编号
	int id = WebUtils.parseInt(req.getParameter("id"), 0);
	// 调用 bookService.queryBookById(id):Book 得到图书的信息
	Book book = bookService.queryBookById(id);
	// 把图书信息,转换成为 CartItem 商品项
	CartItem cartItem = new CartItem(book.getId(),book.getName(),1,book.getPrice(),book.getPrice());
	// 调用 Cart.addItem(CartItem);添加商品项
	Cart cart = (Cart) req.getSession().getAttribute("cart");
	if (cart == null) {
		cart = new Cart();
		req.getSession().setAttribute("cart",cart);
	}
	cart.addItem(cartItem);
	System.out.println(cart);
	// 最后一个添加的商品名称
	req.getSession().setAttribute("lastName", cartItem.getName());
	//6、返回购物车总的商品数量和最后一个添加的商品名称
	Map<String,Object> resultMap = new HashMap<String,Object>();
	resultMap.put("totalCount", cart.getTotalCount());
	resultMap.put("lastName",cartItem.getName());
	Gson gson = new Gson();
	String resultMapJsonString = gson.toJson(resultMap);
	resp.getWriter().write(resultMapJsonString);
}
<div style="text-align: center">
	<c:if test="${empty sessionScope.cart.items}">
	<%--购物车为空的输出--%>
		<span id="cartTotalCount"> </span>
		<div>
			<span style="color: red" id="cartLastName">当前购物车为空</span>
		</div>
		</c:if>
		<c:if test="${not empty sessionScope.cart.items}">
		<%--购物车非空的输出--%>
		<span id="cartTotalCount">您的购物车中有 ${sessionScope.cart.totalCount} 件商品</span>
		<div>
		您刚刚将<span style="color: red" id="cartLastName">${sessionScope.lastName}</span>加入到了购
		物车中
		</div>
	</c:if>
</div>
<Script type="text/javascript">
	$(function () {
		// 给加入购物车按钮绑定单击事件
		$("button.addToCart").click(function () {
		/**
		* 在事件响应的 function 函数 中,有一个 this 对象,这个 this 对象,是当前正在响应事件的 dom 对象
		* @type {jQuery}
		*/
		var bookId = $(this).attr("bookId");
		// location.href = "http://localhost:8080/book/cartServlet?action=addItem&id=" + bookId;
		// 发 ajax 请求,添加商品到购物车
			$.getJSON("http://localhost:8080/book/cartServlet","action=ajaxAddItem&id=" +
			bookId,function (data) {
			$("#cartTotalCount").text("您的购物车中有 " + data.totalCount + " 件商品");
			$("#cartLastName").text(data.lastName);
			})
		});
	});
</Script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/398352.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

两分钟秒懂Android控件设置

导言 本文从整体到局部,从常用布局(layout)到控件的设置,层层递进,一定要从前往后依次看 目录 1.常用布局方式 1.1 ConstraintLayout 约束布局 1.2 LinearLayout 线性布局 1.3 TableLayout 表格布局 1.4 GridLayout 瀑布布局 2.关于控件属性整合 2.1 放置位置 2.2 如…

cubeIDE之串口空闲中断注意事项

1&#xff1a;在配置完成后的main函数中不可使能接收中断 // __HAL_UART_ENABLE_IT(&huart4, UART_IT_RXNE);//接收中断__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);//空闲中断HAL_UART_Receive_DMA(&huart4,rx4_buffer, 255);//使能MDA接收HAL_UART_Transmit(&…

Linux系统中HTTP隧道的搭建与配置步骤:穿越网络的“魔法隧道”

在Linux系统中搭建HTTP隧道&#xff0c;就像是开启了一条穿越网络的“魔法隧道”。这条隧道能让你的数据在网络中自由穿梭&#xff0c;无论是远程办公还是数据同步&#xff0c;都能变得轻松自在。下面&#xff0c;就让我们一起探索如何搭建这条神奇的“魔法隧道”吧&#xff01…

2024-2-20-IO进程线程作业

1> 源代码&#xff1a; #include <myhead.h>int main(int argc, const char *argv[]) {pid_t pid -1;FILE *src NULL;FILE *dest NULL;if ((src fopen("./base.txt", "r")) NULL){perror("fopen error");return -1;}fseek(src, …

阿赵UE学习笔记——15、灯光的移动性概念和构建光照信息

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎&#xff0c;这次来学习一下UE里面灯光的移动性概念和构建光照信息。 1、灯光移动性 打开一个带有灯光的场景 在大纲面板里面找到其中一个灯光&#xff1a; 会发现灯光的细节面板里面&#xff0c;…

Windows 自带的 Linux 子系统(WSL)安装与使用

WSL官网安装教程&#xff1a; https://learn.microsoft.com/zh-cn/windows/wsl/install Windows 自带的Linux子系统&#xff0c;比用VM什么的香太多了。可以自己看官方教程&#xff0c;也可以以下步骤完成。 如果中间遇到我没遇到的问题百度&#xff0c;可以在评论区评论&#…

【Python】【VS Code】VS Code中python.json和setting.json文件配置说明

目录 1. python.json配置 2. setting.json配置 3. 解决中文乱码 4. 实现效果 1. python.json配置 python.json 获取步骤&#xff1a;文件 -> 首选项 -> 配置用户代码片段 -> python 此为VS Code的头文件设置&#xff0c;复制以下内容到 python.json {"HEADER…

【字符串题目讲解】一文理解 Manacher Algoirth(马拉车算法)——以洛谷 P3805 和 P5446 为例

M a n a c h e r A l g o r i t h m \mathrm{Manacher\ Algorithm} Manacher Algorithm Manacher 算法主要是解决怎样的问题呢&#xff0c;其实是求解最长的回文串&#xff0c;但是只能找到长度为奇数的回文串&#xff0c;不过可以通过转化使得能够求解任意长度的回文串。 例…

【9】知识存储

一、图数据库neo4j Neo4j是一个高性能的,NOSQL图形数据库&#xff0c;它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。单节点的服务器可承载上亿级的节点和关系&#xff0c;单节点性能不够时也可进行分布式集群部…

基于bloomz-7b指令微调的中文医疗问诊大模型,实现智能问诊、医疗问答

基于bloomz-7b指令微调的中文医疗问诊大模型&#xff0c;实现智能问诊、医疗问答 码源见文末 1.项目简介 本项目开源了基于医疗指令微调的中文医疗问诊模型&#xff1a;明医 (MING)。目前模型的主要功能如下&#xff1a; 医疗问答&#xff1a;对医疗问题进行解答&#xff0…

python 多线程+队列的简单应用

在实际处理需求的过程中&#xff0c;博主比较偏爱使用多线程threading 队列queue的方式 去开发代码。 &#xff08;本文注重的是搭建模板框架&#xff0c;仅供参考&#xff09; 举例&#xff1a; 以豆瓣电影的排行为例&#xff0c;写个简单的demo。 豆瓣链接&#xff1a;ht…

基于用Python对电商销售数据分析展示项目

项目背景 假设您有一个电商网站的销售数据集&#xff0c;包含用户购买记录、产品信息和销售时间等信息。您希望通过数据分析来找出哪些产品销售最好&#xff0c;以及哪些用户群体对哪些产品更感兴趣。 目录 项目背景 项目流程 数据收集和导入 数据集示例&#xff08;CSV格式…

IO 作业 24/2/20

一、思维导图 二、习题 #include <myhead.h> int main(int argc, const char *argv[]) {FILE *fpNULL;FILE *fqNULL;pid_t pidfork();if(pid>0){if((fpfopen("./text.txt","r"))NULL){perror("fopen error");return -1;} if((f…

【2024软件测试面试必会技能】Jmeter_性能测试(3):性能测试脚本的制作和调试

Charles Jmeter的性能测试脚本的制作和调试 以PHP论坛为例&#xff1a;http://47.107.178.45/phpwind/ Charles抓包 1、charles设置过滤&#xff1b;可参考&#xff1a;https://www.cnblogs.com/YouJeffrey/p/15334939.html 2、对于抓包操作进行备注 3、去掉资源文件&…

AS-V1000 视频监控平台产品介绍:客户端功能介绍(四)

目 录 一、引言 1.1 AS-V1000视频监控平台介绍 1.2平台服务器配置说明 二、软件概述 2.1 客户端软件用途 2.2 客户端功能 三、客户端功能说明 3.1告警管理 3.1.1告警联动 &#xff08;1&#xff09;告警联动显示 &#xff08;2&#xff09;告警联动处理 3…

Packet Tracer - 配置 IPv4 和 IPv6 接口

地址分配表 目标 第 1 部分&#xff1a;配置 IPv4 编址并验证连接第 2 部分&#xff1a;配置 IPv6 编址并验证连接背景信息 路由器 R1 和 R2 分别有两个 LAN。 您的任务是在每台设备上配置合适的编址并验证 LAN 之间的连接。 注&#xff1a;用户 EXEC 密码是 cisco。 特权 E…

单片机学习笔记---红外遥控红外遥控电机调速(完结篇)

目录 低电平触发中断和下降沿触发中断的区别 红外遥控 Int0.c Int.h Timer0.c Timer0.h IR.c IR.h main.c 红外遥控电机调速 Timer1.c Timer.h Motor.c Motor.h main.c 上一节讲了红外发送和接收的工作原理&#xff0c;这一节开始代码演示&#xff01; 提前说…

软件安装遇到bug、报错不知道怎么解决?赶紧收藏起来!

前言 本文举例了几个常见的软件工具使用问题&#xff0c;文末会提供一些我自己整理和使用的工具资料 。 "在追逐零 Bug 的路上&#xff0c;我们不断学习、改进&#xff0c;更加坚定自己的技术信念。让我们相信&#xff0c;每一个 Bug 都是我们成长的机会。" 一、VM…

Microsoft Visio 摄像机图标

Microsoft Visio 摄像机图标 1. 更多形状 -> 搜索形状2. 摄像机References 1. 更多形状 -> 搜索形状 2. 摄像机 ​​​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

2024云服务器ECS新老用户优惠价格表,收费更新

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…