文章目录

  • 前言
  • 案例
  • 跨域访问
  • 总结❗


前言

提示:这里可以添加本文要记录的大概内容:

通过 ajax 进行前后端交互
请添加图片描述

案例

此项目用到了javaweb知识

首先创建JavaWeb项目编写代码:

package ajax;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;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 com.google.gson.Gson;@WebServlet("/ajax")
public class ajax extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 将Gson库放在WEB-INF/lib目录下// 运行时加载Gson库try {Class.forName("com.google.gson.Gson");} catch (ClassNotFoundException e) {e.printStackTrace();return;}List<User> list = new ArrayList<User>();list.add(new User(1,"张三","23"));list.add(new User(2,"李四","28"));Gson gson = new Gson();response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().print(gson.toJson(list));}class User {private int id;private String name;private String age;public User(int id, String name, String age) {super();this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return age;}public void setSex(String sex) {this.age = age;}}
}
//最后将Gson库的jar包重新复制到WEB-INF/lib目录下,或者在Java Web项目的classpath中添加Gson库的jar包

运行结果:
在这里插入图片描述

接下来创建vue项目

创建完项目进入安装Axios框架npm i axios

打开根组件删掉全部代码重新生成

在template标签内加上一个按钮

<!-- 看到按钮就想到事件 -->
<button @click="send">发送请求</button>

接下来在methods里面配置方法

  methods: {send(){},

axios框架发送请求,首先需要先在script标签中导入这个框架

// 第一个axios是自定义名字
import axios from 'axios'

现在回到send方法内部,导入axios调用

  methods: {send(){// get方法代表向后端发送请求   参数是后端项目程序地址// then方法代表处理后端发送回的响应数据axios.get('http://localhost:8888/ajax/ajax').then( (resp)=>{//log测试console.log(resp.data);} )}},

localhost是本地地址,也可以写自己IP地址
运行代码后右键开发者模式点击控制台,然后点击发送请求按钮:在这里插入图片描述

跨域访问

代理服务器的目的:
代理服务器的主要目的是为客户端提供一种间接访问网上资源的方式,客户端向代理服务器发送请求,代理服务器自动转发,从而代替客户端完成请求和响应

对于代理服务器的理解可以参考下面这个比喻:假设你需要访问一个网站,但是由于某些原因无法直接连接该网站,这时候你可以使用一个代理服务器来帮助你连接该网站。代理服务器就像是一个中间人,它接收你的请求,然后将请求转发给目标网站,接着将目标网站的响应返回给你。
这个过程就好像是一个邮递员,他接收用户发出的请求,将请求转发给目标服务器,在目标服务器响应后将响应返回给用户。这个过程就好比是一个人需要向另一个人发送信件,但是由于某些原因不能直接发送,所以需要寄给邮递员,由邮递员帮忙送到另一个人手里。代理服务器可以提高访问速度、保护隐私、过滤内容等等。
因此,代理服务器可以在一些特定的情况下帮助你绕过一些限制和策略,从而达到访问目标网站的目的。

在项目内最下面有个vue.config.js文件,代理服务器加上去(第三行后)

  devServer: {proxy: {'/api':{target: 'http://localhost:8888/ajax/',ws: true,changeOrigin: true,pathRewrite: {'^/api':''}}}}

这时回到根组件,send方法内的axios地址要改成代理服务器地址

      axios.get('/api/ajax')  

重启项目,刷新页面,点击按钮:
在这里插入图片描述

接下来完善项目,因为在实际项目中用户不会去查看控制台
应该把数据发回来后渲染到视图上

在data中做一个配置项,把发回来的响应数据赋值给data中的配置数据,一赋值vue就监听到了,数据就改变,立刻修改数据同步到视图上

  data () {return {// 返回到数据是个数组,包含多个数据arr:[]}},

接下来在methods内标签的send方法中删掉log输出,加上

//等于发送回来的相应数据
this.arr = resp.data

完善html代码,这里加了个表格

<template><div><!-- 看到按钮就想到事件 --><button @click="send">发送请求</button><table><tr><th>id</th><th>名字</th><th>年龄</th></tr><tr v-for="(item, index) in arr" :key="index"><th>{{ item.id }}</th><th>{{ item.name }}</th><th>{{ item.age}}</th></tr></table></div>
</template>

加上css样式:

<style scoped>
table {border-collapse: collapse;width: 100%;margin-top: 50px;
}th, td {border: 1px solid black;padding: 8px;text-align: center;
}thead {background-color: #f2f2f2;
}tr:nth-child(even) {background-color: #f2f2f2;
}button {margin-bottom: 20px;padding: 10px 20px;border: none;border-radius: 4px;background-color: #4CAF50;color: white;
}
</style>

运行效果:

在这里插入图片描述

总结❗

异步请求的同源策略:

浏览器发送的请求必须和前端服务器IP地址一样、端口号一样

前后端分离项目采用的是Ajax异步请求通信方式:

采用 axios 框架发送异步请求
浏览器发送 Ajax 请求时,会有同源策略限制,禁止跨域请求
前端 和 后端项目的协议、IP地址、端口号都相同才认为是同源

跨域请求解决方案:

在前端项目中配置代理服务器(安全性高,常用)
在后端项目中设置响应头为资源共享状态(风险高)

怎么异步更新数据:

发送 ajax 异步请求
在回调函数中,将相应数据赋值给对应的数据

ajax如何取消请求?
原生ajax终止请求,调用abort()方法
axios终止请求, 用浏览器原生的AbortController来终止请求

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能创造的幕后推手:AIGC浪潮下看AI训练师如何塑造智能未来

文章目录一、AIGC时代的算法与模型训练概览二、算法与模型训练的关键环节三、AI训练师的角色与职责四、AI训练师的专业技能与素养五、AIGC算法与模型训练的未来展望《AI训练师手册&#xff1a;算法与模型训练从入门到精通》亮点内容简介作者简介谷建阳目录《医学统计学从入门到…

Python设计模式 - 装饰模式

定义 装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;用于在不修改原有类的情况下动态地扩展对象的功能。 结构抽象组件&#xff08;Component&#xff09;&#xff1a;定义对象的公共接口&#xff0c;使得客户端能以一致的方式处理未被装…

MySQL(188)如何使用MySQL的慢查询工具?

使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询。以下是详细深入的步骤和代码示例&#xff0c;帮助你使用MySQL的慢查询工具来进行查询分析和优化。 一、启用慢查询日志 首先&#xff0c;你需要确保MySQL的慢查询日志功能是启用的。慢查询日志记录了所有执行…

如何培养自己工程化的能力(python项目)

培养 Python 项目的工程化能力需要系统性训练&#xff0c;以下从基础到高阶的实践路径&#xff0c;结合具体案例和工具链&#xff0c;帮助你逐步进阶&#xff1a;一、夯实工程化基础能力​1. 规范代码与项目结构•​项目模板化​使用 cookiecutter生成标准项目结构&#xff0c;…

AI编程插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功能特性、性能表现、集成性、用户…

uniapp/uniappx实现图片或视频文件选择时同步告知权限申请目的解决华为等应用市场上架审核问题

在UNIAPP支持vue和nvue,在UNIAPPX支持uvue&#xff0c;安卓支持在选择图片或视频文件权限申请的时候自动同步告知权限申请目的。轻松解决在华为应用市场审核&#xff0c;要求告知权限申请目的或说明的问题。 UNIAPP相册图片视频选择器(安卓可以自定义界面样式)功能介绍&#x…

jupyter notebook如何打开其他盘目录

问题描述Jupyter Notebook 相信是我们学习 Python 避不开的一个工具。当我们使用 pip install notebook 安装 Notebook 之后&#xff0c;使用命令 jupyter notebook 启动服务&#xff0c;启动之后默认会在浏览器打开界面。我们会发现&#xff0c;这个界面默认在 C 盘下&#xf…

C语言深度剖析

一、关键字 1.1 最快的关键字-register register 这个关键字请求编译器尽可能将变量存在CPU内部寄存器中,而不是通过内存寻址以提高效率。 注意是:尽可能、而不是绝对 1.1.1 皇帝身边的小太监-寄存器 不知道什么是寄存器,那见过太监没有其实寄存器就是相当于。一个cpu的…

电脑使用“碎片整理”程序的作用

1.解决文件碎片化问题碎片整理的作用&#xff1a;将这些分散的文件片段重新整理、拼接&#xff0c;使其连续存储在硬盘的某个区域&#xff0c;减少文件的 “碎片化” 程度。2. 提升硬盘读写速度机械硬盘的特殊性&#xff1a;机械硬盘依赖磁头的物理移动来读取数据&#xff0c;若…

AI 软件工程开发 AI 算法 架构与业务

AI 软件工程开发 & AI 算法 & 架构与业务前言1.AI 软件工程开发1.1. AI Developer Studio &#xff08;playground级&#xff09;1.2. Agent & RAG1.3. LangChain & LangGraph1.4. MCP, Model Context Protocol1.5. Ollama1.6. Coze & Dify2.AI 算法2.1. G…

uniapp实现的圆形滚盘组件模板

采用 uniapp 实现的一款圆形滚盘示例组件模板, 支持 vue2、vue3&#xff0c;适配H5、微信小程序&#xff08;其他小程序未试过&#xff0c;可自行尝试&#xff09; 代码实现简约易懂&#xff0c;用户可根据自身需求下载模板&#xff0c;并进行扩展开发可到插件市场下载尝试&…

无须炮解,打开即是Pro版

聊一聊 文档或文件转图片&#xff0c;这个我有段时间没有推荐了。 今天发现了一款非常好用的图像格式转换编辑软件。 有需要的小伙伴请及时收藏&#xff0c;防止下次找不到。 软件介绍 全能图像格式转换工具 这是一款全能的图像转换软件&#xff0c;支持几乎所有的图像格式…

企业高性能web服务器——Nginx

Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个邮件代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发&#xff0c;官方测试nginx能够支撑5万并发链接&#xff0c;并且cpu、内存等资源消耗却非常低&#xff0c;运行非常稳定。所以其特点是占有内存…

MCU控制ADAU1701,用System Workbench for STM32导入工程

作者的话 MCU控制ADAU1701&#xff0c;我有写一个文档详细讲步骤&#xff0c;里头用到了System Workbench for STM32这个软件&#xff0c;他是基于eclips内核的开发软件&#xff0c;一般来讲&#xff0c;设置好workspce工程就会出来&#xff0c;但是架不住就有设置好工程不出来…

SQL176 每个题目和每份试卷被作答的人数和次数

描述现有试卷作答记录表exam_record&#xff08;uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分&#xff09;&#xff1a;iduidexam_idstart_timesubmit_timescore1100190012021-09-01 09:01:012021-09-01 09:41:01812100290022021-09-01 …

构建第三方软件仓库

1 下载第三方软件到指定目录[rootServer_b ~]# mkdir software [rootServer_b software]# wget https://dldir1v6.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.18_250724_x86_64_01.rpm2 安装软件信息采集工具[rootServer_b software]# yum install createrepo -y [rootServer_b softw…

Linux 管道命令及相关命令练习与 Shell 编程、Tomcat 安装

2.实验目的掌握 Linux 管道命令及相关命令&#xff08;cut、sort、wc、uniq、tee、tr、split&#xff09;的使用方法。学会使用 Shell 编程实现基本的计算器功能。掌握在 CentOS 7 系统中安装 Tomcat 的方法。实验内容1. Linux 管道命令及相关命令练习1.1 管道命令定义&#xf…

蓝牙基础:FIFO(First-In-First-Out)缓存区

在蓝牙通信中&#xff0c;FIFO&#xff08;First-In-First-Out&#xff0c;先进先出&#xff09;缓存区是解决数据传输中“速度不匹配”和“时序异步”问题的核心机制&#xff0c;广泛应用于蓝牙芯片内部、协议栈各层级及主从设备交互中。其核心作用是临时存储数据&#xff0c;…

国内外主流源代码平台与高效开发指南

摘要 本文旨在为您提供一份实用的源代码获取与开发指南。我们将首先梳理国内外最主流的源代码托管平台&#xff0c;并重点介绍如何利用这些平台上的开源项目。接着&#xff0c;本文将为您规划一条针对初学者的“最快最性价比”的开发路径&#xff0c;从环境配置、项目管理到实…

任务进度状态同步 万能版 参考 工厂+策略+观察者设计模式 +锁设计 springboot+redission

文章目录概要效果解释状态流转说明设计AI任务实体类AI任务状态枚举AI模型枚举基础实体类简单字典接口工厂策略模式 接口设计AiJobProcessorAiJobProcessorFactory观察者模式AI任务相关的EventMyEventListenerMyEventPubLisherRedissonConfig定时任务实现ReplicateJobProcessorR…