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;请联系删文本篇文章讲解了计算…

enumset_枚举集合的EnumSet

enumset在上一篇博客文章中&#xff0c;我们发现了EnumMap用于带有枚举键的映射。 您可能已经观察到&#xff0c;还有一个专门针对枚举优化的Set &#xff1a; EnumSet 。 我们再次定义一个CoffeeType枚举&#xff1a; public enum CoffeeType {ESPRESSO, POUR_OVER, FRENCH_…

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 …

c语言行列式源代码,新手作品:行列式计算C语言版

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼对话 ControlHeightDecrease ShiftUp Arrow 向上调整选定的控件或对话一个对话单位对话 ControlHeightIncrease ShiftDown Arrow 向下调整选定的控件或对话一个对话单位对话 ControlMoveDown Dow…

RPM 软件包名中的 el5、el6、el7 是什么?

EL 是 Red Hat Enterprise Linux 的简写。 EL6 表示软件包可以在 Red Hat 6.x&#xff0c;CentOS 6.x&#xff0c;CloudLinux 6.x 进行安装EL5 表示软件包可以在 Red Hat 5.x&#xff0c;CentOS 5.x&#xff0c;CloudLinux 5.x 进行安装EL7 表示软件包可以在 Red Hat 7.x&…

pbc是什么材料_职道漫谈 | 华为的绩效跟你们公司的绩效,有什么区别?

文 | 沈齐雨作者赐稿授权发布&#xff0c;供朋友圈转发分享&#xff01;欢迎投稿&#xff1a;3069462510qq.com相信现在随便问几个公司员工&#xff1a;你们公司的绩效运行的怎么样&#xff1f;得到的答案大多会是&#xff1a;“完全就是摆设。”“没用不说&#xff0c;还特别浪…

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…

数据库 MySQL 如何设置表的主键自增起始值

文章目录表已有数据&#xff0c;truncate 之后再设置 auto_increment&#xff0c;可行表已有数据&#xff0c;delete from 之后再设置 auto_increment&#xff0c;可行主键自增起始值重置查询表名为 tf_user 的 auto_increment 值创建表时设置 AUTO_INCREMENT 参数表已有数据&a…

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

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

Spring Boot和Apache Camel

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

MySQL 如何复制表

文章目录一、复制表结构及数据到新表二、只复制表结构到新表&#xff08;一&#xff09;使用关键字 like&#xff08;二&#xff09;使用 select 语句三、真正完整复制表四、复制表&#xff0c;同时重新定义字段名&#xff08;拷贝旧表中部分的字段&#xff09;五、复制表&…

android获取应用安装通知消息,如何在Android 11 上获取已安装应用列表

在Android 11上&#xff0c;我们可以看到很多的更新都是用来保护隐私的&#xff0c;如果你的app 在使用PackageManger的方法来获取安装的应用列表&#xff0c;那么在Android11上&#xff0c;就需要做一点改变了。我们来看看一下获取应用列表的代码&#xff0c;会不会和你的很相…

python特征选择pso_粒子群优化算法(PSO)之基于离散化的特征选择(FS)(三)

作者&#xff1a;Geppetto前面我们介绍了特征选择(Feature Selection&#xff0c;FS)与离散化数据的重要性&#xff0c;总览的介绍了PSO在FS中的重要性和一些常用的方法&#xff0c;介绍了FS与离散化的背景&#xff0c;介绍本文所采用的基于熵的切割点和最小描述长度原则(MDLP)…

postgresql_PostgreSQL开放自由

postgresqlOpen Liberty是源自WebSphere Liberty的有趣的新型OSS Java EE应用服务器。 您可以将Open Liberty配置为使用PostgreSQL作为其默认数据源&#xff0c;如下所示&#xff1a; 将<datasource> &#xff0c; <jdbcDriver>和<library>指令添加到server…

MySQL注释形式_可执行注释语句(/*!...*/)_数据库注释_数据库脚本注释_SQL脚本注释格式_SQL脚本注释分类

文章目录单行注释多行注释可执行注释为什么要把可执行的 SQL 语句写在注释里面呢&#xff1f;注释示例导入数据时禁止/激活索引测试禁止索引再导入数据的效率单行注释 SELECT * from tf_user; # 单行注释&#xff0c;从这个注释符号起直到该行结束 SELECT * from tf_user; -- …

苹果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…