news 2026/6/10 21:05:00

基于 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/6/10 14:19:58

Sambert-HifiGan情感控制秘籍:如何合成不同情绪的语音

Sambert-HifiGan情感控制秘籍&#xff1a;如何合成不同情绪的语音 引言&#xff1a;中文多情感语音合成的技术演进与现实需求 随着智能客服、虚拟主播、有声阅读等应用场景的不断扩展&#xff0c;传统“机械化”的语音合成已无法满足用户对自然度和情感表达的需求。中文多情感…

作者头像 李华
网站建设 2026/6/10 14:21:37

【Java毕设全套源码+文档】基于springboot的网络云端日记本系统设计与实现(丰富项目+远程调试+讲解+定制)

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

作者头像 李华
网站建设 2026/6/10 14:27:35

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

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

作者头像 李华
网站建设 2026/6/10 20:38:48

人物行走卡顿?步数与帧率协同调整方案

人物行走卡顿&#xff1f;步数与帧率协同调整方案 引言&#xff1a;动态生成中的流畅性挑战 在基于 I2VGen-XL 模型的图像转视频&#xff08;Image-to-Video&#xff09;应用中&#xff0c;用户常遇到一个典型问题&#xff1a;人物动作不连贯、行走过程出现明显卡顿。尤其是在生…

作者头像 李华
网站建设 2026/6/10 0:34:40

Sambert-HifiGan语音合成模型的增量训练

Sambert-HifiGan语音合成模型的增量训练&#xff1a;中文多情感场景下的高效优化实践 &#x1f4cc; 引言&#xff1a;为何需要增量训练&#xff1f; 在语音合成&#xff08;TTS&#xff09;的实际落地过程中&#xff0c;预训练模型虽强&#xff0c;但难以覆盖所有业务需求。…

作者头像 李华
网站建设 2026/6/10 15:58:03

Sambert-HifiGan极限挑战:能否处理万字长文本语音合成?

Sambert-HifiGan极限挑战&#xff1a;能否处理万字长文本语音合成&#xff1f; 引言&#xff1a;中文多情感语音合成的现实需求 随着AI语音技术在智能客服、有声阅读、虚拟主播等场景的广泛应用&#xff0c;用户对自然度高、情感丰富、支持长文本的中文语音合成系统提出了更高要…

作者头像 李华