Spring Boot中带有CKEditor的AJAX

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。 为了能够从服务器检索特定歌曲的数据,我们将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视为字符串,因为这是MongoDB中Song的ID

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

@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

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

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

相关文章

使用Http协议访问网络--HttpClient

public interface HttpClient org.apache.http.client.HttpClient HttpClient是Apache提供的Http网络访问接口。1、创建HttpClient实例HttpClient是一个接口&#xff0c;无法直接创建实例&#xff0c;通常创建一个DefaultHttpClient&#xff08;HttpClient 的SubClass&#xff…

编写测试用例

1、创建测试用例 为ComeOnBroadcastReceiverDo创建一个测试用例&#xff1a; 在导航栏File-->New-->Other 选择AndroidTestProject 2、点击next输入测试工程的name&#xff0c;选择测试工程路径 点击next,选择要测试的工程&#xff1a; 点击Finish完成测试工程的新建 被…

欢迎界面动画

实现一个欢迎界面的动画&#xff0c;即打开app显示的页面&#xff0c;动画结束后跳到Activity。 1、欢迎界面的背景是一个绿色矩形 <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/andr…

IP地址分类及ISO-OSI、三次握手

1. A类地址A类地址的表示范围为&#xff1a;0.0.0.0~126.255.255.255(00000000~01111110)&#xff0c;最前面一位是“0”&#xff0c;用7位&#xff08;bit&#xff09;来标识网络号&#xff0c;24位标识主机号&#xff1b;默认网络掩码为&#xff1a;255.0.0.0&#xff0c;111…

drools 决策表_骆驼和春天的Drools决策表

drools 决策表正如我在之前的文章中所展示的那样&#xff0c; JBoss Drools是一个非常有用的规则引擎 。 唯一的问题是&#xff0c;对于非技术人员而言&#xff0c;以Rule语言创建规则可能会非常复杂。 这就是为什么人们可以提供一种简便的方法来创建业务规则-在电子表格中创建…

在Java中处理异常

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

通信系统的组成

数字通信模型&#xff1a; http://blog.csdn.net/yaosiming2011/article/details/44280797 进程和线程

存储卡显示0字节怎么办?恢复0字节的存储小技巧

存储卡显示0字节是一个常见的故障现象&#xff0c;可能由多种原因引起。本文将详细分析存储卡出现此类问题的各种原因&#xff0c;并提供针对性的解决方法。通过深入了解这些原因和解决方案&#xff0c;读者可以有效地应对存储卡显示0字节的故障&#xff0c;从而恢复存储卡的正…

OSI模型和TCP/IP协议族

1、协议分层 两个实体之间要进行通信就需要有一个协议。而当通信比较复杂时就有必要将这个复杂的任务划分为多层&#xff0c;就需要有多个协议&#xff0c;每一层都有自己的协议。 2、ISO 国际标准化组织&#xff08;International Standard Organization &#xff0c; ISO&…

在PhotoShop中改像素m*n

快捷键&#xff1a;CtrlAlti&#xff0c;如图&#xff0c;改为28*28

Spring Boot Redis简介

1.概述 在本文中&#xff0c;我们将通过Spring Data Redis库回顾如何将Redis与Spring Boot结合使用的基础知识。 我们将构建一个应用程序&#xff0c;演示如何通过Web界面执行CRUD操作Redis 。 Github上提供了该项目的完整源代码。 2.什么是Redis&#xff1f; Redis是一个开源…

Dijkstra-解决最短路径问题

1、从A开始&#xff08;也可以从其他点&#xff0c;此处选择从A&#xff09; 将A 加入树&#xff0c;A被圈红 列出最短路径数组&#xff1a; 2、 确定从A到其他顶点的最短距离为50&#xff0c;A-->B 将B加入树&#xff1a; 更新最短路径数组&#xff1a; 比较到C的距离&a…

简单排序--冒泡排序

冒泡排序&#xff1a; public void sort(){int out,in;//out指向已经排好序的前一个for( outnElements-1;out>1;out--){for(in0;in<out;in){if(arr[in]>arr[in1]){swap(in,in1);//相邻的两个元素比较&#xff0c;交换}}}}//实现冒泡排序相邻的元素两两比较&#xff0c…

简单排序--选择排序

选择排序&#xff1a; public void sort(){int out,in,min;for(out0;out<nElements-1;out){min out;for(inout1;in<nElements;in)if(arr[in]<arr[min])min in;swap(out,min);//将min放在out位置&#xff0c;out始终指向最小值的下一个位置&#xff0c;即下一个min要…

Java 9模块服务

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

简单排序--插入排序

插入排序&#xff1a; public void sort(){int in,out,temp;for(out1;out<nElements;out){temp arr[out];in out;while(in>0&&arr[in-1]>temp){arr[in] arr[in-1];//待插入的数据比其之前的数字大的右移&#xff0c;从小到大排序--in;//依次左移}arr[in] …

一些工厂实例

我时不时地发现自己摸索了一些旧的代码&#xff0c;以找到示例“我在哪里做过工厂一样的事情”。 上周再次发生这种情况时&#xff0c;我决定只查找所有示例&#xff0c;并创建一个示例项目和有关它的博客文章。 所以在这篇文章中&#xff0c;我&#xff1a; 从简单的“原始…

eclipse工程导入Android Studio

在eclipse中选中要导出的工程&#xff08;此工程在eclipse中最好不要有错误&#xff09;&#xff0c;右键选择Export->Generate Gradle build files 在本地工程里生成了一个build.gradle文件。 在AS中选择 导入成功后会生成一个import-summary.txt 导入成功。