ckeditor回显带标签_Spring Boot中带有CKEditor的AJAX

ckeditor回显带标签

1.概述

在本文中,我们将介绍如何在Spring Boot中使用CKEditor 。 在本教程中,我们将导入一个包含大量数据的XML文档,对使用GET请求将一组数据加载到CKEditor实例的能力进行编程,并执行POST请求以保存CKEditor的数据。

我们将使用的技术包括MongoDB,Thymeleaf和Spring Batch。

Github上提供了本教程的完整源代码。

2.什么是CKEditor?

CKEditor是一个基于浏览器的“所见即所得”(WYSIWYG)内容编辑器 。 CKEditor旨在将Web编辑器(如Microsoft Word和OpenOffice)中常见的文字处理器功能引入Web界面。

CKEditor在用户界面,插入内容,创作内容等方面为最终用户提供了众多功能。

有不同版本的CKEditor,但是在本教程中,我们使用的是CKEditor4。要查看演示,请访问: https : //ckeditor.com/ckeditor-4/

3. XML文档

如前所述,我们正在此应用程序中上载XML文档。 XML数据将被插入数据库,并在本教程的其余部分中使用。

<?xml version="1.0"?>
<Music xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="MUS-1" style="1.1">
<status date="2017-11-07">draft</status><title xmlns:xhtml="http://www.w3.org/1999/xhtml" >Guide to Music I Like - No Specific Genre</title><description xmlns:xhtml="http://www.w3.org/1999/xhtml" >This guide presents a catalog of music that can be found on Spotify. <html:br xmlns:html="http://www.w3.org/1999/xhtml"/><html:br xmlns:html="http://www.w3.org/1999/xhtml"/>This is a very small sample of music found on Spotify and is no way to be considered comprehensive.</description><songs><song><artist>Run the Jewels</artist><song-title>Legend Has It</song-title></song><song><artist>Kendrick Lamar</artist><song-title>ELEMENT.</song-title></song><song><artist>Weird Al Yankovic</artist><song-title>NOW That's What I Call Polka!</song-title></song><song><artist>Eiffel 65</artist><song-title>Blue (Da Ba Dee) - DJ Ponte Ice Pop Radio</song-title></song><song><artist>YTCracker</artist><song-title>Hacker Music</song-title></song><song><artist>MAN WITH A MISSION</artist><song-title>Raise Your Flag</song-title></song><song><artist>GZA, Method Man</artist><song-title>Shadowboxin'</song-title></song></songs>
</Music>

4.型号

对于上面的XML代码,我们可以像这样对Song进行建模:

public class SongModel {@Idprivate String id;@Indexedprivate String artist;@Indexedprivate String songTitle;@Indexedprivate Boolean updated;public Boolean getUpdated() {return updated;}public void setUpdated(Boolean updated) {this.updated = updated;}public String getArtist() {return artist;}public void setArtist(String artist) {this.artist = artist;}public String getSongTitle() {return songTitle;}public void setSongTitle(String songTitle) {this.songTitle = songTitle;}public String getId() {return id;}public void setId(String id) {this.id = id;}@JsonCreatorpublic SongModel(@JsonProperty("artist") String artist,@JsonProperty("song-title") String songTitle){this.artist = artist;this.songTitle = songTitle;}@Overridepublic String toString() {return "Person [id=" + id + ", artist=" + artist + ", song-title=" + songTitle + "]";}}

对于我们的应用程序,我们将区分未修改的歌曲和在CKEditor中使用单独的模型和存储库修改过的歌曲。

现在让我们定义什么是更新的歌曲:

public class UpdatedSong {@Idprivate String id;@Indexedprivate String artist;@Indexedprivate String songTitle;@Indexedprivate String html;@Indexedprivate String sid;public String getSid() {return sid;}public void setSid(String sid) {this.sid = sid;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getArtist() {return artist;}public void setArtist(String artist) {this.artist = artist;}public String getSongTitle() {return songTitle;}public void setSongTitle(String songTitle) {this.songTitle = songTitle;}public String getHtml() {return html;}public void setHtml(String html) {this.html = html;}}

5.文件上传和处理

由于本文的重点是CKEditor和AJAX,因此我们不会详细介绍使用Spring Batch进行文件上传和处理。 我们在之前的帖子中对这个过程进行了深入的审查,但是:

  • Spring批处理CSV处理
  • 在MongoDB中将XML转换为JSON +原始使用+ Spring Batch

6.将数据设置为CKEditor – GET请求

我们的目标是检索单个歌曲的数据并在CKEditor中显示该数据。 有两个问题要解决:检索单个歌曲的数据并将其显示在CKEditor中。

6.1客户端代码

view.html中,我们使用Thymeleaf中的一个表来迭代 Song存储库中的每 Song。 为了能够从服务器检索特定歌曲的数据,我们将歌曲的ID传递给函数。

这是负责调用从服务器检索数据并随后将数据设置为CKEditor实例的函数的代码片段:

<table class="table datatable">
<thead>
<tr>
<th>Artist</th>
<th>Song Title</th>
<th>Load</th>
</tr>
</thead>
<tbody>
<tr th:each="songList : ${songList}">
<td th:text="${songList.artist}">Text ...</td>
<td th:text="${songList.songTitle}">Text ...</td>
<td><button th:onclick="|getSong('${songList.id}')|" id="button" class="btn btn-primary btn-condensed">
<i class="glyphicon glyphicon-folder-open"></i>
</button></td>
</tr>
</tbody>
</table>

如我们所见, Songid对于我们能够检索数据至关重要。

getSong函数中,我们使用延迟的Promise来确保在GET请求之后设置数据

function getSong(song) {$.ajax({url : "/api/show/?sid=" + song,type : 'GET',dataType : 'text'}).then(function(data) {var length = data.length-2;var datacut = data.slice(9,length);CKEDITOR.instances.content.setData(datacut);});$("#form").attr("action", "/api/save/?sid=" + song);};

6.2服务器端代码

getSong接受一个名为sid的参数,该参数代表Song id。 sid也是@GetMapping中的路径变量。 我们将sid视为String,因为这是MongoDB中Song的ID

我们检查Song是否已被修改,如果是,我们将检索关联的UpdatedSong实体。 如果没有,我们将以不同的方式对待这首歌。 最后,我们为名为ResponseModel的数据返回一个带有字符串的简单POJO:

@GetMapping(value={"/show/","/show/{sid}"})
public ResponseEntity<?> getSong(@RequestParam String sid, Model model){ResponseModel response = new ResponseModel();System.out.println("SID :::::" + sid);ArrayList<String> musicText = new ArrayList<String>();if(sid!=null){String sidString = sid;SongModel songModel = songDAO.findOne(sidString);System.out.println("get status of boolean during get ::::::" + songModel.getUpdated());if(songModel.getUpdated()==false ){musicText.add(songModel.getArtist());musicText.add(songModel.getSongTitle());String filterText = format.changeJsonToHTML(musicText);response.setData(filterText);} else if(songModel.getUpdated()==true){UpdatedSong updated = updatedDAO.findBysid(sidString);String text = updated.getHtml();System.out.println("getting the updated text ::::::::" + text);response.setData(text);}}model.addAttribute("response", response);return ResponseEntity.ok(response);
}

ResponseModel是一个非常简单的POJO,如上所述:

public class ResponseModel {private String data;public ResponseModel(){}public ResponseModel(String data){this.data = data;}public String getData() {return data;}public void setData(String data) {this.data = data;}
}

7.保存CKEditor数据– POST请求

发布数据并不是很大的挑战。 但是,可以确保正确处理数据。

7.1客户端代码

由于CKEditor实例是表单中的文本区域,因此我们可以触发表单提交上的函数:

$(document)
.ready(
function() {// SUBMIT FORM
$("#form").submit(function(event) {
// Prevent the form from submitting via the browser.
event.preventDefault();
ajaxPost();
});

ajaxPost()在CKEditor中检索当前数据,并将其设置为变量formData

function ajaxPost() {// PREPARE FORM DATA
var formData = CKEDITOR.instances.content
.getData();// DO POST
$
.ajax({
type : "POST",
contentType : "text/html",
url : $("#form").attr("action"),
data : formData,
dataType : 'text',
success : function(result) {$("#postResultDiv")
.html(
""
+ "Post Successfully! "
+ "");console.log(result);
},
error : function(e) {
alert("Error!")
console.log("ERROR: ", e);
}
});}})

重要的是要注意:

  • contentType“ text / html”
  • dataType“文本”

内容类型或数据类型不正确会导致错误或数据格式错误。

7.2服务器端代码

我们在POST请求的contentType中声明媒体类型为“ text / html” 。 我们需要在映射中指定将使用此映射。 因此,我们在@PostMapping上添加消耗= MediaType.TEXT_HTML_VALUE

我们需要注意的领域包括:

  • @RequestBody字符串主体负责将变量主体设置为我们请求的内容
  • 我们再次返回ResponseModel ,它是前面描述的包含数据的简单POJO
  • 我们将先前修改过的SongModel与之前未修改过的SongModel区别对待

同样,像GET请求一样, sid允许我们处理正确的Song:

@PostMapping(value={"/save/","/save/[sid]"}, consumes = MediaType.TEXT_HTML_VALUE)public @ResponseBody ResponseModel saveSong( @RequestBody String body, @RequestParam String sid){ResponseModel response = new ResponseModel();response.setData(body);SongModel oldSong = songDAO.findOne(sid);String songTitle = oldSong.getSongTitle();String artistName = oldSong.getArtist();if(oldSong.getUpdated() == false){UpdatedSong updatedSong = new UpdatedSong();updatedSong.setArtist(artistName);updatedSong.setSongTitle(songTitle);updatedSong.setHtml(body);updatedSong.setSid(sid);oldSong.setUpdated(true);songDAO.save(oldSong);updatedDAO.insert(updatedSong);System.out.println("get status of boolean during post :::::" + oldSong.getUpdated());}else{UpdatedSong currentSong = updatedDAO.findBysid(sid);currentSong.setHtml(body);updatedDAO.save(currentSong);}        return response;}

8.演示

我们访问localhost:8080

我们上传提供的music-example.xml文件:

我们单击“加载”以查看歌曲:

我们添加内容,然后单击“保存”:

如果返回到保存的内容,则换行符可能会显示“ \ n”。 目前,对此进行讨论超出了本教程的范围。

9.结论

在本教程中,我们介绍了如何使用带有对象ID的GET请求加载数据,如何将数据设置为CKEditor实例以及如何通过POST请求将CKEditor的数据保存回数据库。 还有一些额外的代码,例如不必为数据使用两个不同的实体(原始版本和修改版本),但这希望是有启发性的。

完整的代码可以在Github上找到。

翻译自: https://www.javacodegeeks.com/2017/11/ajax-ckeditor-spring-boot.html

ckeditor回显带标签

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 可行性分析,可行性研究项目分析程序与步骤

项目分析程序项目分析分析工作步骤分析程序框架分段实施方法第一阶段初期工作1、收集资料。包括业主的要求&#xff0c;业主已经完成的研究成果&#xff0c;市场、厂址、原料、能源、运输、维修、共用设施、环境、劳动力来源、资金来源、税务、设备材料价格、物价上涨率等有关资…

原码一位乘法器设计_十分钟带你彻底搞懂原码、反码、补码

点击上方“程序员大白”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达编辑 | 程序员大白公众号来源丨https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html仅作学术交流&#xff0c;如有侵权&#xff0c;请联系删文本篇文章讲解了计算…

Linux 目录之 /etc/init.d/ 介绍

文章目录一、关于目录 /etc/init.d/二、关于目录 /etc/rc.d/init.d/三、关于文件 /etc/rc.local四、/etc/init.d/ 和 service 文件五、关于命令 service六、关于文件 /etc/inittab七、关于目录 /etc/init/注意&#xff1a;以 System V init 或者 Upstart 为初始化系统的 Linux …

java 异常处理发生异常_处理Java中的异常

java 异常处理发生异常每个程序员都希望编写一个完美的程序。 也就是说&#xff0c;程序运行时没有任何障碍。 好吧&#xff0c;如果希望是马&#xff0c;乞g就会骑。 除了程序员的所有愿望之外&#xff0c;有时还会发生无法预料的情况。 在Java中&#xff0c;这些无法预料的…

android提交项目到svn,Android Studio 配置SVN,通过Share project提交项目和实现忽略文件...

1&#xff1a;首先电脑本身装的SVN必须在bin目录下包含svn.exe文件&#xff0c;如下图。这个文件是在安装SVN时选择安装command line client tools才会出现。如果没有&#xff0c;需要重新安装SVN。2&#xff1a;将SVN关联到Android Studio中声明&#xff1a;在这里我使用的And…

数独游戏技巧从入门到精通_如何引导孩子入门九宫格数独?掌握4个技巧口诀,孩子思维提升快...

九宫格数独对孩子的思维训练有着非常不错的效果&#xff0c;我们完全可以用其培养孩子对数字的兴趣&#xff0c;并培养孩子严谨的逻辑推理态度。那九宫格数独有没有技巧口诀呢&#xff1f;对于孩子来说&#xff0c;过于复杂的技巧他们也掌握不了。所以&#xff0c;我们培养孩子…

Spring Boot和Apache Camel

随着软件世界的发展&#xff0c;正在开发更加复杂的系统&#xff0c;这些系统必须相互集成。 它从SOA开始&#xff0c;然后一直到微服务。 骆驼是我想到的第一大集成工具&#xff0c;因为如今的骆驼springboot是一个非常强大的组合。 第一步是将骆驼依赖项包含到我们的sprin…

苹果android投屏,iphone怎么投屏到mac?苹果手机投屏到苹果电脑方法

iphone和mac的使用人群越来越多,其中投屏功能却难倒了大部分新手用户,许多使用iPhone以及Mac的用户朋友都还不知道iPhone怎么投屏到mac,好奇的用户朋友马上点击查看iphone投屏到mac教程来实现这个具有科技革新感的功能吧。官方推荐方法1&#xff1a;用数据线- 1.使用lightning线…

微服务java模块内存管理_Java 9模块服务

微服务java模块内存管理接线与查找 Java长期以来都有一个ServiceLoader类。 它是在1.6中引入的&#xff0c;但是自Java 1.2以来就使用了类似的技术。 一些软件组件使用了它&#xff0c;但是使用并不广泛。 它可以用于模块化应用程序&#xff08;甚至更多&#xff09;&#xff0…

使用实例工厂方法实例化_一些工厂实例

使用实例工厂方法实例化我时不时地发现自己摸索了一些旧代码&#xff0c;找到了“我在哪里做过类似工厂的事情”的示例。 上周再次发生这种情况时&#xff0c;我决定只查找所有示例&#xff0c;并创建一个示例项目和有关该示例的博客文章。 所以在这篇文章中&#xff0c;我&a…

linux内核设计与实现 epub_Epoll学习服务器的简单实现-Linux内核Epoll结构

1.Begins~有的人学习linux编程很久&#xff0c;只知道网络编程是socket&#xff0c;bind&#xff0c; listen。。。&#xff0c;然而这些都是网络通信软件最基本的接口。在某网络公司待了y&#xff0c;也了解到公司的基础就是网络转发 &#xff0c;然而网络转发实现并非我们平时…

鸿蒙有安卓内核吗,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪

在华为开发者大会上&#xff0c;华为消费业务CEO 余承东&#xff0c;正式发布鸿蒙OS2.0&#xff0c;并宣布华为鸿蒙OS将全面启用全场景生态&#xff0c;并将于2020年12月发布手机版。余承东还表示&#xff0c;明年&#xff0c;华为的智能手机将全面升级&#xff0c;以支持鸿蒙操…

命名对象实体对象_我的对象命名

命名对象实体对象这是最常见的辩论之一。 大多数人对此主题有自己的见解&#xff0c;却没人能真正说出哪个是正确的。 我当然不能&#xff0c;但是尽管如此&#xff0c;我还是决定与大家分享我的想法&#xff0c;投入两美分&#xff0c;也许对某人会有帮助。 当我创建一个新类…

微信html人脸识别接口,微信人脸识别可视化的实现:

实现方式主要通过以下模块实现&#xff1a;DateFromWebChat (从网页版微信窗口下载好友头像)AI (识别模块&#xff0c;主要用于识别好友头像是否为人脸&#xff0c;并且计算人脸的数量与头像的总数且return)DateVisul (数据可视化模块&#xff0c;用与AI模块返回参数的可视化)u…

安卓手机端运行的adb工具_MQTT通信手机端接收生产车间设备运行信息3

应用场景&#xff1a;对车间重点设备的运行参数进行实时跟踪。比如烘干炉的烟囱温度、TNV的出口温度、喷漆室的温湿度、小时产量等等信息。以前这些信息的获取都需要在电脑端获取、相对比较繁琐。这里我们选择在手机端实现获取这些信息。尤其是对于作者这样的设备负责人而言&am…

jsf 项目_您将在下一个项目中使用JSF吗?

jsf 项目上周有一篇很棒的stackoverflow博客文章&#xff0c;主题是“ Javascript框架的残酷生命周期” 。 这篇文章是关于Javascript UI框架&#xff08;angularjs&#xff0c;angular&#xff0c;jquery和react&#xff09;的流行和流行的速度。 这篇文章的关键指标是每月关于…

查询varchar实际大小_微服务和VUE(11): mybatis 动态查询

1. 新建class表和student表&#xff1a;CREATE TABLE class ( class_id varchar(20) NOT NULL, class_name varchar(50) DEFAULT NULL, headmaster_name varchar(20) DEFAULT NULL, headmaster_tel varchar(20) DEFAULT NULL, PRIMARY KEY (class_id)) ENGINEInnoDB …

Linux 如何安装程序的源代码软件包/源码程序包/源码包?

文章目录一、安装源码包的三个步骤&#xff08;一&#xff09;执行命令 configure&#xff0c;进行配置/检测&#xff08;二&#xff09;执行命令 make&#xff0c;编译源码&#xff08;三&#xff09;执行命令 make install&#xff0c;安装软件二、源码包安装示例&#xff08…

如何取消ie.html,IE浏览器安全警告怎么关闭

部分用户在使用IE浏览器打开某些页面的时候&#xff0c;可能会出现一个“安全警告”的对话框&#xff0c;虽然影响不大&#xff0c;但是每次出现都让人很烦闷&#xff0c;这个时候你就可以根据下面的操作去关闭这个功能。自从百度近日开启了HTTPS安全网页功能之后&#xff0c;每…