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事件,直接可以this
        var 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传给servlet
        xhttp.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.get
  axios({
    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>
        //定义json
        var 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

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

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

相关文章

【Spring】Bean

Spring 将管理对象称为 Bean。 Spring 可以看作是一个大型工厂&#xff0c;用于生产和管理 Spring 容器中的 Bean。如果要使用 Spring 生产和管理 Bean&#xff0c;那么就需要将 Bean 配置在 Spring 的配置文件中。Spring 框架支持 XML 和 Properties 两种格式的配置文件&#…

[Python学习日记-68] 绑定方法与非绑定方法

[Python学习日记-68] 绑定方法与非绑定方法 简介 绑定方法 非绑定方法 绑定方法与非绑定方法的应用 简介 在之前我们学习类与对象的属性查找与绑定方法的时候就接触过绑定方法了&#xff0c;不过当时是简单的介绍了针对于对象的绑定方法&#xff0c;其实在类内部定义的函数…

逆向攻防世界CTF系列39-debug

逆向攻防世界CTF系列39-debug 查了资料说.NET要用其它调试器&#xff0c;下载了ILSPY和dnSPY ILSPY比较适合静态分析代码最好了&#xff0c;函数名虽然可能乱码不显示&#xff0c;但是单击函数名还是能跟踪的&#xff0c;而dnSPY在动态调试上效果好&#xff0c;它的函数名不仅…

Spring-事务学习

spring事务 1. 什么是事务? 事务其实是一个并发控制单位&#xff0c;是用户定义的一个操作序列&#xff0c;这些操作要么全部完成&#xff0c;要不全部不完成&#xff0c;是一个不可分割的工作单位。事务有 ACID 四个特性&#xff0c;即&#xff1a; 原子性&#xff08;Atom…

RHCE的学习(21)

第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况&#xff0c;Linux Shell提供了一组测试运算符。 通过这些运算符&#xff0c;Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句&#xff0c;例如判断语句和循环语句中…

用pyspark把kafka主题数据经过etl导入另一个主题中的有关报错

首先看一下我们的示例代码 import os from pyspark.sql import SparkSession import pyspark.sql.functions as F """ ------------------------------------------Description : TODO&#xff1a;SourceFile : etl_stream_kafkaAuthor : zxxDate : 2024/11/…

单片机_day3_GPIO

目录 1. 灯如何才能亮 1.1原理图 1.2 二极管 1.3 换了一个灯和原理图 ​编辑 1.4 三极管 1.4.1 NPN型三极管 1.4.2 PNP型三极管 2. 基本概念 3. 输入 3.1 浮空输入 3.2 上拉输入 3.3 下拉输入 3.4 模拟输入 4. 输出 4.1 推挽输出 4.2 开漏输出 如何让开漏输出…

基于视觉智能的时间序列基础模型

GitHub链接&#xff1a;ViTime: A Visual Intelligence-Based Foundation Model for Time Series Forecasting 论文链接&#xff1a;https://github.com/IkeYang/ViTime 前言 作者是来自西安理工大学&#xff0c;西北工业大学&#xff0c;以色列理工大学以及香港城市大学的研…

java项目-jenkins任务的创建和执行

参考内容: jenkins的安装部署以及全局配置 1.编译任务的general 2.源码管理 3.构建里编译打包然后copy复制jar包到运行服务器的路径 clean install -DskipTests -Pdev 中的-Pdev这个参数用于激活 Maven 项目中的特定构建配置&#xff08;Profile&#xff09; 在 pom.xml 文件…

Qt按钮类-->day09

按钮基类 QAbstractButton 标题与图标 // 参数text的内容显示到按钮上 void QAbstractButton::setText(const QString &text); // 得到按钮上显示的文本内容, 函数的返回就是 QString QAbstractButton::text() const;// 得到按钮设置的图标 QIcon icon() const; // 给按钮…

论文6—《基于YOLOv5s的深度学习在自然场景苹果花朵检测中的应用》文献阅读分析报告

论文报告&#xff1a;基于YOLOv5s的深度学习在自然场景苹果花朵检测中的应用 基于YOLOv5s的深度学习在自然场景苹果花朵检测中的应用 摘要国内外研究现状1. 疏花技术研究2. 目标检测算法研究 研究目的研究问题使用的研究方法试验研究结果文献结论创新点和对现有研究的贡献1. Y…

「人眼视觉不再是视频消费的唯一形式」丨智能编解码和 AI 视频生成专场回顾@RTE2024

你是否想过&#xff0c;未来你看到的电影预告片、广告&#xff0c;甚至新闻报道&#xff0c;都可能完全由 AI 生成&#xff1f; 在人工智能迅猛发展的今天&#xff0c;视频技术正经历着一场前所未有的变革。从智能编解码到虚拟数字人&#xff0c;再到 AI 驱动的视频生成&#…

计算机毕业设计Python美食推荐系统 美团爬虫 美食可视化 机器学习 深度学习 混合神经网络推荐算法 Hadoop Spark 人工智能 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

GPU分布式通信技术-PCle、NVLink、NVSwitch深度解析

GPU分布式通信技术-PCle、NVLink、NVSwitch 大模型时代已到来&#xff0c;成为AI核心驱动力。然而&#xff0c;训练大模型却面临巨大挑战&#xff1a;庞大的GPU资源需求和漫长的学习过程。 要实现跨多个 GPU 的模型训练&#xff0c;需要使用分布式通信和 NVLink。此外&#xf…

MySQL:联合查询(2)

首先写一个三个表的联合查询 查询所有同学的每门课成绩&#xff0c;及同学的个人信息 1.我们首先要确定使用哪些表 学生表&#xff0c;课程表&#xff0c;成绩表 2.取笛卡尔积 select * from score,student,course; 3. 确定表与表之间的联合条件 select * from score,stud…

【leetcode】704. 二分查找

注意一般mid left (right-left)/2; 不要用mid (right - left)/2 中间值的计算需要考虑到整型溢出的问题。 如果使用 mid (right - left) / 2 的方式计算中间值&#xff0c;那么在 right 和 left 的值接近极限值的情况下&#xff0c;可能会导致计算出的中间值发生整型溢出&…

RHCE的练习(12)

写一个脚本&#xff0c;完成以下要求&#xff1a; 给定一个用户&#xff1a; 如果其UID为0&#xff0c;就显示此为管理员&#xff1b;否则&#xff0c;就显示其为普通用户&#xff1b; #!/bin/bash ​ # 使用read命令获取用户名 read -p "请输入用户名: " username ​…

WPF-控件的属性值的类型转化

控件的属性值需要转成int、double进行运算的&#xff0c;可以使用一下方法 页面代码 <StackPanel Margin"4,0,0,0" Style"{StaticResource Form-StackPanel}"> <Label Content"替换后材料增加金额&#xff…

【从零开始的LeetCode-算法】3270. 求出数字答案

给你三个 正 整数 num1 &#xff0c;num2 和 num3 。 数字 num1 &#xff0c;num2 和 num3 的数字答案 key 是一个四位数&#xff0c;定义如下&#xff1a; 一开始&#xff0c;如果有数字 少于 四位数&#xff0c;给它补 前导 0 。答案 key 的第 i 个数位&#xff08;1 < …

iMetaOmics | 刘永鑫/陈同-用于食物微生物组成和时间序列研究的微生物组数据库FoodMicroDB...

点击蓝字 关注我们 FoodMicroDB&#xff1a;用于食物微生物组成和时间序列研究的微生物组数据库 iMeta主页&#xff1a;http://www.imeta.science 研究论文 ● 原文链接DOI: https://doi.org/10.1002/imo2.40 ● 2024年11月1日&#xff0c;中国农业科学院深圳农业基因组研究所刘…