使用thymeleaf模板实现博客评论的异步刷新

最简单的一个要求:用户可以在博客下面进行评论,然后评论后点击提交后直接上传到数据库,并且局部刷新

这是前端页面的展示,使用的semanticUI进行构造出来的模型,另外semanticUi已经不再更新了。

进入重点:如果想要进行局部刷新,使用fragment标签进行更新,如下第二行可以看到将这一块的所有信息都给包裹起来。

		<div id="comment-container" class="ui teal segment">
<div th:fragment="commentList">
<div class="ui threaded comments" style="max-width: 100%">
<h3 class="ui dividing header">评论</h3>
<div class="comment" th:each="comment : ${comments}">
<a class="avatar">
<img src="https://unsplash.it/100/100?image=1005" th:src="@{${comment.avatar}}">
</a>
<div class="content" >
<a class="author" >
<span th:text="${comment.nickname}">Matt</span>
<div class="ui mini basic teal left pointing label m-padded-mini" th:if="${comment.adminComment}">
博主
</div>
</a>
<div class="metadata">
<span class="date" th:text="${#dates.format(comment.createTime,'yyyy-MM-dd HH:mm')}">Today at 5:42PM</span>
</div>
<div class="text" th:text="${comment.content}">
How artistic!
</div>
<div class="actions">
<a class="reply" data-commentid="1" data-commentnickname="Matt" th:attr="data-commentid=${comment.id},data-commentnickname=${comment.nickname}" onclick="reply(this)">回复</a>
</div>
</div> <!--第二层-->
<div class="comments" th:if="${#arrays.length(comment.replyComments)}>0">
<div class="comment" th:each="reply : ${comment.replyComments}">
<a class="avatar">
<img src="https://unsplash.it/100/100?image=1005" th:src="@{${reply.avatar}}">
</a>
<div class="content" >
<a class="author" >
<span th:text="${reply.nickname}">小红</span>&nbsp;
<div class="ui mini basic teal left pointing label m-padded-mini" th:if="${reply.adminComment}">
博主
</div>
<span th:text="|@ ${reply.parentComment.nickname}|" class="m-teal">@ 小白</span>
</a>
<div class="metadata">
<span class="date" th:text="${#dates.format(reply.createTime,'yyyy-MM-dd HH:mm')}">Today at 5:42PM</span>
</div>
<div class="text" th:text="${reply.content}">
How artistic!
</div>
<div class="actions">
<a class="reply" data-commentid="1" data-commentnickname="Matt" th:attr="data-commentid=${reply.id},data-commentnickname=${reply.nickname}" onclick="reply(this)">回复</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>

这里是提交表单的所有内容,由于评论是一个嵌套的类,即一个评论可以有多个评论,一层层的嵌套下来,在这里需要注意的是,使用springdatajpa的过程中,尽量避免使用Lombok插件中的@Data进行注解类,它会直接产生所有属性的toString,如果使用了,会报出stackoverflow异常,原因是你一直调用的toString方法,一直递归下去,导致栈溢出。最简便的方法就是破坏toString方法中的输出该类的信息,在这里就是不要输出Comment的信息。



提交评论信息的同时,需要设置一个字段证明是新提交的信息而不是回复别人的信息。<input type="hidden" name="parentComent.id" value="-1">这段代码就是实现这个功能,如果是评论博客而不是回复别人的信息,则直接将parentComent.id设置成-1,然后在后端进行判断如果是-1则是新评论。

        <div id="comment-form" class="ui form">
<input type="hidden" name="blog.id" th:value="${blog.id}">
<input type="hidden" name="parentComent.id" value="-1">
<div class="field">
<textarea name="content" placeholder="请输入评论信息..."></textarea>
</div>
<div class="fields">
<div class="field m-mobile-wide m-margin-bottom-small">
<div class="ui left icon input">
<i class="user icon"></i>
<input type="text" name="nickname" placeholder="姓名" th:value="${session.user}!= null ? ${session.user.nickName}">
</div>
</div>
<div class="field m-mobile-wide m-margin-bottom-small">
<div class="ui left icon input">
<i class="mail icon"></i>
<input type="text" name="email" placeholder="邮箱" th:value="${session.user}!= null ? ${session.user.email}">
</div>
</div>
<div class="field m-margin-bottom-small m-mobile-wide">
<button id="commentpost-btn" type="button" class="ui teal button m-mobile-wide"><i class="edit icon"></i>发布</button>
</div>
</div> </div>

js部分:

$(function () {
//当页面加载完成之后,需要把评论都给加载出来
$("#comment-container").load(/*[[@{/comments/{id}(id=${blog.id})}]]*/"comments/6");
}); $("#commentpost-btn").click(function () {
let boo=$('.ui.form').form('validate form');
if (boo){
postData();
console.log('校验成功');
}else{
console.log('校验失败');
}
});
function postData(){
$("#comment-container").load(/*[[@{/comments}]]*/"",{
"parentComment.id":$("[name='parentComent.id']").val(),
"blog.id":$("[name='blog.id']").val(),
"nickname":$("[name='nickname']").val(),
"email":$("[name='email']").val(),
"content":$("[name='content']").val()
},function (responseTxt,statusTxt,xhr) {
clearContent();
//滚动到最上面的评论 })
}
function clearContent(){
$("[name='content']").val('');
$("[name='parentComent.id']").val(-1);
$("[name='content']").attr("placeholder","请输入评论信息...");
} function reply(obj) {
let commentId=$(obj).data('commentid');
let nickNickname=$(obj).data('commentnickname');
$("[name='content']").attr("placeholder","@"+nickNickname).focus();
$("[name='parentComent.id']").val(commentId);
$(window).scrollTo($("#comment-form"),500);
}

以上着重讲下异步的过程:

commentpost-btn是提交按钮的id,有一个点击事件,点击后进行提交 postData()方法,然后找到div的id为comment-container的标签进行重新加载,加载的数据源为

/*[[@{/comments}]]*/

也就是找到controller层的url进行提交数据,然后将表单中的数据进行传递给后台,后台进行处理:

@PostMapping("/comments")
public String post(Comment comment, HttpSession session){
Long blogId = comment.getBlog().getId();
comment.setBlog(blogService.getBlog(blogId));
User user=(User)session.getAttribute("user");
if (user!=null){
comment.setAvatar(user.getAvatar());
comment.setAdminComment(true);
/* comment.setNickname(user.getNickName());*/
}else{
comment.setAvatar(avatar);
}
commentService.saveComment(comment);
return "redirect:/comments/" + blogId;
}

提交后在重定向给获取所有评论的controller的url:

@GetMapping("/comments/{blogId}")
public String comments(@PathVariable Long blogId, @NotNull Model model){
model.addAttribute("comments",commentService.listCommentByBlogId(blogId));
return "blog :: commentList";
}

这里将所有的数据全部返回给blog页面的commentList的fragment。

到此,异步刷新结束。

$(function () {
//当页面加载完成之后,需要把评论都给加载出来
$("#comment-container").load(/*[[@{/comments/{id}(id=${blog.id})}]]*/"comments/6");
});

这段代码的意思是党页面加载完成之后,将所有的评论都加载出来。

使用thymeleaf模板实现博客评论的异步刷新的更多相关文章

  1. Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客

    ==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...

  2. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  3. 使用WordPress模板搭建博客系统

    综述: 前端展示:外观--->主题. 功能模块:插件. 遇到的问题: 1:无法加载编辑器文件: 切换下不同的wordPress模板,可能缓存文件有问题. 2:注册功能:密码重设链接无效bug-- ...

  4. Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦

    个人博客 对于技术人员来说,拥有自己的个人博客应该是一件令人向往的事情,可以记录和分享自己的观点,想到这件事就觉得有意思,但是刚开始写博客的时候脑海中是没有搭建个人博客这一想法的,因为刚起步的时候连我 ...

  5. 利用Github Pages创建的Jekyll模板个人博客添加阅读量统计功能

    目录 前言 准备工作 模板文件修改 写在最后 内容转载自我自己的博客 @(文章目录) 前言 Jekyll 是一个简单的免费的 Blog 生成工具,类似 WordPress .它只是一个生成静态网页的工 ...

  6. 分享3一个博客HTML5模板

    1.材类别:半透明 博客html模板 个人博客 半透明html5博客主题,半透明,博客,博客html模板,个人博客,html5,灰色,半透明html5博客主题是一款适合用于个人博客主题,风格非常不错. ...

  7. Disqus评论框改造工程-Jekyll等静态博客实现Disqus代理访问

    文章最初发表于szhshp的第三边境研究所转载请注明 关于博客评论 六月多说挂了,地球人都知道. 倡言.云跟帖.来必力都很烂,地球人都知道. 转Disqus的都是人才. Disqus使用中遇到的问题 ...

  8. Android应用开发-小巫CSDN博客client之获取评论列表

    Android应用开发-小巫CSDN博客客户端之获取评论列表 上一篇博客介绍了博文具体内容的业务逻辑实现,本篇博客介绍小巫CSDN博客客户端的最后一项功能.获取评论列表,这个功能的实现跟前面获取文章列 ...

  9. 【五】将博客从jekyll迁移到了hexo

    本系列有五篇:分别是  [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面  [二]jekyll 的使用 :主要是jekyll的配置  [三]Markdo ...

随机推荐

  1. iOS 10 新增plist文件属性

    大概统计了一下需要加的一些字段列在下面: NSContactsUsageDescription -> 通讯录 NSMicrophoneUsageDescription -> 麦克风 NSP ...

  2. Linux保护机制

    RELRO(RELocation Read Only) 在Linux中有两种RELRO模式:"Partial RELRO" 和 "Full RELRO".Lin ...

  3. Maven 仓库搜索服务和私服搭建

    Maven 仓库搜索服务 使用maven进行日常开发的时候,一个常见问题就是如何寻找需要的依赖,我们可能只知道需要使用类库的项目名称,但是添加maven依赖要求提供确切的maven坐标,这时就可以使用 ...

  4. day12-模块导入

    # 一.import import demo # in demo.py -- 导入demo模块,执行里面的print语句. print(demo.money) # 8000000 -- 打印demo的 ...

  5. LGOJ4450 双亲数

    Description link \[\sum \limits_{i = 1}^A \sum \limits_{j = 1}^B [ \gcd(i, j) = d] \] 要\(O(\sqrt n)\ ...

  6. pandas常用小trick(持续更新)

    记录一下pandas常用的小技巧,时间长了干别的去了会忘记,记录一下: 1. 在处理数据过程中涉及到label和null的处理方法 # 方法一 df['height'][df.height < ...

  7. 苹果为啥不愿意替美国FBI解锁,这是一种创新态度?

    国外媒体报道,苹果计划对iPhone进行安全更新,最新版的iOS会在手机锁定一个小时后禁用手机充电和数据端口,这意味着,消费者丢失手机或者非正常离开iPhone之后,可以通过锁定手机,来避免手机数据被 ...

  8. SpringBoot开发二十-Redis入门以及Spring整合Redis

    安装 Redis,熟悉 Redis 的命令以及整合Redis,在Spring 中使用Redis. 代码实现 Redis 内置了 16 个库,索引是 0-15 ,默认选择第 0 个 Redis 的常用命 ...

  9. JAVA单例模式的几种写法

    /** * 单例模式懒汉式(双重检锁线程安全.JDK1.5之后) */ public class Singleton { private static volatile Singleton singl ...

  10. python3多线程应用详解(第一卷:线程的本质概念)

    之前我用过多线程的方式执行了爬虫程序,爬取了糗事百科的数据可以看到速率非常之快,就像正常一个人他要完一个汉堡,再吃喝一瓶水才能走,结果他边吃汉堡边喝水,速率一下加快了一样.首先我们看看什么是线程: 图 ...