SpringBoot采用AJAX实现异步发布帖子详解

目录
  • 1. AJAX
  • 2. 功能描述
  • 3. 开发流程
  • 4. 引入AJAX依赖
  • 5. Util
  • 6. Mapper
  • 7. Service
  • 8. Controller
  • 9. JavaScript

1. AJAX

  • Asynchronous JavaScript and XML
  • 异步的 JavaScript 与 XML 不是一门新技术,而是一个新术语
  • 使用 AJAX,网页能够将增量更新呈现在页面上,而不需要刷新整个页面
  • 虽然 X 代表 XML,但是目前 JSON 的使用比 XML 更加普遍

2. 功能描述

  • 使用 jQuery 发送AJAX请求
  • 采用AJAX请求,实现发布帖子的功能

用户点击【发布帖子】按钮后,页面出现一个弹窗,此时后面的页面并没有刷新。

点击【发布帖子】按钮后,publishBtn 按钮会执行 index.js 中的 publish() 方法,跳转到:CONTEXT_PATH + “/discuss/add”;会执行控制器类 DiscussPostControlleraddDiscussPost()方法。里面调用Service: discussPostService,该service又调用了 discussPostMapper,通过其对应的 SQL 语句将帖子内容插进 discuss_post 表中。

3. 开发流程

  • 工具类:编写多个(重载)JSONString 相关的方法
  • 数据库交互:在 xxxmapper.xml 文件中编写对应的 SQL 语句,并在 Dao 层的接口中声明 CRUD 方法
  • 核心业务逻辑:在 Service 层中编写,由该层调用 Dao 层的方法实现对数据层的操作
  • 视图层:控制器 + 页面

4. 引入AJAX依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.58</version>
</dependency>

5. Util

util/CommunityUtil.java

在用户登录之前,不显示【发布帖子】按钮;

在用户登录之后,才显示【发布帖子】按钮,可以进行相关操作。

//得到JSON格式的字符串
//输入为:编号、提示、业务数据
public static String getJSONString(int code, String msg, Map<String, Object> map){
    JSONObject json = new JSONObject();
    json.put("code",code);
    json.put("msg",msg);
    if (map!=null){
        for (String key: map.keySet()) {
            json.put(key, map.get(key));
        }
    }
    return json.toJSONString();
}
//得到JSON格式的字符串(重载1:无业务数据)
public static String getJSONString(int code, String msg){
    return getJSONString(code, msg, null);
}
//得到JSON格式的字符串(重载2:无提示、业务数据)
public static String getJSONString(int code){
    return getJSONString(code, null, null);
}

6. Mapper

dao/DiscussPostMapper.java

添加了 insertDiscussPost() 方法,功能为插入帖子

package com.nowcoder.community.dao;
import com.nowcoder.community.entity.DiscussPost;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface DiscussPostMapper {
    List<DiscussPost> selectDiscussPosts(int userId, int offset, int limit);
    // @Param注解用于给参数取别名
    // 如果只有一个参数,并且在<if>里使用,则必须加别名
    int selectDiscussPostRows(@Param("userId") int userId);
    int insertDiscussPost(DiscussPost discussPost);
}

mapper/discusspost-mapper.xml

编写对应的 SQL 语句

<insert id="insertDiscussPost" parameterType="DiscussPost">
	insert into discuss_post(<include refid="insertFields"></include>)
	values (#{userId},#{title},#{content},#{type},#{status},#{createTime},#{commentCount},#{score})
</insert>

7. Service

service/DiscussPostService.java

编写 addDiscussPost(),同时注入过滤器

package com.nowcoder.community.service;
import com.nowcoder.community.dao.DiscussPostMapper;
import com.nowcoder.community.entity.DiscussPost;
import com.nowcoder.community.util.SensitiveFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.util.HtmlUtils;
import java.util.List;
@Service
public class DiscussPostService {
    @Autowired
    private DiscussPostMapper discussPostMapper;
    @Autowired
    private SensitiveFilter sensitiveFilter;
    public List<DiscussPost> findDiscussPosts(int userId, int offset, int limit) {
        return discussPostMapper.selectDiscussPosts(userId, offset, limit);
    }
    public int findDiscussPostRows(int userId) {
        return discussPostMapper.selectDiscussPostRows(userId);
    }
    public int addDiscussPost(DiscussPost post) {
        if (post == null) {
            throw new IllegalArgumentException("参数不能为空!");
        }
        // 转义HTML标记
        post.setTitle(HtmlUtils.htmlEscape(post.getTitle()));
        post.setContent(HtmlUtils.htmlEscape(post.getContent()));
        // 过滤敏感词
        post.setTitle(sensitiveFilter.filter(post.getTitle()));
        post.setContent(sensitiveFilter.filter(post.getContent()));
        return discussPostMapper.insertDiscussPost(post);
    }
}

8. Controller

package com.nowcoder.mycommunity.controller;
import com.nowcoder.mycommunity.entity.DiscussPost;
import com.nowcoder.mycommunity.entity.User;
import com.nowcoder.mycommunity.service.DiscussPostService;
import com.nowcoder.mycommunity.util.CommunityUtil;
import com.nowcoder.mycommunity.util.HostHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Date;
//处理所有与发帖相关的请求
@Controller
@RequestMapping("/discuss")
public class DiscussPostController {
    @Autowired
    private DiscussPostService discussPostService;
    @Autowired    //获取当前用户
    private HostHolder hostHolder;
    @RequestMapping(path = "/add", method = RequestMethod.POST)
    @ResponseBody
    public String addDiscussPost(String title, String content) {
        User user = hostHolder.getUser();
        if (user == null){
            // 403表示没有权限
            return CommunityUtil.getJSONString(403, "你还没有登录哦!");
        }
        DiscussPost post = new DiscussPost();
        post.setUserId(user.getId());
        post.setTitle(title);
        post.setContent(content);
        post.setCreateTime(new Date());
        discussPostService.addDiscussPost(post);
        return CommunityUtil.getJSONString(0, "发布成功");
    }
}

9. JavaScript

index.js

在 js 文件中编写【发布按钮】对应的函数 publish()

$(function(){
	$("#publishBtn").click(publish);
});
function publish() {
	$("#publishModal").modal("hide");
	// 获取标题和内容
	var title = $("#recipient-name").val();
	var content = $("#message-text").val();
	// 发送异步请求(POST)
	$.post(
	     CONTEXT_PATH + "/discuss/add",
	    {"title":title,"content":content},
	    function(data) {
	        data = $.parseJSON(data);
	        // 在提示框中显示返回消息
	        $("#hintBody").text(data.msg);
	        // 显示提示框
            $("#hintModal").modal("show");
            // 2秒后,自动隐藏提示框
            setTimeout(function(){
                $("#hintModal").modal("hide");
                // 刷新页面
                if(data.code == 0) {
                    window.location.reload();
                }
            }, 2000);
	    }
	);
}

到此这篇关于SpringBoot采用AJAX实现异步发布帖子详解的文章就介绍到这了,更多相关SpringBoot AJAX内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • AJAX SpringBoot 前后端数据交互的项目实现

    目录 1.Ajax概述 2.基于JQuery的AJAX语法 1. Ajax 概述 Ajax 的英文全称是 ”Asynchronous JavaScript and XML“,即 ”异步的 JavaScript 和 XML“.其核心是通过 JavaScript 的 XMLHttpRequest 对象,以一种异步的方式,向服务器发送数据请求,并且通过该对象接收请求返回的数据,从而实现客户端与服务器端的数据交互. 优点:Ajax 能够刷新指定的页面区域(局部刷新),而不是刷新整个页面,从而减少客户端和

  • SpringBoot结合Ajax实现登录页面实例

    目录 一. Ajax 1.1 Ajax介绍 1.2 异步的作用 二.SpringBoot应用Ajax 2.1 开发配置 2.2 创建user表 2.3 MVC三层架构 2.4 前端测试页面 2.5 测试结果 总结 一. Ajax 1.1 Ajax介绍 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = 异步 JavaScript 和 XML AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,可以使网页实现异步更新.这意味着可以在不

  • 关于SpringBoot在有Ajax时候不跳转的问题解决

    目录 问题描述 解决方法 原因梳理 总结 问题描述 最近在尝试使用SpringBoot做一个后台管理系统,由于目前还没有学会VUE,所以前端页面采用的 thymeleaf+ajax的模式.前两天在开发登录页的时候遇到了一个问题,登录之后按照正常流程应该是要在控制器里跳转到首页的,但是我的登录页死活不跳转. 控制器的逻辑也是没有问题的 @Controller class LoginController { @Resource lateinit var adminService: AdminServ

  • SpringBoot解决ajax跨域问题的方法

    SpringBoot解决ajax跨域,供大家参考,具体内容如下 一.第一种方式 1.编写一个支持跨域请求的 Configuration import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.anno

  • SpringBoot采用AJAX实现异步发布帖子详解

    目录 1. AJAX 2. 功能描述 3. 开发流程 4. 引入AJAX依赖 5. Util 6. Mapper 7. Service 8. Controller 9. JavaScript 1. AJAX Asynchronous JavaScript and XML 异步的 JavaScript 与 XML 不是一门新技术,而是一个新术语 使用 AJAX,网页能够将增量更新呈现在页面上,而不需要刷新整个页面 虽然 X 代表 XML,但是目前 JSON 的使用比 XML 更加普遍 2. 功能描

  • SpringBoot集成WebSocket长连接实际应用详解

    前言: 一.WebSocket之初出茅驴 官方定义:WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输.是真正的双向平等对话,属于服务器推送技术的一种. 太官方啦,还是博主过来翻译一下吧 :WebSocket技术只需要service和client建立一次连接,就能实现服

  • SpringBoot+Elasticsearch实现数据搜索的方法详解

    目录 一.简介 二.代码实践 2.1.导入依赖 2.2.配置环境变量 2.3.创建 elasticsearch 的 config 类 2.4.索引管理 2.5.文档管理 三.小结 一.简介 在上篇 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的各种 api 使用. 实际的项目开发过程中,我们通常基于某些主流框架平台进行技术开发,比如 SpringBoot,今天我们就以 SpringBoot 整合 ElasticSearch 为例,给大家详细的介绍 Elast

  • AJAX工作原理及优缺点详解

    AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 一.ajax所包含的技术 大家都知道ajax并非一种新的技术,而是几种原有技术的结合体.它由下列技术组合而成. 使用CSS和XHTML来表示. 使用DOM模型来交互和动态显示. 使用XMLHttpRequest来和服务器进行异步通信. 使用javascript来绑定和调用. 在上面几中技术中,除了XmlHttpReq

  • AJAX页面状态保持思路详解

    传统的页面,浏览器通过url访问页面,页面的内容由后台服务生成页面所有内容再发回给浏览器渲染展示.到AJAX流行的时候,很多信息为AJAX异步请求,比如:点击.翻页等.通常这种情况你一刷新浏览器,当前页面就会重置到初始状态.更不用说把看到的信息url发给好友了. 传统的状态保存在地址栏,如: www.abc.com/search?s=abc&id=23&page=3 如果通过这种方式的话,浏览器会刷新页面,如果使用锚点的话则不会刷新浏览器.具体是点击页面去请求数据的同时会改变地址栏&quo

  • 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解

    虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或其它参数.同时在工作中,我们还会发现,有一些ajax请求的数据,对实时性要求不高,即使我们把第一次请求到的这些数据缓存起来,然后当相同请求再次发起时直接拿之前缓存的数据返回也不会对相关功能有影响,通过这种手工的缓存控制,减少了ajax请求,多多少少也能帮助我们提高网页的性能.本文介绍我自己关于这两方

  • jQuery ajax的功能实现方法详解

    jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是Promise模式的一种实现,而我们这里没有讲过,所以我们就不使用这一模式啦. 我们只定义一个ajax方法,他可以简单的get,post,jsonp请求就可以啦~~ var ajax = function () { // 做一些初始化,定义一些私有函数等 return function () { //

  • 关于在IDEA中SpringBoot项目中activiti工作流的使用详解

    记录一下工作流的在Springboot中的使用,,顺便写个demo,概念,什么东西的我就不解释了,如有问题欢迎各位大佬指导一下. 1.创建springboot项目后导入依赖 <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version&

  • nodejs中的异步编程知识点详解

    简介 因为javascript默认情况下是单线程的,这意味着代码不能创建新的线程来并行执行.但是对于最开始在浏览器中运行的javascript来说,单线程的同步执行环境显然无法满足页面点击,鼠标移动这些响应用户的功能.于是浏览器实现了一组API,可以让javascript以回调的方式来异步响应页面的请求事件. 更进一步,nodejs引入了非阻塞的 I/O ,从而将异步的概念扩展到了文件访问.网络调用等. 今天,我们将会深入的探讨一下各种异步编程的优缺点和发展趋势. 同步异步和阻塞非阻塞 在讨论n

  • SpringBoot项目如何打war包问题详解

    1.pom.xml配置修改 <packaging>jar</packaging> //修改为 <packaging>war</packaging> 2.pom文件添加如些依赖 <!--添加servlet-api的依赖,用来打war包 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</

随机推荐