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

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里面封装: 状态码; 提示信息; 返回前端的数据;也有可能会有多层嵌套。
在这里插入图片描述
今天的分享就到这里啦,感谢大家的阅览,小江会一直与大家一起努力,文章中如有不足之处,你的支持是我前进的最大动力,请多多指教,感谢支持,持续更新中 ……

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

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

相关文章

数据库->增删改查

目录 一、CRUD简介 二、Create新增 1.单行数据插入 2.查询 3. 多行数据插入 4.执行本机的SQL脚本插入 三、Retrieve检索 1.全列查询 2.指定列查询 3.查询字段为表达式 3.1 常量表达式 3.2列的值与常量运算 3.3列与列之间的运算 3.4为列指定别名 4.结果查询去重…

高等数学-宋浩版2.0-映射

映射&#xff1a;X,Y为非空集合&#xff0c;存在法则F,对X(原像)中每个元素X&#xff0c;按法则F&#xff0c;在Y中有唯一元素与之对应&#xff0c;F为x到Y&#xff08;镜像&#xff09;的映射。f:X->Y X原像&#xff0c;Y像&#xff0c;x定义域&#xff0c;Df,Rf &#x…

php后端学习,Java转php

遇到前后端跨域 php解决跨域问题可以加上下面的代码&#xff1a; header(“Access-Control-Allow-Origin:*”); 并且查看自己的数据库信息是否连接成功。 从Java转php 个人感受php跟偏向前端&#xff0c; 写后端逻辑时没有像java又springboot工具方便。 但是和前端联调很方便…

BUUCTF之web篇

第一题 [极客大挑战 2019]EasySQL 打开靶机后可以看到这是一个登陆的页面 我们可以尝试两种方式登录 弱口令爆破&#xff08;burpsuite&#xff09; 通过SQL注入里的万能密码来跳过账户和密码验证的过程 这里就需要万能密码aor true # 在这里单引号的作用是结束用户名或者密码…

Python基于TensorFlow实现简单循环神经网络回归模型(SimpleRNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 Simple RNN是一种基础的循环神经网络&#xff0c;它能够处理序列数据&#xff0c;例如文本、时间序…

React写关键字高亮的三个方案

1.js正则replaceAlldangerouslySetInnerHTML{{ __html: xxx }}危险属性 步骤最简单,但是是危险属性,不推荐使用,项目中实在没有头绪,可以使用它应急 通过useMemo计算得到新的状态值,赋值给dangerouslySetInnerHTML属性的__html 关键代码: const [state1, setState1] useSt…

【网络原理】网络地址转换----NAT技术详解

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 我们在 IP协议 一文中介绍过&#xff0c;由于IPv4协议中 IP地址只有32位&#xff0c;导致最多只能表示 42亿9千万个IP地址。但我们需要通过IP地址来标识网络上的每一个设备&#x…

java核心技术点都有哪些

1. 面向对象编程&#xff08;OOP&#xff09; 核心概念&#xff1a;类、对象、继承、封装、多态。 比喻&#xff1a;面向对象编程就像是在搭建一个积木城堡。类&#xff08;Class&#xff09;是城堡的设计图纸&#xff0c;它定义了城堡的结构和功能&#xff1b;对象&#xff08…

传输层TCP

报头 1.报头和有效载荷如何分离将&#xff0c;有效载荷向上交付&#xff1f; tcp有个标准报头长度为20&#xff0c;那是不是以为我们可以像udp一样分离依靠报头大小去分离&#xff0c;我们仔细去看我们报头中还有个选项没包含到。 我们还有个首部长度&#xff0c;四位可以表…

测试代理IP的有效性和可用性

使用代理IP的有效性和可用性直接关系到用户的工作效率&#xff0c;尤其是在进行数据抓取、网络爬虫和保护个人隐私等场景中。 一、测试代理IP的必要性 代理IP的可用性测试是确保代理服务正常运行的重要步骤。测试代理IP的必要性主要体现在以下几个方面&#xff1a; 提升工作…

【Docker命令】日常使用的Docker命令

Docker常用命令 1、基础命令2、容器管理3、镜像管理推送镜像 4、网络管理5、数据管理 1、基础命令 - docker run&#xff1a;运行一个容器,--name 指定容器的名称&#xff0c;-i 获取标准输入输出&#xff0c;-t显示在终端&#xff0c;-d放到后台运行&#xff0c;--rm容器停止…

STM32传感器模块编程实践(十) 2.4G NRF24L01通信模块简介及驱动源码

文章目录 一.概要二.NRF24L01模块介绍三.NRF24L01模块主要特性四.国产射频芯片SI24R1介绍五.模块接线说明六.参考原理图七.通讯协议介绍八.STM32单片机与NRF24L01模块实现远无线通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九.源代码工程下载十.小结 一.概要 NRF24…

InnoDB 存储引擎<二>页结构和行结构

目录 ⻚结构 ⾏结构 ⻚结构 ⻚在MySQL运⾏的过程中起到了⾮常重要的作⽤&#xff0c;为了能发挥更好的性能&#xff0c;可以结合⾃⼰系统的 业务场景和数据⼤⼩&#xff0c;对⻚相关的系统变量进⾏调整&#xff0c;⻚的⼤⼩就是⼀个⾮常重要的调整项 1.⻚的⼤⼩可以设置吗&…

RHCSA笔记一

常见的操作系统 UNIX 、 Linux 类、 Windows 类 搭建Linux学习环境 如何安装linux操作系统&#xff1a; 安装独立的 Linux 系统&#xff0c;不再安装其他操作系统。 安装 Windows 与 Linux 并存的多操作系统&#xff0c;启动时通过菜单选择要启动的操作系统。 在虚拟机中安…

十一、数据库配置

一、Navicat配置 这个软件需要破解 密码是&#xff1a;123456&#xff1b; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句&#xff0c;会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…

探索华为云DataArts Insight:数据智能的新引擎

在快速发展的数字化时代&#xff0c;数据已经成为企业最宝贵的资产。如何有效地管理和利用这些数据&#xff0c;以实现商业价值&#xff0c;是每个企业需要面对的重要挑战。华为云DataArts Insight平台应运而生&#xff0c;作为一款强大的数据智能解决方案&#xff0c;它帮助企…

Kotlin-Annotations详解

在Kotlin中&#xff0c;注解&#xff08;Annotations&#xff09;是用于为代码提供元数据的一种机制。这些元数据可以被编译器、IDE&#xff08;集成开发环境&#xff09;或其他工具使用&#xff0c;以生成代码、执行编译时检查或提供运行时信息。 注解通常被用于类、方法、属…

算法的学习笔记—左旋转字符串(牛客JZ58)

&#x1f600;前言 在程序设计中&#xff0c;字符串处理问题屡见不鲜&#xff0c;其中“字符串左旋”是一种常见操作&#xff0c;今天我们一起来探讨一个经典的左旋转字符串题目&#xff0c;以及一种优雅的解决方案——三步翻转法。 &#x1f3e0;个人主页&#xff1a;尘觉主页…

anaconda jupyter notebook themes install jupyter notebook样式更改,取消页面头部,全屏展示!

现在已经有很多相关的文章了&#xff0c;我只说简单的解决步骤&#xff1a; 我用的是anaconda的 jupyter notebook&#xff0c;这个要更改主题&#xff0c;方法有&#xff1a; 一&#xff0c;最简单&#xff1a;用 jupyter notebook自带的setting>Theme>自己选&#xff1…

模型 是否树(逻辑树之三)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。决策分支&#xff0c;是与否的逻辑路径。 1 是否树的应用 1.1 个人IP打造中的是否树应用案例&#xff1a;社交媒体营销策略 在个人品牌建设中&#xff0c;是否树可以帮助个人识别关键的决策点&#…