基于 SpringBoot + jQuery 实现留言板功能

基于 Spring Boot + jQuery 实现留言板功能(完整实战教程)

本教程将手把手教你使用Spring Boot 3.x作为后端 +jQuery作为前端交互,实现一个简洁美观的留言板系统。功能包括:

  • 查看所有留言(分页可选)
  • 提交新留言(姓名 + 内容)
  • 实时刷新显示最新留言
  • 基本的表单校验

技术栈:Spring Boot(后端 REST API) + Thymeleaf(可选) + jQuery(Ajax 交互) + Bootstrap(美化)

项目结构概览
messageboard ├── src │ ├── main │ │ ├── java/com/example/messageboard │ │ │ ├── MessageboardApplication.java │ │ │ ├── entity/Message.java │ │ │ ├── repository/MessageRepository.java │ │ │ └── controller/MessageController.java │ │ └── resources │ │ ├── static/css/style.css │ │ ├── static/js/main.js │ │ └── templates/index.html │ └── ... └── pom.xml
步骤 1:创建 Spring Boot 项目

使用 https://start.spring.io/ 生成项目,添加依赖:

  • Spring Web
  • Spring Data JPA
  • H2 Database(嵌入式数据库,方便测试)
  • Thymeleaf(模板引擎)
  • Lombok(简化代码)
步骤 2:实体类与数据库配置

Message.java

packagecom.example.messageboard.entity;importjakarta.persistence.*;importlombok.Data;importjava.time.LocalDateTime;@Entity@DatapublicclassMessage{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;privateStringname;@Column(columnDefinition="TEXT")privateStringcontent;privateLocalDateTimecreateTime=LocalDateTime.now();}

application.yml(resources 下)

spring:datasource:url:jdbc:h2:mem:messageboarddriver-class-name:org.h2.Driverusername:sapassword:h2:console:enabled:true# 访问 http://localhost:8080/h2-console 查看数据jpa:hibernate:ddl-auto:updateshow-sql:true
步骤 3:Repository 接口
packagecom.example.messageboard.repository;importcom.example.messageboard.entity.Message;importorg.springframework.data.jpa.repository.JpaRepository;importorg.springframework.data.jpa.repository.Query;importjava.util.List;publicinterfaceMessageRepositoryextendsJpaRepository<Message,Long>{@Query("SELECT m FROM Message m ORDER BY m.createTime DESC")List<Message>findAllOrderByCreateTimeDesc();}
步骤 4:Controller 实现 REST API
packagecom.example.messageboard.controller;importcom.example.messageboard.entity.Message;importcom.example.messageboard.repository.MessageRepository;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.http.ResponseEntity;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.*;importjava.util.List;@ControllerpublicclassMessageController{@AutowiredprivateMessageRepositorymessageRepository;// 主页(返回 Thymeleaf 模板)@GetMapping("/")publicStringindex(Modelmodel){return"index";// 返回 templates/index.html}// 获取所有留言(按时间倒序)@GetMapping("/api/messages")@ResponseBodypublicList<Message>getMessages(){returnmessageRepository.findAllOrderByCreateTimeDesc();}// 提交新留言@PostMapping("/api/messages")@ResponseBodypublicResponseEntity<?>addMessage(@RequestBodyMessagemessage){if(message.getName()==null||message.getName().trim().isEmpty()||message.getContent()==null||message.getContent().trim().isEmpty()){returnResponseEntity.badRequest().body("姓名和内容不能为空!");}messageRepository.save(message);returnResponseEntity.ok(message);}}
步骤 5:前端页面(index.html)

放在src/main/resources/templates/index.html

<!DOCTYPEhtml><htmllang="zh-CN"xmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1"><title>留言板</title><linkhref="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"rel="stylesheet"><linkrel="stylesheet"th:href="@{/css/style.css}"></head><bodyclass="bg-light"><divclass="container py-5"><divclass="row"><divclass="col-lg-8 mx-auto"><divclass="card shadow"><divclass="card-header bg-primary text-white"><h3class="mb-0">留言板</h3></div><divclass="card-body"><!-- 留言表单 --><formid="messageForm"><divclass="mb-3"><labelclass="form-label">姓名</label><inputtype="text"class="form-control"id="name"required></div><divclass="mb-3"><labelclass="form-label">留言内容</label><textareaclass="form-control"id="content"rows="4"required></textarea></div><buttontype="submit"class="btn btn-primary">提交留言</button></form><hr><!-- 留言列表 --><h5class="mt-4">所有留言</h5><divid="messageList"class="mt-3"><!-- jQuery 动态加载 --></div></div></div></div></div></div><scriptsrc="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script><scriptth:src="@{/js/main.js}"></script></body></html>
步骤 6:jQuery 实现前后端交互(main.js)

放在src/main/resources/static/js/main.js

$(document).ready(function(){// 页面加载时获取留言loadMessages();// 提交表单$('#messageForm').submit(function(e){e.preventDefault();constname=$('#name').val().trim();constcontent=$('#content').val().trim();if(!name||!content){alert('姓名和内容不能为空!');return;}$.ajax({url:'/api/messages',type:'POST',contentType:'application/json',data:JSON.stringify({name:name,content:content}),success:function(newMessage){$('#name').val('');$('#content').val('');// 新留言插入到最顶部prependMessage(newMessage);alert('留言成功!');},error:function(){alert('提交失败,请重试');}});});// 加载所有留言functionloadMessages(){$.get('/api/messages',function(messages){$('#messageList').empty();messages.forEach(message=>{appendMessage(message);});});}// 添加一条留言到列表functionappendMessage(message){consttime=newDate(message.createTime).toLocaleString();consthtml=`<div class="border rounded p-3 mb-3 bg-white"> <div class="d-flex justify-content-between"> <strong>${escapeHtml(message.name)}</strong> <small class="text-muted">${time}</small> </div> <p class="mt-2 mb-0">${escapeHtml(message.content)}</p> </div>`;$('#messageList').append(html);}// 新留言插入顶部functionprependMessage(message){consttime=newDate(message.createTime).toLocaleString();consthtml=`<div class="border rounded p-3 mb-3 bg-white animate__animated animate__fadeIn"> <div class="d-flex justify-content-between"> <strong>${escapeHtml(message.name)}</strong> <small class="text-muted">${time}</small> </div> <p class="mt-2 mb-0">${escapeHtml(message.content)}</p> </div>`;$('#messageList').prepend(html);}// 防止 XSS 攻击functionescapeHtml(text){return$('<div>').text(text).html();}// 可选:每10秒自动刷新// setInterval(loadMessages, 10000);});
步骤 7:可选美化样式(style.css)
body{min-height:100vh;}.animate__fadeIn{animation:fadeIn 0.5s;}@keyframesfadeIn{from{opacity:0;transform:translateY(-10px);}to{opacity:1;transform:translateY(0);}}
运行与测试
  1. 启动项目 → 访问 http://localhost:8080
  2. 输入姓名和内容 → 点击提交
  3. 新留言实时显示在顶部
  4. 刷新页面数据持久(H2 内存数据库,重启会丢失,可换 MySQL)
扩展建议
  • 换成 MySQL 持久化存储
  • 添加分页(Pageable)
  • 支持回复、删除(需登录)
  • 使用 Vue/React 替换 jQuery
  • 添加验证码防刷

这个留言板项目简单优雅,非常适合初学者练习 Spring Boot + 前端 Ajax 交互!

需要完整源码或进一步升级(如登录、富文本编辑器),随时告诉我,我继续帮你完善!🚀

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

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

相关文章

【Java毕设源码分享】基于springboot+vue的校园失物招领平台的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

程序员副业新思路:用Image-to-Video接单变现

程序员副业新思路&#xff1a;用Image-to-Video接单变现 从技术到变现&#xff1a;Image-to-Video的商业潜力 在AI生成内容&#xff08;AIGC&#xff09;爆发式增长的今天&#xff0c;静态图像生成已趋于成熟&#xff0c;而动态视觉内容的需求正在快速崛起。短视频平台、广告创…

基于S7-200Smart PLC的恒压供水程序与485通讯样例+人机触摸屏操作实践案例

S7-200Smart 恒压供水程序样例485通讯样例 触 摸屏样例子。 1.此程序样例为一拖二恒压供水样例&#xff0c;采用S7-200Smart PLC和smart 700触摸屏人机与abb变频器485通讯执行变频器PID实现恒压供水&#xff0c;商品同样包含S7-200PLC程序 2.程序为实际操作项目案例程序&#…

Java后端如何对接AI?Image-to-Video API调用示例

Java后端如何对接AI&#xff1f;Image-to-Video API调用示例 &#x1f4cc; 背景与目标&#xff1a;Java服务集成图像转视频AI能力 随着生成式AI技术的快速发展&#xff0c;越来越多企业希望将动态内容生成能力嵌入现有系统。本文聚焦于一个实际工程场景&#xff1a;如何在Java…

度量标准重构:从“点击诱饵”到“知识节点”的评估体系设计

引言&#xff1a;评估危机与范式重构的必要性 在信息过载的数字时代&#xff0c;内容评估体系正面临系统性失效。传统以点击率&#xff08;CTR&#xff09; 为核心的度量标准&#xff0c;催生了“标题党”和浅层内容的泛滥&#xff1b;新兴的参与度指标&#xff08;停留时间、…

如何快速掌握STIX Two字体:面向学术写作新手的完整教程

如何快速掌握STIX Two字体&#xff1a;面向学术写作新手的完整教程 【免费下载链接】stixfonts OpenType Unicode fonts for Scientific, Technical, and Mathematical texts 项目地址: https://gitcode.com/gh_mirrors/st/stixfonts STIX Two字体是专为科学、技术和数学…

生成效果差?输入图像选择的4个黄金法则

生成效果差&#xff1f;输入图像选择的4个黄金法则 引言&#xff1a;为什么输入图像如此关键&#xff1f; 在使用 Image-to-Video 图像转视频生成器&#xff08;基于 I2VGen-XL 模型&#xff09;的过程中&#xff0c;许多用户发现即使调整了提示词和参数&#xff0c;生成的视频…

HTML5+CSS3+JavaScript实现高木同学圣诞树GalGame完整开发指南

HTML5 CSS3 JavaScript 实现高木同学圣诞树 GalGame 完整开发指南 《擅长捉弄的高木同学》&#xff08;Teasing Master Takagi-san&#xff09;是一部受欢迎的动漫&#xff0c;高木同学以调皮可爱著称。本教程将指导你使用纯前端技术&#xff08;HTML5、CSS3、JavaScript&am…

Sambert-HifiGan在智能家居中的应用:让设备开口说话

Sambert-HifiGan在智能家居中的应用&#xff1a;让设备开口说话 引言&#xff1a;语音合成如何赋能智能设备的“人性化”表达 随着智能家居生态的不断演进&#xff0c;用户对交互体验的要求已从“能用”升级为“好用、自然、有情感”。传统的机械式语音播报已无法满足现代家庭…

西门子博图 WinCC V15 大型自动化系统项目实战分享

西门子博图WinCC V 15大型自动化系统项目&#xff0c;包含多台服务器客户端项目&#xff0c;系统采用安全1516F -3PN/DP 外挂多台精智面板&#xff0c;1200PLC ET200SP 变频器 对整个工艺过程PID DCS 闭环过程控制&#xff0c;如何调整温度压力流量液位等参数&#xff0c;实用工…

揭秘9款AI论文工具:免费写开题报告的隐藏技巧,导师不会说!

警告&#xff1a; 接下来的内容&#xff0c;可能会颠覆你对论文写作的认知。90%的学生还在为开题报告和文献综述熬夜秃头&#xff0c;而少数“聪明人”已经用上了导师圈秘而不宣的“黑科技”&#xff0c;效率提升十倍不止。这些工具的真正玩法&#xff0c;导师绝不会在课堂上公…

突破限制:OpenCore Legacy Patcher让旧款Mac焕发新生的完整指南

突破限制&#xff1a;OpenCore Legacy Patcher让旧款Mac焕发新生的完整指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 当你的MacBook Pro或iMac被苹果官方标记为&quo…

【Java毕设全套源码+文档】基于springboot的物流配送中心信息化管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

从传统TTS迁移到Sambert-HifiGan:完整迁移指南与注意事项

从传统TTS迁移到Sambert-HifiGan&#xff1a;完整迁移指南与注意事项 引言&#xff1a;为何要从传统TTS转向Sambert-HifiGan&#xff1f; 在中文语音合成&#xff08;Text-to-Speech, TTS&#xff09;领域&#xff0c;传统系统长期依赖拼接法或参数化模型&#xff08;如Tacotro…

Linux 端口与连接一眼看清|使用服务器部署 Socket 监控工具 somo

在 Linux 运维、服务器管理、故障排查 的日常工作中,你一定遇到过这些场景: 🤔 这个端口到底是谁在监听? 🔍 线上连接数突然暴涨,却不知道是哪条服务 🧵 想实时看 socket 变化,却只能反复敲 ss / netstat 🧠 输出一大堆,看着费劲、不直观 直到我开始用 somo,…

ddu官网技术参考:工业级图像处理流水线集成AI视频模块

ddu官网技术参考&#xff1a;工业级图像处理流水线集成AI视频模块 Image-to-Video图像转视频生成器 二次构建开发by科哥 在当前AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;快速发展的背景下&#xff0c;静态图像向动态内容的转化成为多媒体创作的重…

文旅宣传创新:景区照片转沉浸式游览视频生成实践

文旅宣传创新&#xff1a;景区照片转沉浸式游览视频生成实践 引言&#xff1a;从静态影像到动态体验的文旅内容升级 在数字时代&#xff0c;游客对旅游目的地的认知不再局限于文字介绍或静态图片。随着短视频平台的兴起和用户注意力的碎片化&#xff0c;如何将传统景区宣传素材…

openspeedy加速I2V推理:TensorRT优化让生成快一倍

openspeedy加速I2V推理&#xff1a;TensorRT优化让生成快一倍 Image-to-Video图像转视频生成器 二次构建开发by科哥 在AIGC领域&#xff0c;图像到视频&#xff08;Image-to-Video, I2V&#xff09;生成是当前最具挑战性也最富潜力的方向之一。基于扩散模型的I2V技术能够将静态…

Sambert-HifiGan多情感语音合成的实时流式处理

Sambert-HifiGan多情感语音合成的实时流式处理 引言&#xff1a;中文多情感语音合成的技术演进与现实需求 随着智能客服、虚拟主播、有声阅读等交互场景的普及&#xff0c;传统“机械朗读”式的语音合成已无法满足用户对自然度和情感表达的需求。中文多情感语音合成技术应运而…

【Java毕设源码分享】基于springboot+vue的学生就业信息管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…