news 2026/2/13 6:59:15

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 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 交互!

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/12 6:15:44

Sambert-HifiGan高级教程:自定义情感语音合成实战

Sambert-HifiGan高级教程&#xff1a;自定义情感语音合成实战 引言&#xff1a;中文多情感语音合成的现实需求 在智能客服、虚拟主播、有声读物等应用场景中&#xff0c;单一语调的语音合成已无法满足用户体验需求。用户期望听到更具表现力、富有情绪变化的声音——如喜悦、悲…

作者头像 李华
网站建设 2026/2/11 17:11:23

宠物自助新体验:JAVA无人共享洗澡系统源码

以下是一套基于JAVA的宠物无人共享洗澡系统源码方案&#xff0c;该方案整合了微服务架构、物联网通信、AI情绪识别、多端交互等核心能力&#xff0c;适用于宠物店、社区共享场景的无人化改造&#xff1a;一、系统架构设计系统采用四层分布式架构&#xff0c;包括用户端、API网关…

作者头像 李华
网站建设 2026/2/6 12:54:39

如何用Sambert-HifiGan为电子导览生成解说语音?

如何用Sambert-HifiGan为电子导览生成解说语音&#xff1f; 引言&#xff1a;语音合成在电子导览中的价值与挑战 随着智慧文旅、智能展馆和无人化服务的快速发展&#xff0c;高质量的中文语音解说系统已成为提升用户体验的核心组件。传统的预录音频维护成本高、扩展性差&#x…

作者头像 李华
网站建设 2026/2/1 22:53:01

安装包分发方式:Docker镜像还是Conda环境?

安装包分发方式&#xff1a;Docker镜像还是Conda环境&#xff1f; 背景与问题提出 在深度学习和AI应用开发中&#xff0c;如何高效、稳定地部署复杂依赖的项目一直是工程实践中的核心挑战。以 Image-to-Video 图像转视频生成器 为例&#xff0c;该项目基于 I2VGen-XL 模型构建&…

作者头像 李华
网站建设 2026/2/3 21:14:44

Sambert-Hifigan中文文档完善度测评:新手友好指数达95%

Sambert-Hifigan中文文档完善度测评&#xff1a;新手友好指数达95% &#x1f4ca; 引言&#xff1a;为何语音合成需要“情感”&#xff1f; 在智能客服、有声书生成、虚拟主播等应用场景中&#xff0c;机械式朗读已无法满足用户体验需求。用户期待的是更具表现力、富有情感色…

作者头像 李华
网站建设 2026/2/12 4:31:23

游戏开发辅助:角色立绘转动作短片应用

游戏开发辅助&#xff1a;角色立绘转动作短片应用 Image-to-Video图像转视频生成器 二次构建开发by科哥 在游戏开发中&#xff0c;角色动画是提升沉浸感与叙事表现力的核心要素。然而&#xff0c;传统2D角色动画制作流程繁琐、成本高昂&#xff0c;尤其对于独立开发者或小型团队…

作者头像 李华