Ajax的简单使用

news2024/11/28 19:04:23

目录

1、ajax概述

2、模拟ajax

3、Jquery实现ajax

(1)通用开发步骤

(2)示例 注册用户名重复性验证

(3)示例 ajax解析json数据

(4)实现细节

4、axios实现ajax

5、ajax发送PUT请求引发的“血案”


1、ajax概述

什么是ajax

Ajax:async javascript and XML (异步 JavaScript和XML)

通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。而传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页面。

ajax也是独立于编程语言之外的。

网页同步更新与异步更新的区别

同步提交:当用户发送请求时,当前页面不可以使用,服务器响应页面到客户端,响应完成,用户才可以使用页面。

异步提交:当用户发送请求时,当前页面还可以继续使用,当异步请求的数据响应给页面,页面把数据显示出来 。

在只需要更新局部数据时,如果使用传统的同步更新方式,需要重新加载整个页面的所有资源,造成无意义的资源浪费,也影响用户的体验。

ajax的实现原理

Ajax的核心是XMLHttpRequest对象(XHR)。XHR为向服务器发送请求和解析服务器响应提供了接口,能够以异步的方式从服务器获取新数据

2、模拟ajax

模拟ajax,分析前端的执行逻辑

编写前端页面

<div>
    <p>输入要加载的地址:</p>
    <p>
        <input type="text" id="url" value="请输入一个网址">
        <input type="button" value="提交" onclick="loadPage()">
    </p>
</div>

<div>
    <h3>
        加载页面的位置:
    </h3>
    <iframe style="width: 100%; height: 430px" id="iframePosition">

    </iframe>
</div>

这里做了三部分:

  1. 输入框,id为"url"
  2. 一个按钮,绑定点击事件为loadPage()
  3. 一个iframe区域,id为"iframePosition",用于显示出网页

效果

编写js

<script type="text/javascript">
    //创建名为loadPage的函数
    function loadPage() {
        //获取 id为url 的元素的value属性,即用户输入的URL地址
        var targetURL = document.getElementById("url").value;

        //设置 id为iframePosition 的元素的src属性 等于 targetURL,就会在iframe中访问该URL对应的网页资源
        document.getElementById("iframePosition").src = targetURL;
    }
</script>

逻辑:在点击提交按钮时,会调用此函数,通过id获取到输入框元素,再获取到其中的值;通过id获取到iframe元素,设置它的src值等于输入框的value值,就实现了显示用户输入的页面。

用户输入一次网址,点击提交,下方的区域就会显示出目标网页。

此过程中,页面没有刷新,相当于是一个伪异步网站。

3、Jquery实现ajax

(1)通用开发步骤

导入Jquery的js文件

先将Jquery的js文件导入工程,一般存放在src/main/webapp/static/js下

引入Jquery的js文件

<script type="text/javascript" th:src="@{/static/js/jquery-3.6.0.min.js}"></script>

<script type="text/javascript" th:inline="javascript">

编写前端元素

用户名:<input type="text" id="txtName" onblur="checkUser()">

使用到ajax的前端元素需要具备两个东西

  1. id值
  2. 事件。当次事件执行后,调用自定义的函数方法,发送ajax请求

编写函数方法

<script type="text/javascript" th:inline="javascript">

function checkUser() {

}
</script>

使用thymeleaf,动态获取到项目的基础路径

<script type="text/javascript" th:inline="javascript">
    
    //动态获取项目根目录
var basePath = [[${#httpServletRequest.getScheme() + "://" + #httpServletRequest.getServerName() + ":" + #httpServletRequest.getServerPort() + #httpServletRequest.getContextPath()}]];

    function checkUser() {


    }
</script>

注意:

  1. 这个基础目录,目的是动态获取当前项目的基础路径,与后续指定的请求路径组合成ajax完整的URL路径
  2. 是固定写法,非常可靠。

编写ajax请求

ajax请求分为三部分:

  1. url:待访问的路径
  2. data:待发送的参数
  3. success:执行成功后执行的回调函数

示例

$.ajax({
    //待访问的路径,只有这个是必填的
    url: basePath + "/checkUser",
    //待发送的参数
    data: {'username': $("#txtName").val()},
    //载入成功时回调函数
    success: function (data) {
    	//data封装了服务器返回的数据
    }
});

除了这样竖着写,也可以精简到一行中:

$.get(basePath + "/checkUser", {'username': $("#txtName").val()}, function (data) {
    
})

注意:这种写法只能使用\$.get或\$.post,不能使用\$.ajax,否则无法传递参数!

(2)示例 注册用户名重复性验证

需求

在注册页面,用户填入用户名,用户名输入框失去焦点后,搜索数据库中是否存在该用户名,并展示给用户

后台控制器方法

@RequestMapping("/usernameCheck")
@ResponseBody
public boolean login(String username){
    if (null != username){
        if ("admin".equals(username)){
            //用户名重复,提示用户
            return false;
        }
    }
    return true;
}

模拟,如果用户名为admin,提示重复。

前端页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>Ajax 登录验证示例</h3>

用户名:<input type="text" id="inputName" value="请输入用户名" onblur="login()">
<span id="res"></span>

<script type="text/javascript" th:src="@{/static/js/jquery-3.6.0.min.js}"></script>

<script type="text/javascript" th:inline="javascript">

    //动态获取项目根目录
    var basePath = [[${#httpServletRequest.getScheme() + "://" + #httpServletRequest.getServerName() + ":" + #httpServletRequest.getServerPort() + #httpServletRequest.getContextPath()}]];

    function login() {
        $.post(basePath + "/usernameCheck", {"username":$("#inputName").val()}, function (data) {
            if (data) {
                //用户名可用;
                $("#res").css("color", "green");
                $("#res").html("√");
            } else {
                //用户名不可用
                $("#res").css("color", "red");
                $("#res").html("用户名已存在!");
            }
        })
    }
</script>

</body>
</html>

(3)示例 ajax解析json数据

需求

前端发出ajax请求,后台返回前端一个User类型的List,前端实现遍历集合并展示

控制器方法

@RequestMapping("/showUser")
@ResponseBody
public List<User> showUser(){

    List<User> list = new ArrayList<User>();

    list.add(new User("admin1", "123456"));
    list.add(new User("admin2", "123456"));
    list.add(new User("admin3", "123456"));
    list.add(new User("admin4", "123456"));
    list.add(new User("admin5", "123456"));

    return list;
}

 前端页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<input type="button" id="btn" value="点击发送一个json数据到浏览器">
<table width="80%" align="center">
    <tr>
        <td>username</td>
        <td>password</td>
    </tr>
    <tbody id="content">

    </tbody>
</table>

<script type="text/javascript" th:src="@{/static/js/jquery-3.6.0.min.js}"></script>

<script type="text/javascript" th:inline="javascript">

    //动态获取项目根目录
    var basePath = [[${#httpServletRequest.getScheme() + "://" + #httpServletRequest.getServerName() + ":" + #httpServletRequest.getServerPort() + #httpServletRequest.getContextPath()}]];

    $(function () {
        $("#btn").click(function () {
            $.post(basePath + "/showUser", function (data){
                console.log(data);
                var html = "";
                for (var i=0; i<data.length;i++){
                    html += "<tr>" +
                        "<td>" + data[i].username + "</td>" +
                        "<td>" + data[i].password + "</td>" +
                        "</tr>"
                }
                $("#content").html(html);
            })
        })
    })
</script>


</body>
</html>

(4)实现细节

发送ajax请求的流程

某个事件触发函数方法 --> 执行函数该方法 --> 发出ajax请求 --> 访问URL地址,传递数据,接收返回数据

如何处理后台返回的数据

ajax请求中,success对应的回调函数的参数data,即为服务器返回的消息对象,可以是json数据,也可以是基本数据类型。

data可以直接当做普通的对象,用 .属性名 来获取属性值。

如何动态改变前端元素的内容

常与ajax配合的元素是:div、span。

首先,设置元素的id值。然后,在需要赋值的地方,使用Jquery的处理方式

$("#content").html(新内容);

也可以设置该元素的css属性

$("#content").css(新内容);

4、axios实现ajax

Ajax请求可以通过原生方式实现、也可以通过jQuery方式实现,在Vue中,通常使用axios方式(读作阿修斯)方式实现Ajax。

axios是独立于vue的一个项目,可以用于浏览器和node.js中发送ajax请求。

5、ajax发送PUT请求引发的“血案”

ajax可以直接发送put和delete请求。

但是发送put请求时,SpringMVC不能自动封装pojo类

现象

ajax直接发送put请求,请求体中确实有数据,但SpringMVC无法自动封装pojo类,甚至request.getParameter()都拿不到请求体中的数据!

原因

Tomcat一看是put请求,就不会封装请求体中的数据为map,而只有post形式的请求,才会封装请求体为map。

解决方案

  1. 需要发送PUT请求时,不要直接发送,而是发送POST请求,携带"_method=put"的请求参数,由SpringMVC去做处理

  2. 如果要直接发送PUT请求,则必须在web.xml配置HttpPutFormContentFilter过滤器,拦截范围是所有请求 

 <!--    对ajax直接发送的PUT请求进行处理-->
 <filter>
     <filter-name>HttpPutFormContentFilter</filter-name>
     <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
 </filter>
 <filter-mapping>
     <filter-name>HttpPutFormContentFilter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

HttpPutFormContentFilter作用:

将请求体中的数据解析、包装成一个map,request被重新包装,request.getParameter()方法被重写,会从重新封装的map中取出数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

西门子安装和配置

一、已安装 V16&#xff0c;检查软件正常 1.判断西门子软件是否正常工作&#xff0c;检查软件图标&#xff0c;如下图。 2.如果软件图标不存在&#xff0c;检查Windows服务是否存在&#xff0c;打开方法如下图&#xff1a; 3.检查西门子的服务&#xff0c;共16个服务&#xff…

万维网服务

~ 在AppSrv上搭建网站服务器 ~ 将访问HTTP://www.chinaskills.com的http的请求重定向到https://chinaskills.com站点 ~ 网站内容设置为“该页面为www.chinaskills.com测试页” ~ 将当前web根目录设置为d:\wwwroot 目录 ~ 启用windows身份验证&#xff0c;只有通过身份验证的…

如何在比特币系统内创造人工生命

信息来源&#xff1a;coingeek.com 自2015年以来&#xff0c;关于比特币能否进行复杂计算以及比特币是否“图灵完备”的争论一直在持续。不幸的是&#xff0c;现在存在着一种流传甚广的谬论&#xff0c;有人说比特币并非图灵完备的&#xff0c;它不能像以太坊区块链那样进行复杂…

【Node.JS 数据库篇】Sequelize 的用法与mysql的关系

文章目录 一、Sequlize是Node.JS中ORM实现二、Sequelize 执行基础的CRUD三、Sequelize 执行复杂的CRUD1. 指定字段attributes2. 触发数据库事务3. LEFT JOIN 联表关系4. INNER JOIN 联表关系5. 嵌套查询 四、Sequlize常用方法和参数1. findAll2. count3. findByPk4. findOne5. …

【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 策略模式&#xff08;Strategy Pattern&#xff09;属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中&#xff0c;根据需要来绑定策略&#xff0c;使得具体实现和策略解耦。 当你想使用对象中各种不同的算法变体&#xff0c;使用if...else 所带来的复杂和…

增强型PID-自适应-前馈-神经网络控制研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Linux】入门介绍

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;Linux &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注​ 目录 前言 Linux背景介绍 1.发展史 UNIX发展的历史 Linux发展历史 2. 开源 3. 官网 4. 企业应用现状 5. 发行版…

装饰者模式

采用组合而非继承的手法&#xff0c;Decorator模式实现了在运行时动态扩展对象功能的能力&#xff0c;可以根据需要扩展功能。 Decorator类在接口上表现为is-a Component的继承关系&#xff0c;即Decorator类继承了Component类的所有接口。但在实现上又表现为has-a Component的…

打印流~~

文章目录 打印流PrintStreamPrintWriter追加操作输出语句的重定向 Properties使用properties把键值对信息存入到属性文件中去使用properties在文件中取键值对信息 IO框架(了解) 打印流 作用&#xff1a;打印流可以实现方便、高效的打印数据到文件中去。打印流一般是指&#xff…

【Linux】2.1 环境基础开发工具使用——yum

什么是yum Linux 软件包管理器——yum yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上. yum 的使用 卸载&#xff1a; yum -y(直接卸载) remove [xxx] 查找&#xff1a; yum list | grep [xxx] 软件包名称:…

这才是 SpringBoot 统一登录鉴权、异常处理、数据格式 的正确姿势

本篇将要学习 Spring Boot 统一功能处理模块&#xff0c;这也是 AOP 的实战环节 用户登录权限的校验实现接口 HandlerInterceptor WebMvcConfigurer 异常处理使用注解 RestControllerAdvice ExceptionHandler 数据格式返回使用注解 ControllerAdvice 并且实现接口 Response…

Hive拉链表实现

拉链表 定义:用来记录历史变化,相比每天存储全量数据,可大幅减少数据冗余,可以基于历史变化,统计分析历史变化信息使用场景: 用于记录维度变化场景,记录维度变化,根据维度变化记录,统计聚合,加成生成不同时期历史指标 Hive 拉链表实现 实现原理 首次(T1: 2023-04-01) 同步业…

MATLAB-Lingo求解线性规划问题-奶制品2

奶制品的生产销售计划&#xff0c;给定条件不变 为了增加工厂的获利&#xff0c;开发了奶制品的深加工技术&#xff1a;用2小时和3元加工费&#xff0c;可将1kgA1加工成0.8kg高级奶制品B1&#xff0c;也可将1kgA2加工成0.75kg高级奶制品B2&#xff0c;每千克B1能获利44元&#…

ABI Research产业研究:ZiFiSense如何革新物流货物及运输包装追踪

“文章源自前沿科技研究机构ABI Research产业研究&#xff0c;重点介绍了ZETA LPWA协议开发公司纵行科技在业务发展、M-FSK调制技术以及ZETag云标签系列产品在物流货物追踪与包装管理等方面的应用分析&#xff0c;还分享了纵行科技ZETA技术在商业市场和生态系统方面的发展情况。…

用扩展方法来实现EventTrigger中事件的异步等待

一、什么是扩展方法&#xff1f; 扩展方法是一种C#语言提供的功能&#xff0c;允许我们向现有类型添加新的方法&#xff0c;而无需修改类型的源代码。扩展方法的优缺点如下&#xff1a; 二、它有什么优点&#xff1f; 1、不需要修改源类型的代码&#xff1a;使用扩展方法可以…

工具-Snipaste与ScreenToGif 生产力工具,对截图进行勾画操作,并可将截图贴至电脑任意界面;快捷动态截图成gif

文章目录 1、演示1.1 snipaste1.2 ScreenToGif 2、操作2.1 snipaste2.2 ScreenToGif 1、演示 1.1 snipaste 1.2 ScreenToGif 2、操作 2.1 snipaste 进入官网&#xff0c;可根据系统进行下载 https://zh.snipaste.com/ 傻瓜式安装成功后&#xff0c;电脑的右下角有个小图标&a…

兰林:科技赋能健康产业 助力乡村振兴建设

万民健康创始人 万民智养中医创始人 万民星农CEO兰林 党建引领谋发展 &#xff0c; 旗帜下乡促振兴 。 乡村振兴&#xff0c;健康先行。自党的十八大以来&#xff0c;国家卫健委贯彻落实“以基层为重点”的党的卫生与健康工作方针&#xff0c;推动医疗卫生工作重心下移、资源下…

Springboot +Flowable,通过代码绘制流程图并设置高亮

一.简介 通过代码绘制一张流程图&#xff0c;并设置成高亮。 首先先来看一下绘制出来的效果图&#xff0c;截图如下&#xff1a; 已经执行的节点和连线用红色标记出来&#xff0c;大致上就是这么一个效果。 二.怎么实现 将一个流程图绘制成图片&#xff0c;相关的 API 在…

倾斜摄影超大场景的三维模型的顶层合并的轻量化处理技术

倾斜摄影超大场景的三维模型的顶层合并的轻量化处理技术 倾斜摄影超大场景的三维模型的顶层合并需要进行轻量化处理&#xff0c;以减小数据量和提高数据的传输和展示性能。以下是几种常用的轻量化处理技术&#xff1a; 1、网格简化&#xff1a;对三角面片数量过多的模型进行网…

10个常用的软件测试工具,你不容错过

在现代软件开发中&#xff0c;软件测试是不可或缺的一部分。为了确保软件产品的质量和稳定性&#xff0c;软件测试工具成为了测试团队的得力助手。 有许多优秀的软件测试工具可以帮助测试人员在各种测试活动中提高效率和准确性。 本文将介绍10个常用的软件测试工具&#xff0c;…