前后端请求、返回数据的多种方式

news2024/11/29 3:58:10

Springboot项目的业务逻辑

🌙项目基本结构
通常情况下,我们在搭建后端项目的时候,处理业务逻辑我们需要用到Controller,Service,Mapper(mybatis,mybatis-plus)Entry各层之间的相互调用来完成,还有就是我们还可以去封装一些工具类和配置类来用到我们的开发中提供开发效率。
🚀作用
🌴 Controller(表现层): 负责接收前端请求,将请求转发给服务层(Service)处理,并返回视图或数据给前端。
🌴 Service(业务逻辑层): 负责处理具体的业务逻辑。在需要操作数据库的情况下,Service通过调用Mapper层进行数据交互。
另外,当你使用了Mybatis-plus的时候:我们可以直接在service调用对应的方法直接操作数据库。
🌴 Mapper(数据传输层): 负责数据交互,执行增删改查等操作。
这里仅限于我的想法,当你使用了mybatis的时候
那么mapper是用来定义你的接口方法,方法名它会去映射xml文件里面每个操作对应的id名,然后在通过xml文件里面的动态SQL来对数据进行增删改查等操作;
在mapper里面,我们也可以直接在Mapper使用@标签的方式(例如:@Select("SQL语句") )来写对应的SQL,那么我们就不需要用到xml文件,但是这种方式不是很提倡,当我们需要写大量的SQL的时候会导致我们不断的写重复的代码。

🌻Entry(实体类层): 主要存放实体类,用来映射数据库中的表结构,它的使用范围很广,那里需要它就在那里定义它。

🌿Utils(工具类): 存放一些常用的工具类或帮助类,例如字符串处理、日期处理、文件处理等。
Config 层(配置层):主要管理一些配置类,专门负责集中配置和初始化 Bean,处理全局性的设置。

🍉调用顺序
前端发送过来的请求先到Controller层,Controller接收到你的请求,然后调用Service层进行业务逻辑处理,Service层又去调用Mapper层,Mapper层进行和数据库关系映射,查询出来的数据原路返回到前端,如果不操作数据库就不需要Mapper映射。
在这里插入图片描述

前端请求数据到后端的方法

1️⃣ 浏览器通过URL把数据传递到后端Controller层的接口上;
例: http://localhost:8080/hello?name=hfc&password=123456
8080:后端端口号;hello需要请求的后端接口,name和password都是传递的参数
前端传递过来的参数名字,一定和后端接受的参数名字要对应;

2️⃣ 使用form 表单来进行数据的提交传递到后端
例:
我们用html写一个普通的form表单:
在这里插入图片描述
我们需要把表单里面的数据提交到后端的接口,通过来请求数据到后端接口,在后端接口我们也一样要把参数一一对应:

@RequestMapping("/stuService01")
public void stuService03(String user,String password,String address,String age,String sex){
   System.out.println(user+"\t"+password+"\t"+age+"\t"+address+"\t"+sex);
   System.out.println("你的请求已经到了后端-----");
}

默认情况下,前端传递数据到后端的请求方式是get;
GET请求是一种HTTP方法,用于从服务器检索数据。它将请求的数据附加在URL后面,以查询字符串的形式出现。
POST请求也是一种HTTP方法,用于向服务器发送数据。它将数据存储在请求体中,不会出现在URL中。
相同点:GET请求和POST请求底层都是基于TCP/IP协议实现的,使用二者中的任意一个,都可以实现客户端和服务器端的双向交互。
不同点:
1.定义:GET请求一般是获取数据,POST请求一般是提交数据。

2.安全性:GET请求,请求数据暴露在URL中;POST请求,数据存储在请求体中;相比之下POST请求更安全。(但从传输角度来讲,它们都不安全,HTTP是明文传输,如果在网络节点上抓包,就能完整地获取数据报文,安全传输可用HTTPS)
通过method我们就可以指定请求的方式。
在这里插入图片描述

3️⃣ 通过原生Ajax — 通过异步请求使用JS来获取相关的数据。
下面是两种请求的方式:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button id="but01">点击我提交数据</button>
</body>

<script>
	document.getElementById("but01").onclick=function (){
	  // 原生js来实现你的ajahttp://localhost:8080/stuServicex的方法;
		var xhr = new XMLHttpRequest();  //1.创建一个xmlhttprequest对象;他能够发送数据到你的后端
		// 2.打开你的链接要给那个地方传数据  以什么样的方式传
		xhr.open("GET","http://localhost:8080/stuService02?user=xiaoming&password=888888&")
		xhr.send()  //3. 发送你的请求
		// 4. 你的请求一旦到后端 就胡返回数据
		xhr.onload=function(){
			if(xhr.readyState==4) return
			console.log(xhr.responseText)  //5.后端返回的数据
		}
		}
</script>

</html>

Post方式进行数据传输:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button id="but01">点击我提交数据</button>
</body>

<script>
	document.getElementById("but01").onclick=function (){
	  // 原生js来实现你的ajahttp://localhost:8080/stuServicex的方法;
		var xhr = new XMLHttpRequest();  //1.创建一个xmlhttprequest对象;他能够发送数据到你的后端
		// 2.打开你的链接要给那个地方传数据  以什么样的方式传
		xhr.open("POST","http://localhost:8080/stuService03")
		xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xhr.send('user=xiaogou&password=88888')  //3. 发送你的请求A
		// 4. 你的请求一旦到后端 就胡返回数据
		xhr.onload=function(){
			if(xhr.readyState==4) return
			console.log(xhr.responseText)  //5.后端返回的数据
		}
		}
</script>


</html>

后端返回数据到前端的方式

当我们接收到前端的请求处理之后,我们可以通过不同的返回值类型返回结果给前端。
1️⃣使用@Controller 直接返回数据:返回的是字符串。

@RequestMapping("/index02")
public String  index02(){
   System.out.println("这个接口不需要返回任何的数据---只在你的控制台打印数据!!!");

   if (5+6>10){
       return "error.html";
   }else {
       return "success.html";
   }

2️⃣ 使用 @RestController注解 : 它结合了 @Controller 和 @ResponseBody,意味着它的返回值会直接作为 HTTP 响应体返回,而不是指向一个视图。

@RestController
@RequestMapping("/api")
public class MyController {

    @GetMapping("/user")
    public User getUser() {
        return new User("Alice", 30);
    }

    @GetMapping("/status")
    public ResponseEntity<String> getStatus() {
        return ResponseEntity.ok("OK");
    }
}

3️⃣返回ModelAndView:ModelAndView 是用于控制器方法返回的一个对象,它结合了模型数据和视图信息。这通常用于需要渲染视图(如 JSP、Thymeleaf 等模板引擎)并同时传递模型数据的情况。
它是SpringMVC的核心内容,主要用于把数据封装到model然后带着数据到view。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MyController {

    @GetMapping("/welcome")
    public ModelAndView welcome() {
        ModelAndView modelAndView = new ModelAndView("welcome"); // 视图名称
        modelAndView.addObject("message", "欢迎使用 Spring Boot!"); // 添加模型数据
        return modelAndView;
    }
}

4️⃣ Model来进行数据返回:Model 是一个接口,用于在控制器方法中传递数据到视图。它的主要作用是封装要展示的数据,使得这些数据可以在视图中访问和使用。Model 主要用于不需要单独返回视图的场景,特别是在处理表单提交或渲染动态内容时。比如说:表单提交后重定向:通常是重定向到另一个请求,而不是一个视图;AJAX 请求处理:通常只需返回数据而不是视图;处理错误:可能希望返回一个状态码而不是视图。

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {

    @GetMapping("/welcome")
    public String welcome(Model model) {
        model.addAttribute("message", "欢迎使用 Spring MVC!");
        return "welcome"; // 返回视图名称
    }
}

5️⃣ 返回的是model map: ModelMap 是 Spring 提供的一个类,继承自 LinkedHashMap,用于存储模型数据并将其传递到视图。它的用法与 Map 类似。

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {

    @GetMapping("/modelMapExample")
    public String modelMapExample(ModelMap modelMap) {
        modelMap.addAttribute("message", "使用 ModelMap 传递数据!");
        modelMap.addAttribute("items", List.of("Item1", "Item2", "Item3"));
        return "exampleView"; // 返回视图名称
    }
}

modelMap.addAttribute(“message”, “使用 ModelMap 传递数据!”):用于添加单个数据项。
modelMap.addAttribute(“items”, List.of(“Item1”, “Item2”, “Item3”)): 用于添加一个列表。
在这里插入图片描述

6️⃣ 返回的是一个对象:通常情况,我们会封装好一个实体类,在返回的时候直接返回这个对象,springboot中的@ResponseBody注解可以将对象自动转换为 JSON 格式。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/user")
    public User getUser() {
        // 创建一个 User 对象并返回
        return new User("Alice", 25);
    }
}

public class User {
    private String name;
    private int age;

    // 构造函数
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter 和 Setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

7️⃣ 返回的是一个被封装好的result 结果集:这个方法是我们项目开发的过程中最常见的方法,返回值得类型由我们来同统一封装,返回的时候我们直接把返回的结果放在我们封装好的返回结果集里面,大部分情况我们会在result里面封装: 状态码; 提示信息; 返回前端的数据;也有可能会有多层嵌套。
在这里插入图片描述
今天的分享就到这里啦,感谢大家的阅览,小江会一直与大家一起努力,文章中如有不足之处,你的支持是我前进的最大动力,请多多指教,感谢支持,持续更新中 ……

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

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

相关文章

计算机网络-MSTP的基础概念

前面我们大致了解了MSTP的由来&#xff0c;是为了解决STP/RSTP只有一根生成树导致的VLAN流量负载分担与次优路径问题&#xff0c;了解MSTP采用实例映射VLAN的方式实现多实例生成树&#xff0c;MSTP有很多的理论概念需要知道&#xff0c;其实与其它的知识一样理论复杂配置还好的…

php伪协议和move_uploaded_file、rename、copy等文件操作

move_uploaded_file、rename、copy 三个函数的区别&#xff1a; move_uploaded_file 函数是专门用于将通过 HTTP 上传的临时文件移动到指定位置的。如果你想要将一个已经存在的文件移动到另一个位置&#xff0c;而不是上传的文件&#xff0c;那么你应该使用 rename 函数或 co…

Lucas带你手撕机器学习——套索回归

好的&#xff0c;下面我将详细介绍套索回归的背景、理论基础、实现细节以及在实践中的应用&#xff0c;同时还会讨论其优缺点和一些常见问题。 套索回归&#xff08;Lasso Regression&#xff09; 1. 背景与动机 在机器学习和统计学中&#xff0c;模型的复杂性通常会影响其在…

完全透彻了解一个asp.net core MVC项目模板1

当我们使用Visual Studio 2022去新建一个基于asp.net core Web项目的时候&#xff0c;一般有三种选择&#xff0c;一种是空项目&#xff0c;一种是基于MVC的项目、再有一种就是基于包含Razor Pages实例的web应用。如下图&#xff1a; 今天&#xff0c;我们打算选择基于MVC模…

【无标题】2024年第五届 MathorCup 数学应用挑战赛——大数据竞赛赛题

2024年第五届 MathorCup 数学应用挑战赛——大数据竞赛赛题已发布~&#xff0c;本届初赛时间为&#xff1a;2024年10月25日18:00至2024年11月1日20:00。本次赛题分为A&#xff0c;B两道&#xff0c;所有参赛队从赛道 A、B 中任选一题作答。在报名系统内选择自己队伍的赛道时&am…

离散化算法简介

【离散化简介】 ★ 离散化是一种数据处理的技巧&#xff0c;本质上可以看成是一种“哈希”&#xff0c;其保证数据在哈希以后仍然保持原来的“全/偏序”关系。用来离散化的可以是大整数、浮点数、字符串等等。★ 离散化的本质&#xff0c;是映射。原理是将间隔很大的元素&#…

毫米波技术基础

什么是毫米波&#xff1f; 顾名思义&#xff0c;毫米波是波长 (λ) 约为 1 毫米&#xff08;更准确地说是 1 至 10 毫米&#xff09;的电磁波。使用方程式f c /λ 将该波长转换为频率&#xff0c;其中c是光速 (3 x 10 8 m/s)&#xff0c;得出 30-300 GHz 的频率范围。国际电信…

【STM32】内存管理

首先问个问题&#xff0c;你知道如何在LCD上显示SD卡文件浏览&#xff1f;-----需要读取所有文件名到内存&#xff0c;然后才能显示到LCD上。 一般的方法&#xff1a;是定义一个数组来存储文件名 1&#xff1a;需要知道最大文件名的长度 2&#xff1a;需要知道文件的个数。1…

OpenCV图像处理方法:腐蚀操作

腐蚀操作 前提 图像数据为二值的&#xff08;黑/白&#xff09; 作用 去掉图片中字上的毛刺 显示图片 读取一个图像文件&#xff0c;并在一个窗口中显示它。用户可以查看这个图像&#xff0c;直到按下任意键&#xff0c;然后程序会关闭显示图像的窗口 # cv2是OpenCV库的P…

使用Python中的jieba库进行简单情感分析

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;情感分析是一项重要的任务&#xff0c;它可以帮助我们理解文本背后的情感倾向。本文将通过一个简单的例子来介绍如何使用Python的jieba库对中文文本进行基本的情感分析。 1. 环境准备 首先&#xff0c;确保已经安装…

图像分割从基础到进阶:阈值化、K-means和Mean-Shift算法的应用

图像分割是计算机视觉中的一项关键技术&#xff0c;用来将图像划分为若干个 有意义 的区域&#xff0c;以便后续的图像处理和分析工作。根据任务的不同&#xff0c;图像分割可以进一步细分为语义分割、实例分割和全景分割&#xff1a; 语义分割 (Semantic Segmentation) 对图像…

SQL进阶技巧:如何求组内排除当前行的移动平均值?

目录 0 需求描述 2 数据准备 3 问题分析 4 小结 0 需求描述 -- 按照 日期,省份,等级 分组 求分数的平均值;但是需要剔除当前行的数据 2 数据准备 create table avgtest as (select 2024-10-24 as cdate, 广东 as province,深圳 as city, 2 as level, 200 as scoreunio…

后台管理系统的通用权限解决方案(六)SpringBoot整合Logback实现日志记录

1 Logback介绍 1.1 Logback的组件 由上图可知&#xff0c;Logback和Log4j都是slf4j规范的具体实现。在程序中直接调用Logback的API其实都是slf4j规范定义好的API&#xff0c;其底层则是真正的日志实现组件—Logback或者Log4j。 Logback构建在三个主要的类上&#xff1a;Logge…

厨艺爱好者的在线互动平台:Spring Boot实现

摘 要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的厨艺交流平台功能…

面试域——技术面试准备

摘要 来到技术面试这环节有两种情况&#xff0c;其一&#xff1a;这场技术面试可能就是一个面试官KPI面试&#xff08;就是面试工作量&#xff0c;这个面试你是不可能过。&#xff09;如今的就业环境下&#xff0c;人力资源部门也是有考核指标。如果遇到这样的面试你就放平心态…

2024年【焊工(中级)】最新解析及焊工(中级)考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;中级&#xff09;最新解析参考答案及焊工&#xff08;中级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及焊工&#xff08;中级&#xff09;操作证已考过的学员汇总&#xff0c;相对有…

VsCode | 修改内置字体为JetBrains Mono NL

文章目录 一、下载JetBrains Mono NL字体二、VsCode进行字体的设置 一、下载JetBrains Mono NL字体 字体下载 下载完成以后解压找到JetBrainsMono-2.304\fonts\ttf文件夹下&#xff0c;全选鼠标右键点安装即可。 注意&#xff1a;一定要全部安装&#xff0c;否则字体样式可…

【微服务】Nacos 注册中心

<!-- nacos 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${nacos.version}</version><type>pom</type><scope>import&l…

Wasserstein Generative Adversarial Networks

Abstract 我们引入了一种名为 WGAN 的新算法&#xff0c;它是传统 GAN 训练的替代方案。 在这个新模型中&#xff0c;我们表明我们可以提高学习的稳定性&#xff0c;摆脱模式崩溃等问题&#xff0c;并提供对调试和超参数搜索有用的有意义的学习曲线。 此外&#xff0c;我们表明…

pip命令行安装pytest 一直报错

其实就是切换不同镜像安装 我最终成功的是阿里云镜像 pip install --trusted-host mirrors.aliyun.com pytest 也可以用其他的 pip install -i https://pypi.org/simple pytest # 或者使用其他的镜像源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest