当前位置: 首页 > news >正文

【JavaEEj进阶】 Spring实现留言板

文章目录

  • 🎍预期结果
  • 🍀前端代码
  • 🎄约定前后端交互接⼝
    • 🚩需求分析
    • 🚩接⼝定义
  • 🌳实现服务器端代码
    • 🚩lombok
  • 🌲服务器代码实现
  • 🌴运⾏测试

🎍预期结果

可以发布并显示
在这里插入图片描述
显示后实现输入框的清除
在这里插入图片描述
并且再次刷新后,不会清除下面的缓存

🍀前端代码

这里由于博主主要从事后端相关工作,这里就不做过多讲解了

相关知识点可以参考博主写的【JavaEE初阶】 JavaScript相应的WebAPI中表白墙的书写

如果有看不懂的地方也可以找博主,博主也略知一二。代码如下:
在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>留言板</title><style>.container {width: 350px;height: 300px;margin: 0 auto;/* border: 1px black solid; */text-align: center;}.grey {color: grey;}.container .row {width: 350px;height: 40px;display: flex;justify-content: space-between;align-items: center;}.container .row input {width: 260px;height: 30px;}#submit {width: 350px;height: 40px;background-color: orange;color: white;border: none;margin: 10px;border-radius: 5px;font-size: 20px;}</style>
</head><body>
<div class="container"><h1>留言板</h1><p class="grey">输入后点击提交, 会将信息显示下方空白处</p><div class="row"><span>:</span> <input type="text" name="" id="from"></div><div class="row"><span>对谁:</span> <input type="text" name="" id="to"></div><div class="row"><span>说什么:</span> <input type="text" name="" id="say"></div><input type="button" value="提交" id="submit" onclick="submit()"><!-- <div>AB: hello</div> -->
</div><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>load();function load() {$.ajax({type: "get",url: "/message/getList",success: function (result) {for (var message of result) {var divE = "<div>" + message.from + "对" + message.to + "说:" + message.message;$(".container").append(divE);}}});}function submit() {
//1. 获取留⾔的内容var from = $('#from').val();var to = $('#to').val();var say = $('#say').val();if (from == '' || to == '' || say == '') {return;}$.ajax({type: "post",url: "/message/publish",data: {from: from,to: to,message: say},success: function (result) {if (result) {
//2. 构造节点var divE = "<div>" + from + "对" + to + "说:" + say + "</div>";
//3. 把节点添加到⻚⾯上$(".container").append(divE);
//4. 清空输⼊框的值$('#from').val("");$('#to').val("");$('#say').val("");} else {alert("发表留⾔失败!");}}});}</script>
</body></html>

🎄约定前后端交互接⼝

🚩需求分析

后端需要提供两个服务

  1. 提交留⾔:⽤⼾输⼊留⾔信息之后,后端需要把留⾔信息保存起来

  2. 展⽰留⾔:⻚⾯展⽰时,需要从后端获取到所有的留⾔信息

🚩接⼝定义

  1. 获取全部留⾔

全部留⾔信息,我们⽤List来表⽰,可以⽤JSON来描述这个List数据.

请求:

GET /message/getLis

响应:JSON格式

[{"from": "⿊猫","to": "⽩猫","message": "喵"},{"from": "⿊狗","to": "⽩狗","message": "汪"},//...
]

浏览器给服务器发送⼀个GET /message/getList 这样的请求,就能返回当前⼀共有哪些留⾔记录.结果以 json 的格式返回过来

  1. 发表新留⾔

请求:body也为JSON格式

POST /message/publish
{"from": "⿊猫","to": "⽩猫","message": "喵"
}

响应格式:JSON格式

true

🌳实现服务器端代码

🚩lombok

这个环节为大家推荐一个工具lombok,它的出现会使我们开发起来更加简单便捷

Lombok是⼀个Java⼯具库,通过添加注解的⽅式,简化Java的开发

首先我们需要在我们的pom.xml文件下面添加以下依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

那它有什么作用呢?又怎么使用呢?

比如以下代码

public class Person {private int id;private String name;private String password;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 getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

我们在获取属性时要用大量的get和set,看起来非常的不好看。而当我们使用了lombok后,代码如下;

@Data
public class Person {private int id;private String name;private String password;
}

这样也可以达到相同的效果,不仅如此@Data 注解还会帮助我们⾃动⼀些⽅法,包含getter/setter,equals,toString等

如果觉得这样使用太粗暴了,lombok也提供了一些细化的方法

注解作⽤
@Getter⾃动添加 getter ⽅法
@Setter⾃动添加 setter ⽅法
@ToString⾃动添加 toString ⽅法
@EqualsAndHashCode⾃动添加 equals 和 hashCode ⽅法
@NoArgsConstructor⾃动添加⽆参构造⽅法
@AllArgsConstructor⾃动添加全属性构造⽅法,顺序按照属性的定义顺序
@NonNull属性不能为null
@RequiredArgsConstructor⾃动添加必需属性的构造⽅法,final+@NonNull的属性为必需

它们之间的关系可以理解为:

@Data=@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor+@NoArgsConstructor

但是呢,每一次都需要引入依赖,太麻烦了,所以我们可以下载相关的插件EditStarter,安装过程与使用如下:

  1. 安装插件EditStarter,重启Idea
    在这里插入图片描述
  2. 在pom.xml⽂件中,单击右键,选择Generate,操作如下图所⽰

在这里插入图片描述
进⼊Edit Starters的编辑界⾯,添加对应依赖即可.
在这里插入图片描述

🌲服务器代码实现

第一步:定义留⾔对象MessageInfo类

@Data
public class MessageInfo {private String from;private String to;private String message;
}

第二步:创建MessageController类

这里我们使⽤List来存储留⾔板信息

@RequestMapping("/message")
@RestController
public class MessageController {private List<MessageInfo> messageInfos = new ArrayList<>();@RequestMapping("/getList")public List<MessageInfo> getList() {System.out.println("===============");return messageInfos;}@RequestMapping("/publish")public boolean publish(MessageInfo messageInfo) {System.out.println(messageInfo);if (StringUtils.hasLength(messageInfo.getFrom())&& StringUtils.hasLength(messageInfo.getTo())&& StringUtils.hasLength(messageInfo.getMessage())) {messageInfos.add(messageInfo);return true;}return false;}
}

🌴运⾏测试

此时在浏览器通过URL http://127.0.0.1:8080/messagewall.html 访问服务器,即可看到
在这里插入图片描述

因为此时我们每次提交的数据都会发送给服务器.每次打开⻚⾯的时候⻚⾯都会从服务器加载数据.因此及时关闭⻚⾯,数据也不会丢失

但是数据此时是存储在服务器的内存中( private List< Message > messages = newArrayList< Message >(); ),⼀旦服务器重启,数据仍然会丢失.要想数据不丢失,可以把数据存储在数据库中

⭕总结
关于《【JavaEEj进阶】 Spring实现留言板》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

相关文章:

【JavaEEj进阶】 Spring实现留言板

文章目录 &#x1f38d;预期结果&#x1f340;前端代码&#x1f384;约定前后端交互接⼝&#x1f6a9;需求分析&#x1f6a9;接⼝定义 &#x1f333;实现服务器端代码&#x1f6a9;lombok &#x1f332;服务器代码实现&#x1f334;运⾏测试 &#x1f38d;预期结果 可以发布并…...

react、Vue打包直接运行index.html不空白方法

react vue 在根目录下创建 vue.config.js 文件&#xff0c;写入 module.exports {publicPath: ./, }...

SpringBoot-01

Spring Boot是一个开源的Java框架&#xff0c;用于快速构建独立的、可执行的、生产级的Spring应用程序。它基于Spring框架&#xff0c;简化了Spring应用程序的配置和部署过程&#xff0c;使开发者能够更快速地创建高效、可扩展的应用。 Spring Boot具有以下特点&#xff1a; 简…...

「解析」Jetson配置 git服务

这两天感冒了在家休养&#xff0c;想着把之前买的 Jetson 开发板用起来&#xff0c;买Jetson的初衷就是用来学习Linux系统&#xff0c;顺道可以部署算法&#xff0c;以及一些其他需求&#xff0c;相比树莓派而言&#xff0c;Jetson开发相对更贵&#xff0c;但是其配备了英伟达的…...

uniapp使用安装sass

1.首先你要安装node-sass npm install node-sass --save-dev2.安装sass-loader npm install sass-loader --save-dev3.修改style标签&#xff0c;声明使用sass <style lang"scss" scoped>...

ClickHouse学习笔记(六):ClickHouse物化视图使用

文章目录 1、ClickHouse 物化视图2、物化视图 vs 普通视图3、物化视图的优缺点4、物化视图的用法4.1、基本语法4.2、准备表结构4.3、准备数据4.3、查询结果 1、ClickHouse 物化视图 ClickHouse 的物化视图是一种查询结果的持久化&#xff0c;它的存在是为了带来查询效率的提升…...

华为OD机试真题-最小矩阵宽度-2023年OD统一考试(C卷)

题目描述: 给定一个矩阵,包含N*M个整数,和一个包含K个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数。 输入描述: 第一行输入两个正整数N,M,表示矩阵大小。 接下来N行M列表示矩阵内容。 下一行包含一个正整数K。 下一行包含…...

java stream distinct根据list某个字段去重

项目场景&#xff1a; java stream distinct根据list某个字段去重&#xff0c;普通List简单去重&#xff1a; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors;public class TestMain {public static void main(String[] args) {List&l…...

超精简虚拟机镜像

前经常有人问我要极度精简的win 7 虚拟机镜像&#xff0c;开个贴直接发吧&#xff0c;这次包括 win10 和 win7 镜像,另有一个 win 8 win7 镜像压缩包只有 300Mb&#xff0c; win 10 镜像 有 800Mb&#xff0c; win 8 有 700Mb 系统极度精简&#xff0c;可以运行 qq 微信&#…...

【JVM】常用命令

一、前言 Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的基础设施&#xff0c;它负责将Java字节码转换为本地机器代码并执行。在开发过程中&#xff0c;我们经常需要使用一些命令来监控和管理JVM的性能和状态。本文将详细介绍6个常用的JVM命令&#xff1a;jps、jstat…...

第 7 章 排序算法

文章目录 7.1 排序算法的介绍7.3 算法的时间复杂度7.3.1 度量一个程序(算法)执行时间的两种方法7.3.2 时间频度7.3.3 时间复杂度7.3.4 常见的时间复杂度7.3.5 平均时间复杂度和最坏时间复杂度 7.4 算法的空间复杂度简介7.4.1 基本介绍 7.5 冒泡排序7.5.1 基本介绍7.5.2 演示冒泡…...

机器人持续学习基准LIBERO系列7——计算并可视化点云

0.前置 机器人持续学习基准LIBERO系列1——基本介绍与安装测试机器人持续学习基准LIBERO系列2——路径与基准基本信息机器人持续学习基准LIBERO系列3——相机画面可视化及单步移动更新机器人持续学习基准LIBERO系列4——robosuite最基本demo机器人持续学习基准LIBERO系列5——…...

基于 Level set 方法的医学图像分割

摘 要 医学图像分割是计算机辅助诊断系统设计中的关键技术。对于医学图像分割问题,它一般可分为两部分:(l)图像中特定目标区域(器官或组织)的识别;(2)目标区域完整性的描述与提取。相比于其他图像,医学图像的复杂性和多样性,使得传统的基于底层图像信息的分割方法很难取得好的…...

【C++入门】C++ STL中string常用函数用法总结

目录 前言 1. string使用 2. string的常见构造 3. string类对象的访问及遍历 迭代器遍历&#xff1a; 访问&#xff1a; 4. string类对象的容量操作 4.1 size和length 4.2 clear、empty和capacity 4.3 reserve和resize reserve resize 5. string类对象的修改操作 push_back o…...

Rust变量、常量声明与基本数据类型

Rust是一门系统级别的编程语言&#xff0c;注重安全性、性能和并发。在这篇博客中&#xff0c;我们将介绍Rust中的变量、常量声明以及基本数据类型&#xff0c;并通过示例说明每一种类型的用法。 变量声明 在Rust中&#xff0c;使用 let 关键字声明变量。变量默认是不可变的&…...

【MATLAB】 SSA奇异谱分析信号分解算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 SSA奇异谱分析&#xff08;Singular Spectrum Analysis&#xff09;是一种处理非线性时间序列数据的方法&#xff0c;可以对时间序列进行分析和预测。 它基于构造在时间序列上的特定矩阵的奇异值分解&#…...

Nginx+Tomcat负载均衡、动静分离以及Nginx负载均衡和四层代理

目录 NginxTomcat负载均衡、动静分离 Nginx 负载均衡模式&#xff1a; Nginx 四层代理配置&#xff1a; NginxTomcat负载均衡、动静分离 Nginx 服务器&#xff1a;192.168.80.10:80 Tomcat服务器1&#xff1a;192.168.80.100:80 Tomcat服务器2&#xff1a;192.168.80.101:80…...

Vue3中provide,inject使用

一&#xff0c;provide,inject使用&#xff1a; 应用场景&#xff1a;向孙组件传数据 应用Vue3碎片&#xff1a; ref&#xff0c;reactive&#xff0c;isRef&#xff0c;provide, inject 1.provide,inject使用 a.爷组件引入 import {ref,provide} from vue const drinkListre…...

Django命令模块

这篇文章我们主要来介绍一下关于 Django 的命令模块&#xff0c;我们经常会使用到&#xff0c;比如以下几个常用的命令&#xff0c;都属于 Django 的命令模块&#xff1a; python manage.py makemigrations python manage.py migrate python manage.py startapp python manage…...

【linux驱动开发】在linux内核中注册一个杂项设备与字符设备以及内核传参的详细教程

文章目录 注册杂项设备驱动模块传参注册字符设备 开发环境&#xff1a; windows ubuntu18.04 迅为rk3568开发板 注册杂项设备 相较于字符设备&#xff0c;杂项设备有以下两个优点: 节省主设备号:杂项设备的主设备号固定为 10&#xff0c;在系统中注册多个 misc 设备驱动时&…...

别再买成品模块了!手把手教你用LM2596S-ADJ自制一个可调稳压电源(附PCB布线避坑指南)

从零打造高精度可调电源&#xff1a;LM2596S-ADJ实战设计与避坑全攻略 当你需要为创客项目或实验设备搭建一个灵活可靠的电源系统时&#xff0c;成品模块虽然方便&#xff0c;却失去了DIY的乐趣和深度定制的可能。本文将带你深入LM2596S-ADJ芯片的核心设计&#xff0c;从元器件…...

HAMi:面向云原生AI基础设施的异构计算统一管理平台

HAMi&#xff1a;面向云原生AI基础设施的异构计算统一管理平台 【免费下载链接】HAMi Heterogeneous GPU Sharing on Kubernetes 项目地址: https://gitcode.com/GitHub_Trending/ha/HAMi 随着AI工作负载在Kubernetes集群中的大规模部署&#xff0c;异构计算资源管理已成…...

AI赋能“一人公司”创业热潮:机遇背后潜藏哪些风险?

“一人公司”创业范式席卷全国从苏州到深圳&#xff0c;从成都到上海&#xff0c;一种名为OPC&#xff08;One Person Company&#xff0c;一人公司&#xff09;的创业范式正以前所未有的速度席卷全国。全国已涌现出超过700个OPC社区&#xff0c;其中&#xff0c;WeOPC平台聚集…...

强烈推荐!这个 Skill 画架构图质量超高,一句话出图

做技术这行&#xff0c;总有些事是真心懒得做的&#xff0c;画架构图算一个。 不是不重要&#xff0c;是太麻烦。要么打开 http://draw.io 从头拖组件&#xff0c;要么用 Mermaid 写一堆语法还要反复调位置&#xff0c;最后搞出来的效果差强人意&#xff0c;发给别人一看&…...

面试必问:RAG准确率提升实战:从60%到85%的全链路优化

✅ 面试官您好&#xff0c;关于如何将 RAG 系统的准确率从 60% 提升到 85%&#xff0c;我认为这不是一个简单的调参问题&#xff0c;而是一场贯穿数据、检索、生成、评估全链路的系统性工程。我通常会按照“诊断 → 优化 → 验证”三步走策略来推进&#xff0c;具体如下&#x…...

C++ 程序内存分区

C 程序运行时&#xff0c;操作系统会给进程分配虚拟地址空间&#xff0c;在 32/64 位系统中&#xff0c;逻辑上划分为 代码区、全局静态区、常量区、栈区、堆区 5 个区域。下面从存储内容、管理方式、生命周期、权限、代码示例、常见坑逐一拆解。一、代码区&#xff08;Text 段…...

2026实测|5款AI论文写作软件深度对比(含降重/AIGC检测/价格)

根据2026年最新的实测数据&#xff0c;我为你整理了一份好用的AI论文写作软件清单&#xff0c;按适用场景分类&#xff0c;你可以根据自己的需求快速匹配。 &#x1f4ca; 核心工具速览对比 工具名称核心优势最佳适用场景价格参考推荐指数PaperRed中文全流程、降重合规、文献真…...

构造函数、this指向和原型链机制

今天在刷力扣 [146. LRU 缓存](https://leetcode.cn/problems/lru-cache/) 的时候&#xff0c;遇到了原型链的写法&#xff0c;想想这个写法我正式开发中从来都没有用过&#xff0c;到底是个什么玩意&#xff1f;遂将各个节点和变量都定义在外面&#xff0c;但是代码居然报错啦…...

如何快速解锁百度网盘资源:baidupankey智能查询工具终极指南

如何快速解锁百度网盘资源&#xff1a;baidupankey智能查询工具终极指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘分享链接的提取码而烦恼吗&#xff1f;每次遇到需要提取码的资源&#xff0c;都要在多个…...

KMS_VL_ALL_AIO:智能激活脚本的完整使用指南

KMS_VL_ALL_AIO&#xff1a;智能激活脚本的完整使用指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO KMS_VL_ALL_AIO是一款基于微软官方KMS协议开发的智能激活脚本&#xff0c;为Windows系统…...