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

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) returnconsole.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) returnconsole.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.rhkb.cn/news/455161.html

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

相关文章

Docker部署MySQL主从复制

1. 主从复制概念及优势 1.1 概念 MySQL主从复制是一种数据库复制技术&#xff0c;它允许将一个数据库服务器&#xff08;主服务器&#xff09;上的数据更改复制到一个或多个数据库服务器&#xff08;从服务器&#xff09;。这种技术在数据库管理和维护中扮演着重要的角色&…

Ubuntu 2张4090,显卡安装,无法双屏显示

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; Ubuntu20.04 安装nvidia显卡 在已经安装好nvidia显卡的情况下&#xff1a; 单屏幕无法修改屏幕分辨率 无法双屏显示 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 单屏幕无法…

【Origin科技绘图】最新Origin2024中文版软件安装教程

Origin是由OriginLab公司开发的一个科学绘图、数据分析软件,支持在MicrosoftWindows下运行。Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计,信号处理,曲线拟合以及峰值分析。Origin中的曲线拟合是采用基Levernberg-Marquardt算法(LMA)的非线性最小二乘法拟合…

理工科考研想考计算机,湖南大学、重大、哈工大威海、山东大学,该如何选择?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 计算机对理工科同学来说&#xff0c;还是性价比很高的&#xff0c;具有很大的优势&#xff01; 一、就业前景广阔 高需求行业 在当今数字化时代&#xff0c;计算机技术几乎渗透到了各个领域&#xff0c;无论是互联网…

LabVIEW提高开发效率技巧----插入式架构

随着LabVIEW项目规模的扩大和系统复杂性的增加&#xff0c;传统的单一代码架构难以应对后期维护和功能扩展的需求。插入式架构&#xff08;Plug-In Architecture&#xff09;作为一种模块化设计方式&#xff0c;通过动态加载和运行子VI&#xff0c;使系统功能更加灵活、模块化&…

Django从请求到响应

视图 一个视图函数&#xff0c;简称视图&#xff0c;是一个简单的Python函数 def view_name() 定义视图函数view_name() URL的常用配置 path函数&#xff1a; path(route,view,name,**kwargs) route&#xff1a;RUL匹配规则 view&#xff1a;视图函数 name&#xf…

【部署篇】RabbitMq-03集群模式部署

一、准备主机 准备3台主机用于rabbitmq部署&#xff0c;文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署&#xff0c;只需下载对应的版本进行相同的操作。 主机IP角色说明192.168.128.31种子节点192.168.128.32普通节点192.16…

React 分装webSocket

背景 AI 实时对话 需要流式数据 React Hooks 写法。新建WebSocket.tsx 放在根目录components import { useCallback, useRef, useState } from react;type MessageHandler (message: MessageEvent) > void; type ErrorHandler (event: Event) > void;export functi…

技术成神之路:设计模式(二十二)命令模式

介绍 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;允许将请求&#xff08;命令&#xff09;封装为对象&#xff0c;从而使您可以使用不同的请求、队列或记录请求日志&#xff0c;以及支持可撤销操作。 1. 定义 命令模式将一个请求封装为一个…

S32DS for ARM GPIO实践

S32DS操作&#xff1a; 一、新建项目 打开S32DS&#xff0c;FIle–>NEW–> S32DS Application Project选择对应芯片&#xff0c;写入项目名然后下一步 选择对应的SDK&#xff0c;Debugger选带有PE字眼的&#xff0c;点击完成 配置GPIO&#xff0c;双击Components界面下的…

【MySQL】详解MySQL数据类型

一、数据类型 各类型的数值范围&#xff1a; 在MySQL中&#xff0c;整型可以指定是有符号的和无符号的&#xff0c;默认是有符号的。 可以通过UNSIGNED来说明某个字段是无符号的。对于int类型可能存放不下的数据&#xff0c;尽量不使用unsigned&#xff0c;unsigned int 同样可…

pytorch dataloader学习

import torch from torch.utils.data import Dataset, DataLoader import numpy as np torch.manual_seed(1) # 自定义数据集 class CustomDataset(Dataset):def __init__(self):# 创建一些示例数据&#xff08;100个样本&#xff0c;每个样本包含10个特征&#xff09;self.dat…

推荐一个开源非线性视频编辑器:Kdenlive

Kdenlive是一个开源的视频编辑软件&#xff0c;项目始于约2003年。它基于Qt和KDE框架库构建&#xff0c;大部分视频处理由MLT框架完成&#xff0c;同时依赖其他开源项目如FFmpeg、frei0r、movit、ladspa、sox等。 软件特点&#xff1a; - 多轨视频编辑&#xff1a;支持多个音频…

MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询

一、生成学生信息脚本 利用该脚本可以生成任意个学生信息&#xff0c;包括学号、姓名、班级、年级、专业、课程名称、课程成绩等信息&#xff0c;此处生成2万名学生&#xff0c;学生所有信息都是给定范围后随机生成。 生成学生信息后&#xff0c;再来对学生信息进行简单查询。…

论文阅读:Guided Linear Upsampling

今天介绍一篇有趣的文章&#xff0c;Guided Linear Upsampling&#xff0c;基于引导的线性上采样&#xff0c;这是发表在 ACM transaction on Graphic 的一篇工作。 Abstract 引导上采样是加速高分辨率图像处理的一种有效方法。在本文中&#xff0c;文章作者提出了一种简单而…

【2024】【字节青训营】:字节青训营入营测试题——Java版本(已提交通过)

目录 简单题目 计算x到y的最小步数 环状 DNA 序列的最小表示法 Base32 解码和编码 打点计时器 兔群繁殖之谜 完美整数 找出整数数组中占比超过 一半 的数 找出最长的神奇数列 找单独的数 字符串最短循环字串 二进制反码转换问题 中等题目 简单四则运算 数字翻译…

【图解版】力扣第146题:LRU缓存

力扣第146题&#xff1a;LRU缓存 一、LRU算法1. 基本概念2. LRU 和 LFU 的区别&#xff1a;3. 为什么 LRU 不需要记录使用频率&#xff1f; 二、Golang代码实现三、代码图解1. LRUCache、DLinkedNode两个结构体2. 初始化结构体对象3. addToHead函数4. removeNode函数5. moveToH…

rust grpc demo

文章目录 1. 创建项目2. 配置proto2.1 配置Cargo.toml, 内容如下&#xff1a;2.2 创建文件proto/hello.proto, 内容如下&#xff1a;2.3 添加build.rs文件&#xff0c; 内容如下&#xff1a;2.4 项目结构如下&#xff1a;2.5 编译proto文件 3.0 处理服务3.1 项目引入3.2 添加sr…

多模态大语言模型(MLLM)-Deepseek Janus

论文链接&#xff1a;https://arxiv.org/abs/2410.13848 代码链接&#xff1a;https://github.com/deepseek-ai/Janus 本次解读Janus: Decoupling Visual Encoding for Unified Multimodal Understanding and Generation 前言 Deepseek出品&#xff0c;必属精品。 创新点 传…

docker容器无法连接宿主机mysql排查

1、docker无法访问宿主机 在docker容器内&#xff0c;需要访问当前docker容器的网关&#xff0c;例如172.xx.0.1&#xff0c;即可访问宿主机&#xff0c;因此需要保证docker的网络配置正确 查看当前docker容器的网关&#xff1a; docker inspect 你的容器名或者容器id 显示…