JavaWeb之AJAX
前言
这一节讲JavaWeb之AJAX
1.概述
以前我们在servlet中得到数据,必须通过域给jsp,然后jsp在响应给浏览器
纯html不能获取servlet返回数据
所以我们用jsp
但是现在我们可以同AJAX给返回数据了
我们可以在sevlet中直接通过AJAX返回给浏览器
html中的JavaScript就可以获取数据了
通过静态的html页面和AJAX联合起来,这个比较主流
这样html和AJAX主要由前端来完成就可以了
后面的我们后端来完成
因为jsp要由服务器启动,所以还是要后端来写,无法分工
这个搜索的时候,我们没有刷新,它也会局部刷新,在数据库中打出的这些数据
或者我们输入用户名,鼠标一离开就会显示有没有这个用户
这种局部刷新就是异步
这里的异步就是服务器处理的三秒钟内,我们不用再浏览器等待,我们还可以干其他事情
同步左上角是会刷新的,异步就不会刷新显示出来
这个对于用户来说,没什么感知
2. 快速入门
第一就是后端代码,其余的都是前端代码
这个就是后端代码
Ajax是JavaScript的代码,要写在html里面去
https://www.w3school.com.cn/b.asp
这个网站有相关的教程
异步是默认的,所以可以不用写
这个就是全路径
点的是下一页
但我们这个不能运行出我们想要的结果,可能是第一步创建搞错了
<script>//1.创建核心对象,不用记,直接复制var xhttp;if (window.XMLHttpRequest) {xhttp = new XMLHttpRequest();}else{xhttp = new ActiveXObject("Microsoft.XMLHTTP");}//2.发送请求xhttp.open("GET", "http://localhost:8080/brand-demo/ajaxServlet");//第二个参数就是你要请求的资源路径,异步的话,资源要写成全路径:http://localhost:8080/brand-demo/ajaxServlet//因为将来前端就是html+ajax开发了,前端的工程和后端的工程都不在一个服务器上部署,所以访问的话就要写绝对路径了,不要写相对路径了xhttp.send();//3.获取响应xhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {// this.responseText;//获取数据,就是我们返回的hello ajax~数据alert(this.responseText);//在一个弹框里面打印}};</script>
我们这个修改后就可以了
那个servlet的xhr就是异步请求的意思
或者直接点这个上面的XHR,也可以筛选出来我们需要的异步请求
所以所谓AJAX其实也就是JavaScript里面可以获取响应数据的代码
3. 案例-验证用户是否存在
3.1 后端
//1.接收用户名String username = request.getParameter("username");//2.调用service查询User对象,,,,,现在还没写service,我们只是模拟一下boolean flag = true;//相当于用户名存在//3.响应标记response.getWriter().write(""+flag);
3.2 前端
注册页面
这个注册页面可以去我的Gitee里面去找
这里我就直接复制了
而且这个不重要
这个就是我们以前的那个页面
我们就可以对这个username绑定一个onblur事件
修改style那里
<script>//1.给用户名输入框绑定 失去焦点事件document.getElementById("username").onblur=function(){//2.发送ajax//获取用户名的值 这个是给自己的输入框绑定的onblur事件,直接可以thisvar username=this.value;//2.1.创建核心对象,不用记,直接复制var xhttp;if (window.XMLHttpRequest) {xhttp = new XMLHttpRequest();}else{xhttp = new ActiveXObject("Microsoft.XMLHTTP");}//2.2.发送请求xhttp.open("GET", "http://localhost:8080/brand-demo/selectUserServlet?username="+username);//把名字通过get传给servletxhttp.send();//2.3.获取响应-------》获取的是对应servlet的响应xhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {if(this.responseText == "true"){//responseText获取的是字符串//用户名存在,显示提示信息document.getElementById("username_err").style.display='';//显示的话,display就是空字符串就可以了}else{//用户名不存在,清除提示信息-----》把style的属性设置一下document.getElementById("username_err").style.display='none';//这个就是设置style为不展示}}};}
</script>
因为我们后台展示的是true,所以不管我们写什么,都是用户名已存在
光标离开就会发送一次请求,而且请求还是xhr的异步请求
而且这个请求响应的数据还是true
4. Axios异步框架
4.1 基本使用
axios文件也是直接复制就可以了
在创建一个html文件
02-axios-demo.html:
AxiosServlet:
02-axios-demo.html:
<!--引入axios的源码文件-->
<script src="js/axios-0.18.0.js"></script>
<script>//1.getaxios({method:"get",// url就是我们请求的路径,就是servlet的路径 .then就是来获取响应的url:"http://localhost:8080/ajax-demo/axiosServlet?username=zhangsan"}).then(function(resp){alert(resp.data);//这个就能获取到响应的数据---》hello axios})
</script>
这样我们就可以了
02-axios-demo.html:
axios({method:"post",// url就是我们请求的路径,就是servlet的路径 .then就是来获取响应的url:"http://localhost:8080/ajax-demo/axiosServlet",data:"username=zhangsan"}).then(function(resp){alert(resp.data);// //这个就能获取到响应的数据---》hello axios})
这样就是post的了
这个就要比原生的ajax代码要简化很多
4.2 请求方式别名
axios.get("http://localhost:8080/ajax-demo/axiosServlet?username=zhangsan").then(function (res) {alert(res.data);})
axios.post("http://localhost:8080/ajax-demo/axiosServlet","username=zhangsan").then(function (res) {alert(res.data);})
5. JSON
所以我们响应数据都用JSON了
5.1 基本语法
<script>//定义jsonvar json={"name":"zhangsan","age":23,"addr":["北京","上海","西安"]};//获取值alert(json.name);</script>
5.2 JSON数据和Java对象转换
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency>
下面这个是user对象
测试方法
//1.将Java对象转换为JSON字符串User user = new User();user.setId(1);user.setUsername("zhangsan");user.setPassword("123");String jsonString= JSON.toJSONString(user);System.out.println(jsonString);
User u = JSON.parseObject("{\"id\":1,\"password\":\"123\",\"username\":\"zhangsan\"}", User.class);System.out.println(u);
6. 案例
6.1 查询所有
现在我们导入一个工程
brand.html:
<script>//1.当页面加载完成之后,发送ajax请求//创建一个窗口,并添加事件,这个事件是在整个页面加载完成之后,自动加载的window.onload = function () {//2.发送ajax请求axios({method: 'get',url:""}).then(function (resp) {})}
</script>
SelectAllServlet:
//1.调用service查询List<Brand> brands = brandService.selectAll();//2.将集合转换为JSON数据 序列化String jsonString = JSON.toJSONString(brands);//3.响应数据response.setContentType("text/json;charset=utf-8");//处理中文response.getWriter().write(jsonString);
测试一下
brand.html:
测试一下
因为原来的表格一旦完成就马上执行这个了,所以看不到原来的表格
<script src="js/axios-0.18.0.js">
</script><script>//1.当页面加载完成之后,发送ajax请求//创建一个窗口,并添加事件,这个事件是在整个页面加载完成之后,自动加载的window.onload = function () {//2.发送ajax请求axios({method: 'get',url:"http://localhost:8080/brand1-demo/selectAllServlet"}).then(function (resp) {//获取数据,遍历数组let brands = resp.data;//这个就是数组,,,,,也是JSON数据 直接点加Data名称就可以获得数据let tableData=" <tr>\n" +" <th>序号</th>\n" +" <th>品牌名称</th>\n" +" <th>企业名称</th>\n" +" <th>排序</th>\n" +" <th>品牌介绍</th>\n" +" <th>状态</th>\n" +" <th>操作</th>\n" +" </tr>";for (let i = 0; i < brands.length; i++) {let brand = brands[i];//放入表格里面去tableData+=" <tr align=\"center\">\n" +" <td>"+(i+1)+"</td>\n" +" <td>"+brand.brandName+"</td>\n" +" <td>"+brand.companyName+"</td>\n" +" <td>"+brand.ordered+"</td>\n" +" <td>"+brand.description+"</td>\n" +" <td>"+brand.status+"</td>\n" +"\n" +" <td><a href=\"#\">修改</a> <a href=\"#\">删除</a></td>\n" +" </tr>";}document.getElementById("brandTable").innerHTML=tableData;//设置表格数据})}
</script>
6.2 新增品牌
addBrand.html:
AddServlet:
测试一下
这样就说明了getParameter方法无法获取JSON的数据格式
这个不能接受JSON数据格式,,因为这个是把字符串按照&和等号切割的,JSON是没有的,{brandName: “华为”},它长这个样子
//1.接收数据
// String brandName = request.getParameter("brandName");//这个不能接受JSON数据格式,,因为这个是把字符串按照&和等号切割的,JSON是没有的,{brandName: "华为"},它长这个样子
// System.out.println(brandName);//获取请求体数据BufferedReader br = request.getReader();String params = br.readLine();//因为json只有一行//将JSON字符串转为Java对象Brand brand= JSON.parseObject(params, Brand.class);System.out.println(brand);//2.调用service添加brandService.add(brand);//3.响应成功标识response.getWriter().write("success");
addBrand.html:
最后就是Data那里,数据必须是真实的
现在开始处理一下表单的数据—》转为JSON
<script src="js/axios-0.18.0.js">
</script><script>
// <!-- 我们不需要正常提交表单了,---》直接一个普通的按钮就可以了,不用submit按钮了,因为我们要的是异步的,
// 传递的是异步的请求格式,,所以不需要指定action,因为指定了action,就会url变-->
// 1.给按钮绑定单击事件
document.getElementById("btn").onclick = function () {//点击提交按钮,数据都填了----->document.getElementById("brandName").value--->就是获取brandName你填写的值// var formData={// brandName:document.getElementById("brandName").value,// companyName:document.getElementById("companyName").value,// ordered:document.getElementById("ordered").value,// description:document.getElementById("description").value,// status:document.getElementById("status").value,// }//或者这样var formData={brandName:"",companyName:"",ordered:"",description:"",status:""}let brandName=document.getElementById("brandName").value;//获取数据formData.brandName=brandName;//设置数据let companyName=document.getElementById("companyName").value;//获取数据formData.companyName=companyName;//设置数据let ordered=document.getElementById("ordered").value;//获取数据formData.ordered=ordered;//设置数据let description=document.getElementById("description").value;//获取数据formData.description=description;//设置数据// let status=document.getElementById("brandName").value;//获取数据// formData.brandName=brandName;//设置数据//但是status没有id,状态是禁用还是启用?,它有两个标签的--》一次性获取两个标签,哪个被选中了就是谁let status=document.getElementsByName("status");for(let i=0;i<status.length;i++){if(status[i].checked){//表示这个被选中了{formData.status=status[i].value;}}console.log(formData);//把这个打印到控制台上//2。发送ajax请求axios({method: 'post',url:"http://localhost:8080/brand1-demo/addServlet",data:formData}).then(function (resp) {//判断响应数据是否为success,如果是说明添加成功,并跳回展示页面if(resp.data =="success"){location.href="http://localhost:8080/brand1-demo/brand.html";}})
}
</script>
总结
下一节讲Vue
Gitee
相关文章:

JavaWeb之AJAX
前言 这一节讲JavaWeb之AJAX 1.概述 以前我们在servlet中得到数据,必须通过域给jsp,然后jsp在响应给浏览器 纯html不能获取servlet返回数据 所以我们用jsp 但是现在我们可以同AJAX给返回数据了 我们可以在sevlet中直接通过AJAX返回给浏览器 html中的J…...

算法---解决“汉诺塔”问题
# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…...

1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)
文章目录 AbstractIntroduction问题表述Methodology多智能体位置编码公平上下文编码训练方案ExperimentsmTSP的性能评估mPDP的性能评估Related WorkConclusionAbstract 最小最大路由问题旨在通过智能体合作完成任务来最小化多个智能体中最长行程的长度。这些问题包括对现实世界…...

linux001.在Oracle VM VirtualBox中ubuntu虚拟系统扩容
1.打开终端切换到virtualBox安装目录 2.输入命令扩容 如上终端中的代码解释: D:\Program Files\Oracle\VirtualBox>.\VBoxManage modifyhd D:\ubuntu18.04\Ubuntu18.04\Ubuntu18.04.vdi --resize 40960如上代码说明:D:\Program Files\Oracle\Virtual…...

RabbitMQ教程:路由(Routing)(四)
文章目录 RabbitMQ教程:路由(Routing)(四)一、引言二、基本概念2.1 路由与绑定2.2 Direct交换机2.3 多绑定2.4 发送日志2.5 订阅 三、整合代码3.1 EmitLogDirectApp.cs3.2 ReceiveLogsDirectApp.cs3.3 推送所有和接收e…...

华为Ensp模拟器配置RIP路由协议
目录 RIP路由详解:另一种视角解读 1. RIP简介:轻松理解基础概念 2. RIP的核心机制:距离向量的魅力 3. RIP的实用与局限 RIP配置实验 实验图 编辑 PC的ip配置 RIP配置步骤 测试 结语:RIP的今天与明天 RIP路由详解&…...
3. langgraph中的react agent使用 (在react agent添加系统提示)
环境准备 确保你已经安装了以下库: langchainlangchain_openailanggraph 你可以使用以下命令进行安装: pip install langchain langchain_openai langgraph代码实现 1. 初始化模型 首先,我们需要初始化智谱AI的聊天模型。 from langch…...

(02)ES6教程——Map、Set、Reflect、Proxy、字符串、数值、对象、数组、函数
目录 前言 一、Map Maps 和 Objects 的区别 Map的迭代 forEach() Map对象的操作 二、Set Set 中的特殊值 三、Reflect 四、Proxy 五、字符串 六、数值 七、对象 八、数组 九、函数 参考文献 前言 一、Map Map 对象保存键值对。任何值(对象或者原始值) 都可以…...

【快速解决】kafka崩了,重启之后,想继续消费,怎么做?
目录 一、怎么寻找我们关心的主题在崩溃之前消费到了哪里? 1、一个问题: 2、查看消费者消费主题__consumer_offsets 3、一个重要前提:消费时要提交offset 二、指定 Offset 消费 假如遇到kafka崩了,你重启kafka之后࿰…...

C++ 的发展
目录 C 的发展总结:编辑 1. C 的早期发展(1979-1985) 2. C 标准化过程(1985-1998) 3. C 标准演化(2003-2011) 4. C11(2011年) 5. C14(2014年…...

RabbitMQ 高级特性——延迟队列
文章目录 前言延迟队列延迟队列的概念TTL 死信队列模拟延迟队列设置队列的 TTL设置消息的 TTL 延迟队列插件安装并且启动插件服务使用插件实现延迟功能 前言 前面我们学习了 TTL 和死信队列,当队列中的消息达到了过期时间之后,那么这个消息就会被死信交…...

EAC(Estimate at Completion)和ETC(Estimate to Complete)
EAC 预计完工成本ETC 预计尚需成本Estimate at CompletionEstimate to Complete完成预估完工时尚需成本估算 EAC ETC ACETC EAC – AC 预测项目总成本,包含了到目前为止实际发生的成本(AC)和预计将发生的成本。如果EAC大于BAC…...

【React】状态管理之Zustand
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 状态管理之Zustand引言1. Zustand 的核心特点1.1 简单直观的 API1.2 无需 Provi…...

Vue3打包自动生成版本JSON文件,添加系统版本检查,实现系统自动更新提示
实现该功能一共有三步。废话不多说,直接上代码!!! 第一步:打包时自动生成版本信息的js文件,versionUpdate.js import fs from fs; import path from path; import { ElMessageBox } from element-plus; i…...
海量数据有限内存系列问题解决方案
1. 排序问题 有限数据充足内存:内存中有十万整数,对所有数据进行排序。 内部排序即可 单节点海量数据有限内存:某台机器有一个文件,文件中包含六十亿整数,一个整数一行,可用内存1G,对所有数据…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,
也就是将摄像头采集到的YUV 的数据换成 AVFrame,然后再次转成 AVPacket,那么这AVPakcet数据要怎么办呢?分为三种情况: 一种是将AVPacket存储成h264文件,由于h264编码器在将avframe变成avpacket的时候就是按照h264的格…...

内容占位符:Kinetic Loader HTML+CSS 使用CSS制作三角形原理
内容占位符 前言 随着我们对HTML和CSS3的学习逐渐深入,相信大家都已经掌握了网页制作的基础知识,包括如何使用HTML标记构建网页结构,以及如何运用CSS样式美化页面。为了进一步巩固和熟练这些技能,今天我们一起来完成一个有趣且实…...

麒麟nginx配置
一、配置负载均衡 配置麒麟的yum源 vim /etc/yum.repos.d/kylin_aarch64.repo Copy 删除原来内容,写入如下yum源 [ks10-adv-os] name Kylin Linux Advanced Server 10 - Os baseurl http://update.cs2c.com.cn:8080/NS/V10/V10SP2/os/adv/lic/base/aarch64/ …...

如何在 Ubuntu 上安装 Emby 媒体服务器
Emby 是一个开源的媒体服务器解决方案,它能让你整理、流媒体播放和分享你的个人媒体收藏,包括电影、音乐、电视节目和照片。Emby 帮你集中多媒体内容,让你无论在家还是在外都能轻松访问。它还支持转码,让你能够播放各种格式的内容…...

Mac上详细配置java开发环境和软件(更新中)
文章目录 概要JDK的配置JDK下载安装配置JDK环境变量文件 Idea的安装Mysql安装和配置Navicat Premium16.1安装安装Vscode安装和配置Maven配置本地仓库配置阿里云私服Idea集成Maven 概要 这里使用的是M3型片 14.6版本的Mac 用到的资源放在网盘 链接: https://pan.baidu.com/s/17…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...