效果如下
我们是从0开始一步一步做这个项目的,里面的各种问题,我也会以第一人称视角来解决,希望你们看了能感同身受,有所收获。


你所创建的所有package或者class 必须和启动类在同一个路径上,启动类是什么:就是一开始就自动生成的,并且以Application结尾的那个类。
所以我们必须在leavemessage_blogs下面建包,或者建类。
对于测试代码和开发的规则也是一样的,要在 leavemessage_blogs下面建包或者建类。
由于文件不能导入,所以前端的代码直接自己新建就行了,然后复制我的代码到你的前端html文件里。注意:你新建的文件可能有一些自动生成的代码,复制我的代码直接覆盖就行了。



留言板 留言板
输入后点击提交, 会将信息显示下方空白处
谁: 对谁: 说什么: 搞完前端的文件配置以后我们就能测试了,启动程序,然后用浏览器访问这个html页面,看看我们复制的对不对
看到这个以后就证明我们复制的没问题,如果你此时直接在该网页输入数据测试,也是没有错误的,但那是前端的实现,一刷新就没了,我们是要使用后端实现的,所以我们还要改代码,设计后端接口,熟悉理解后端接口才是此项目的目的。

需求分析:
后端需要提供两个服务
定义留⾔对象 MessageInfo 类,我们将实体类都单独放在包model里,这是应用分层里的规范。


package com.example.leavemessage_blogs.model; import lombok.Data; @Data public class MessageInfo { private String from; private String to; private String message; } 依据应用分层的概念,我们依旧是建了一个package存放controller类。
package com.example.leavemessage_blogs.Controller; import com.example.leavemessage_blogs.model.MessageInfo; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; @RequestMapping("/message") @RestController public class MessageController { //创建一个list来储存数据 public List list = new ArrayList<>(); @RequestMapping("getList") public List getList(){ return list; } @RequestMapping("/addInfo") public boolean addInfo(MessageInfo messageInfo){ if(StringUtils.hasLength(messageInfo.getFrom())&& StringUtils.hasLength(messageInfo.getTo())&& StringUtils.hasLength(messageInfo.getMessage())){ list.add(messageInfo); return true; } return false; } } 写完controller代码后我们就能测试了
可以看出来没有问题,因为此时我们还没有添加元素呢,所以返回为空
可以看到:也没有太大的问题,如果你感觉看不到效果,不放心,你可一再次调用getList接口,看看这个信息是否被添加进来了。
为了验证,我们调用getList接口验证信息是否被添加进来了,可以看到:没有问题
为什么是修改而不是编写:因为我们以后端的开发为主要,所以前端的代码能大概看懂就好,不要求掌握,以后的前端代码也是以开源的形式直接复制粘贴的。
load(); function load() { $.ajax({ type: "get", url: "/message/getList", success: function (result) { for (var message of result) { var divE = "" + message.from + "对" + message.to + "说:" + message.message + ""; $(".container").append(divE); } } }); } 
这个代码能复制就复制,看懂个大概就行了

可以将这段代码直接覆盖掉原来的submit函数,也可以自己看着注释的思路敲一遍,这里面有很多重复的代码,能直接复制的很多,可以尝试一下,并不费劲。
function submit(){ //1. 获取留言的内容 var from = $('#from').val(); var to = $('#to').val(); var say = $('#say').val(); if (from== '' || to == '' || say == '') { return; } //在这里将请求发送到后端,也是采用ajax的方式 $.ajax({ type: "post", url: "message/addInfo",//这里的url不要弄错了 data:{ from:from, to:to, message:say }, success:function (ret){ //如果后端返回了true证明添加成功了,就将数据全部添加到网页上 if(ret){ //这里面都是添加页面元素的操作,了解即可 //2. 构造节点 var divE = ""+from +"对" + to + "说:" + say+""; //3. 把节点添加到页面上 $(".container").append(divE); //4. 清空输入框的值 $('#from').val(""); $('#to').val(""); $('#say').val(""); }else{ alert("留言失败!") } } }); } 以上就是该简易表白墙的所有内容,此时我们就能启动程序,再次访问message.html页面,看看他是否能正常运行。






此时我们提交一个留言就会显示一个留言,这样就成功了,此时无论我们怎么刷新数据都不会掉了,因为此时的数据是保存在内存中的,是由后端来做的,而不是由前端直接管理,这也能作为评判我们是用后端代码实现的还是用前端代码实现的。
说到这里我们会发现,如果这样搞,那我们每次重启后端代码之后,我们以前存储的数据就会丢失,这是因为,我们将数据都储存在内存中了,那么有没有一种方式能够长久的保存我的数据呢?这样我每次启动后端的时候数据就不会丢失了。这样的方式当然是有的:那就使用数据库来存储那些信息,由于以往的单纯的sql传递十分繁琐,所以我们会使用Mybatis来操作数据库,这种方式更加方便,这也是我们的表白墙进阶要使用的方式。

如果在此过程中,遇到什么报错了,欢迎评论留言,我们一起解决。