重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本文阐述了怎么使用DBMS存储过程 阐述了使用存储过程的基本的和高级特性 比如返回ResultSet 本文假设你对DBMS和JDBC已经非常熟悉 也假设你能够毫无障碍地阅读其它语言写成的代码(即不是Java的语言) 但是 并不要求你有任何存储过程的编程经历
创新互联是一家专业的成都网站建设公司,我们专注成都网站建设、网站建设、网络营销、企业网站建设,卖链接,广告投放平台为企业客户提供一站式建站解决方案,能带给客户新的互联网理念。从网站结构的规划UI设计到用户体验提高,创新互联力求做到尽善尽美。
存储过程是指保存在数据竖拿库并在数据库端执行的程序 你可以使用特殊的语法在Java类中调用存储过程 在调用时 存储过程的名称及指定的参数通过JDBC连接发送给DBMS 执行存储过程并通过连接(如果有)返回结果
使用存储过程拥有和使用基于EJB或CORBA这样的应用服务器一样的好处 区别是存储过程可以从很多流行的DBMS中免费使用 而应用服务器大都非常昂贵 这并不只是许可证费用的问题 使用应用服务器所需要花费的管理 编写代码的费用 以及客户程序所增加的复杂性 都可以通过DBMS中的存储过程所整个地替代
你可以使用Java Python Perl或C编写存储过程 但是通常使用你的DBMS所指定的特定语言 Oracle使用PL/SQL PostgreSQL使用pl/pgsql DB 使用Procedural SQL 这些语言都非常相似 在它们之间移植存储过程并不比在Sun的EJB规范不同实现版本之间移植Session Bean困难 并且 存储过程是为嵌入SQL所设计 这使得它们比Java或C等语言更加友好地方式表达数据库的机制
因为存储过程运行在DBMS自身 这可以帮助减少应用程序中的等待时间 不是在Java代码中执行 个或 个SQL语句 而只需要在服务器端执行 个存储过程 网络上的数据往返次数的减少可以戏剧性地优化性能
使用存储过程
简单的老的JDBC通过CallableStatement类支持存储过程的调用 该类实际上是PreparedStatement的一个子类 假设我们有一个poets数据库 数据库中有一个设置诗人逝世年龄的存储过程 下面是对老酒鬼Dylan Thomas(old soak Dylan Thomas 不指定是否有关典故迹灶 文化 请批评指正 译注)进行调用的详细代码
try{ int age = ; String poetName = dylan thomas ; CallableStatement proc = connection prepareCall( { call set_death_age(? ?) } ); proc setString( poetName); proc setInt( age); cs execute();}catch (SQLException e){ // }
传给prepareCall方法的字串是存储过程调用的书写规范 它指定了存储过程的名称 ?代表了你需要指定的参数
和JDBC集成是存储过程的一个很大的便利 为了从应用中调用存储过程 不需要存根(stub)类或者配置文件 除了你的DBMS的JDBC驱动程序外什么也不需要
当这段代码执行时 数据库的存储过程就被调用 我们没有去获取结果 因为该存储过程并不返回结果 执行成功或失败将通过例外得知 失败可能意味着调用存储姿纤扮过程时的失败(比如提供的一个参数的类型不正确) 或者一个应用程序的失败(比如抛出一个例外指示在poets数据库中并不存在 Dylan Thomas )
结合SQL操作与存储过程
映射Java对象到SQL表中的行相当简单 但是通常需要执行几个SQL语句 可能是一个SELECT查找ID 然后一个INSERT插入指定ID的数据 在高度规格化(符合更高的范式 译注)的数据库模式中 可能需要多个表的更新 因此需要更多的语句 Java代码会很快地膨胀 每一个语句的网络开销也迅速增加
将这些SQL语句转移到一个存储过程中将大大简化代码 仅涉及一次网络调用 所有关联的SQL操作都可以在数据库内部发生 并且 存储过程语言 例如PL/SQL 允许使用SQL语法 这比Java代码更加自然 下面是我们早期的存储过程 使用Oracle的PL/SQL语言编写
create procedure set_death_age(poet VARCHAR poet_age NUMBER)poet_id NUMBER;beginSELECT id INTO poet_id FROM poets WHERE name = poet;INSERT INTO deaths (mort_id age) VALUES (poet_id poet_age);end set_death_age;
很独特?不 我打赌你一定期待看到一个poets表上的UPDATE 这也暗示了使用存储过程实现是多么容易的一件事情 set_death_age几乎可以肯定是一个很烂的实现 我们应该在poets表中添加一列来存储逝世年龄 Java代码中并不关心数据库模式是怎么实现的 因为它仅调用存储过程 我们以后可以改变数据库模式以提高性能 但是我们不必修改我们代码
下面是调用上面存储过程的Java代码
public static void setDeathAge(Poet dyingBard int age)throws SQLException{ Connection con = null; CallableStatement proc = null;
try {con = connectionPool getConnection();proc = con prepareCall( { call set_death_age(? ?) } );proc setString( dyingBard getName());proc setInt( age);proc execute(); } finally {try{ proc close();}catch (SQLException e) {}con close(); }}
为了确保可维护性 建议使用像这儿这样的static方法 这也使得调用存储过程的代码集中在一个简单的模版代码中 如果你用到许多存储过程 就会发现仅需要拷贝 粘贴就可以创建新的方法 因为代码的模版化 甚至也可以通过脚本自动生产调用存储过程的代码
Functions
存储过程可以有返回值 所以CallableStatement类有类似getResultSet这样的方法来获取返回值 当存储过程返回一个值时 你必须使用registerOutParameter方法告诉JDBC驱动器该值的SQL类型是什么 你也必须调整存储过程调用来指示该过程返回一个值
下面接着上面的例子 这次我们查询Dylan Thomas逝世时的年龄 这次的存储过程使用PostgreSQL的pl/pgsql
create function snuffed_it_when (VARCHAR) returns integer declarepoet_id NUMBER;poet_age NUMBER;begin first get the id associated with the poet SELECT id INTO poet_id FROM poets WHERE name = $ ; get and return the age SELECT age INTO poet_age FROM deaths WHERE mort_id = poet_id;return age;end; language pl/pgsql ;
另外 注意pl/pgsql参数名通过Unix和DOS脚本的$n语法引用 同时 也注意嵌入的注释 这是和Java代码相比的另一个优越性 在Java中写这样的注释当然是可以的 但是看起来很凌乱 并且和SQL语句脱节 必须嵌入到Java String中
下面是调用这个存储过程的Java代码
connection setAutoCommit(false);CallableStatement proc =connection prepareCall( { ? = call snuffed_it_when(?) } );proc registerOutParameter( Types INTEGER);proc setString( poetName);cs execute();int age = proc getInt( );
如果指定了错误的返回值类型会怎样?那么 当调用存储过程时将抛出一个RuntimeException 正如你在ResultSet操作中使用了一个错误的类型所碰到的一样
复杂的返回值
关于存储过程的知识 很多人好像就熟悉我们所讨论的这些 如果这是存储过程的全部功能 那么存储过程就不是其它远程执行机制的替换方案了 存储过程的功能比这强大得多
当你执行一个SQL查询时 DBMS创建一个叫做cursor(游标)的数据库对象 用于在返回结果中迭代每一行 ResultSet是当前时间点的游标的一个表示 这就是为什么没有缓存或者特定数据库的支持 你只能在ResultSet中向前移动
某些DBMS允许从存储过程中返回游标的一个引用 JDBC并不支持这个功能 但是Oracle PostgreSQL和DB 的JDBC驱动器都支持在ResultSet上打开到游标的指针(pointer)
设想列出所有没有活到退休年龄的诗人 下面是完成这个功能的存储过程 返回一个打开的游标 同样也使用PostgreSQL的pl/pgsql语言
create procedure list_early_deaths () return refcursor as declaretoesup refcursor;beginopen toesup forSELECT poets name deaths ageFROM poets deaths all entries in deaths are for poets but the table might bee generic WHERE poets id = deaths mort_idAND deaths age ;return toesup;end; language plpgsql ;
下面是调用该存储过程的Java方法 将结果输出到PrintWriter
PrintWriter:
static void sendEarlyDeaths(PrintWriter out){ Connection con = null; CallableStatement toesUp = null; try {con = ConnectionPool getConnection();
// PostgreSQL needs a transaction to do this con setAutoCommit(false);
// Setup the call CallableStatement toesUp= connection prepareCall( { ? = call list_early_deaths () } );toesUp registerOutParameter( Types OTHER);getResults execute();
ResultSet rs = (ResultSet) getResults getObject( );while (rs next()){ String name = rs getString( ); int age = rs getInt( ); out println(name + was + age + years old );}rs close(); } catch (SQLException e) {// We should protect these calls toesUp close();con close(); }}
因为JDBC并不直接支持从存储过程中返回游标 我们使用Types OTHER来指示存储过程的返回类型 然后调用getObject()方法并对返回值进行强制类型转换
这个调用存储过程的Java方法是mapping的一个好例子 Mapping是对一个集上的操作进行抽象的方法 不是在这个过程上返回一个集 我们可以把操作传送进去执行 本例中 操作就是把ResultSet打印到一个输出流 这是一个值得举例的很常用的例子 下面是调用同一个存储过程的另外一个方法实现
public class ProcessPoetDeaths{ public abstract void sendDeath(String name int age);}
static void mapEarlyDeaths(ProcessPoetDeaths mapper){ Connection con = null; CallableStatement toesUp = null; try {con = ConnectionPool getConnection();con setAutoCommit(false);
CallableStatement toesUp= connection prepareCall( { ? = call list_early_deaths () } );toesUp registerOutParameter( Types OTHER);getResults execute();
ResultSet rs = (ResultSet) getResults getObject( );while (rs next()){ String name = rs getString( ); int age = rs getInt( ); mapper sendDeath(name age);}rs close(); } catch (SQLException e) {// We should protect these calls toesUp close();con close(); }}
这允许在ResultSet数据上执行任意的处理 而不需要改变或者复制获取ResultSet的方法
static void sendEarlyDeaths(final PrintWriter out){ ProcessPoetDeaths myMapper = new ProcessPoetDeaths() {public void sendDeath(String name int age){ out println(name + was + age + years old );} }; mapEarlyDeaths(myMapper);}
这个方法使用ProcessPoetDeaths的一个匿名实例调用mapEarlyDeaths 该实例拥有sendDeath方法的一个实现 和我们上面的例子一样的方式把结果写入到输出流 当然 这个技巧并不是存储过程特有的 但是和存储过程中返回的ResultSet结合使用 是一个非常强大的工具
结论
存储过程可以帮助你在代码中分离逻辑 这基本上总是有益的 这个分离的好处有
快速创建应用 使用和应用一起改变和改善的数据库模式
数据库模式可以在以后改变而不影响Java对象 当我们完成应用后 可以重新设计更好的模式
存储过程通过更好的SQL嵌入使得复杂的SQL更容易理解
编写存储过程比在Java中编写嵌入的SQL拥有更好的工具——大部分编辑器都提供语法高亮!
存储过程可以在任何SQL命令行中测试 这使得调试更加容易
并不是所有的数据库都支持存储过程 但是存在许多很棒的实现 包括免费/开源的和非免费的 所以移植并不是一个问题 Oracle PostgreSQL和DB 都有类似的存储过程语言 并且有在线的社区很好地支持
存储过程工具很多 有像TOAD或TORA这样的编辑器 调试器和IDE 提供了编写 维护PL/SQL或pl/pgsql的强大的环境
lishixinzhi/Article/program/Java/hx/201311/25906
您可以按照以下步骤将 Eclipse 中的 Java 代码存储到 U 盘中:
打开 Eclipse 编辑器,选择您要保存的 Java 项目或文件。
选择 "液咐辩文件" 菜单,然后选择 "导出"。
在弹出窗口中,选择 "一般" 文件夹,然后选择 "文件系统"。
在 "简改导出" 窗口中,选择要导出的项目或文件,然后选择您的 U 盘作为导出目录。
点击 "完成" 按钮,Eclipse 将会把您的 Java 代码导出到您的 U 盘中。
请注意,如果您在导出项目闹缺时选择了 "项目存档文件",那么您的项目将以 .zip 文件的形式导出到您的 U 盘中,您可以将其解压缩后在其他计算机上使用。
在接收富文纯稿蠢本时,数据库接收含有图片内容,图片会自动转换为Base64编码保存到数据库,导数据库性能降低。
解决:在接收富文本内容时,将接收到的图片转换为文件上传到Minio(Minio具体使用可参考文档),然后将base64编码替换为图片地址保存敬晌
用到的工具类
使用正则表达式提取接收内容的Base64编码工具类
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ImgBaseUtil {
public static ListString getImgStr(String htmlStr) {
ListString list = new ArrayList();
String img = "";
Pattern p_image;
Matcher m_image;
// String regEx_img = "img.*src=(.*?)[^]*?"; //图片链接地址
String regEx_img = "img.*src\\s*=\\s*(.*?)[^]*?";
p_image = Pattern点抗 pile(regEx_img, Pattern.CASE_INSENSITIVE);
m_image = p_image.matcher(htmlStr);
while (m_image.find()) {
// 得做陪到img /数据
img = m_image.group();
// 匹配img中的src数据
Matcher m = Pattern点抗 pile("src\\s*=\\s*\"?(.*?)(\"||\\s+)").matcher(img);
while (m.find()) {
list.add(m.group(1));
}
}
return list;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
将Base64编码转换为文件流的工具类
import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Decoder;
import java.io.*;
public class BASE64DecodedMultipartFile implements MultipartFile {
private final byte[] imgContent;
private final String header;
public BASE64DecodedMultipartFile(byte[] imgContent, String header) {
this.imgContent = imgContent;
this.header = header.split(";")[0];
}
@Override
public String getName() {
return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];
}
@Override
public String getOriginalFilename() {
return System.currentTimeMillis() + (int) Math.random() * 10000 + "." + header.split("/")[1];
}
@Override
public String getContentType() {
return header.split(":")[1];
}
@Override
public boolean isEmpty() {
return imgContent == null || imgContent.length == 0;
}
@Override
public long getSize() {
return imgContent.length;
}
@Override
public byte[] getBytes() throws IOException {
return imgContent;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(imgContent);
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
new FileOutputStream(dest).write(imgContent);
}
public static MultipartFile base64ToMultipart(String base64) {
try {
String[] baseStrs = base64.split(",");
BASE64Decoder decoder = new BASE64Decoder();
byte[] b = new byte[0];
b = decoder.decodeBuffer(baseStrs[1]);
for (int i = 0; i b.length; ++i) {
if (b[i] 0) {
b[i] += 256;
}
}
return new BASE64DecodedMultipartFile(b, baseStrs[0]);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
内容接收并完成处理工具类
public class RichTextUtil {
/**
*
* @param text 富文本内容
* @return 返回处理图片后的数据
*/
public String richText(String text,MinioUtils minioUtils,MinioConfig minioConfig){
String s=new String(text);
String result=null;//返回结果
ListString imgStr = ImgBaseUtil.getImgStr(s); //每组base64编码图片
if (imgStr.isEmpty()){
return text;
}
for (String s1:imgStr){ //每个base64转换并上传
String s2= UUID.randomUUID().toString().replaceAll("-","")+".jpg"; //新的文件链接
//上传
MultipartFile multipartFile = BASE64DecodedMultipartFile.base64ToMultipart(s1);
assert multipartFile != null;
minioUtils.putObject1(multipartFile,minioConfig.getBucketName(),s2);
String foreverUrl=minioConfig.getEndpoint()+":"+minioConfig.getPort()+"/"+minioConfig.getBucketName()+"/"+s2;//永久链接
if (Objects.isNull(result)){
result=s.replace(s1,foreverUrl); //第一次替换
}
result=result.replace(s1,foreverUrl); //前边替换过,继续替换
}
return result;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
配合Minio工具类使用
@GetMapping("/tss")
public String dmo(@RequestBody Entity entity) throws IOException {
String s=entity.getContent();//接收到的内容
RichTextUtil richTextUtil = new RichTextUtil();
String s1 = richTextUtil.richText(s,minioUtils,minioConfig);
entity.setContent(s1);//最后将转换过的内容替换就行
//数据库保存一下实体类内容
return entity;
}
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
Minio使用可查询相关资料或了解本博客SpringBoot对Minio的简单使用链接:
文章知识点与官方知识档案匹配
Java技能树使用JDBC操作数据库数据库操作
95211 人正在系统学习中
打开CSDN APP,看更多技术内容
...如D:\tmp)并回显_静静看大海的博客_java 富文本保存...
1、项目需求: 使用百度富文本编辑器实现“重要节假日高速出行指南内容”编辑,功能涉及图片、视频上传。 2、存在问题 百度富文本编辑器默认将图片、视频上传至项目里,如果使用Tomcat作为服务器的时候,如果不配置图片保存路径,将图片保存在项...
继续访问
java 保存富文本_如何从Web应用程序保存富文本并将其显示在富文本框中...
我建议弹出打开的写字板(开始 - 运行... - wordpad),并乱用不同的字体样式等 . 然后将其保存为某处的RTF文档 . 在您选择的纯文本编辑器中打开该文档(我使用Notepad++),这将帮助您更轻松地找出RTF . ...
继续访问
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
Bootstrap提供了一个叫wysiwyg的富文本组件,用来显示和编辑富文本数据,但如何将编辑后的数据保存到MySQL数据库,却不得而知。另外,如何将mysql数据库中的数据显示到wysiwyg也不得而知,对于这两个问题,让我来告诉你解决方案! 一、效果展示 首先,我们先来看看效果如何: 富文本中有一张图片,还有一个数字列表 我们可以看到编辑后的数据保存成功,以及保存后对应的展示。 二、富文本 度娘对于富文本的解释如下: 富文本格式(Rich Text Format, 一般简称为RTF)是由微软公司开发的跨平台文档格式。大多数的文字处理软件都能读取和保存RTF文档。RTF是Rich
富文本保存到数据库
标题 富文本保存到数据库 -idea String html = "p wx:nodeid='135'1.地方/pp wx:nodeid='156'2.第三方"; // 前端传过来的富文本内容 String temp = HtmlUtils.htmlEscapeHex(html); System.err.println("存数据库=\r\n" + temp); resume.setExperience(temp); Strin
继续访问
java中使用poi如何导富文本,Apache的POI - 读取和存储DB富文本内容
Using your favorite Java-to-database framework (JDBC, Hibernate, etc.), store the String value into contents in rich_text_string, and the associated FormattingRun object data into rt_formatting_runs. ...
继续访问
富文本保存到数据库_黑潮之羽的博客_富文本保存到数据库
富文本保存到数据库 String html = "1.地方2.第三方"; // 前端传过来的富文本内容 String temp = HtmlUtils.htmlEscapeHex(html); System.err.println("存数据库=\r\n" + temp); resume.setExperience(temp); String returnHt...
继续访问
java富文本
【代码】java富文本。
继续访问
富文本编辑器存MYSQL数据库
一、MYSQL数据库对应数据类型选用 longtest类型,对应java和mybatis框架类型为string。 二、富文本编辑器有特殊字符,存数据库会转义 在java代码中,添加org.springframework.web.util.HtmlUtils 包下的 HtmlUtils.htmlEscapeHex(String);把html的特殊字符转换成符合Intel HEX文件的字符串 HtmlUtils.htmlUnescape(...
继续访问
Java开发之富文本编辑器TinyMCE
一、题外话 最近负责了一个cms网站的运维,里面存在很多和编辑器有关的问题,比如编辑一些新闻博客,论文模块。系统采用的是FCKEditor,自我感觉不是很好,如下图 特别是在用户想插入一个图片的话,就很麻烦,所有用户共享一个文件目录,这样就不好了,于是便想到了TinyMCE编辑器,博客园默认的也是这个编辑器,接下 来,我们开始吧 二、TinyMCE编辑器集成步骤 2.1:下载相关文件...
继续访问
Java实现多文件上传下载,kindeditor富文本保存为word文件,文件列表分页显示
介绍 SpringBoot+Thymeleaf+Mybaits项目部分功能, 实现文件的多文件上传和下载,以及将kindeditor富文本内容保存为.doc文件 文件上传/创建后以列表形式显示,并且可以分页显示 提示 简单记录,仅供参考,代码并不完整,需要简单修改后才能使用(没提供.css文件,需要删除html中的class;另外部分变量通过session获取,可以适当修改) 关键代码 html: !DOCTYPE html html lang="en" xmlns:th="http
继续访问
JAVA:富文本框截图,将图片的Base64转File文件进行保存
代码】JAVA:富文本框截图,将图片的Base64转File文件进行保存。
继续访问
java 富文本框内容 保存与恢复,将富文本框内容直接保存到文件中。(不使用savefile对话框)...
how can I save the contents of a rich text box without needing to open the save file dialog.i think its something like:richTextBox1.SaveFile(@"\Documents\save_file_here.rtf");but it cant find the file...
继续访问
java富文本编辑数据存储到数据库简单实现
java富文本编辑数据存储到数据库简单实现-小白日记 前端代码 link rel="stylesheet" href="../themes/default/default.css" / script charset="utf-8" src="../kindeditor-all.js"/script script charset="utf-8" src="../lang/zh-CN.js"/script ...
继续访问
Java解析富文本
富文本Java解析
继续访问
java 关于处理富文本保存,查询,更新过慢问题
java 关于处理富文本保存,查询,更新过慢问题 首先了解为什么富文本保存,查询,更新会过慢 数据库富文本字段类型为:longtext 类型 假如富文本里面只保存文字的话,保存,查询,更新都会很快 注意:只有富文本里面插入图片或者视频的时候才会变的很慢–因为前端富文本组件会把图片或视频直接转化为base64编码,这样保存量数据就会变的极大! 解决方案: 后端提供一个文件上传的接口,前端富文本要插入图片的时候直接调上传接口,先把图片或者视频上传到服务器,返回图片的url,前端把url直接放到 im
继续访问
记一次富文本编辑器保存内容到数据库转换内容的问题
项目上要用到富文本编辑器,保存到数据库的时候它会自动转换成非HTML的格式,再次从数据库读取到页面后格式全乱了。如图:如果我们要按一开始我们输入的格式正常显示需要对保存的内容进行转换,转换成正常的HTML的格式方法是需要用到commons-lang3-3.3.2.jar 这个jar包下面的一个工具类String qualiHtml=StringEscapeUtils.unescapeHtml4(r...
继续访问
java 富文本 word_Java导出富文本到word
源码地址:背景最近用java开发一个中车项目管理系统,里面有一个维修单word导出功能。可用方案在网上查找资料,总结出两种比较可行的方案。(1) 制作word模板,导出成mht文件(单页面网页格式),然后往模板里渲染数据,最终生成word文档。(2) 制作word模板,导出成xml文件,然后往模板里渲染数据,最终生成word文档。两种都是采用模板的思想,比用poi去组织word格式简单的很多很多。...
继续访问
191210P4 Java富文本编辑之图片链接本地化
Java富文本编辑之图片链接本地化 作者:邵发 官网: 本文介绍在图文混编项目中(博客、新闻等),如何将富文本中的图片外链转为本地链接的问题。本文是Java学习指南系列教程的官方配套文档,项目源码在本文末尾说明。 所谓富文本Rich Text,就是以HTML形式表示的文本。在前端通常由富文本编辑器得到,比如UEditor,KindEditor,w...
继续访问
java 富文本框内容 保存与恢复_使用富文本编辑器保存数据后进行fastjson格式转换异常及序列化处理...
最近线上的ELK日志监控爆出几个异常问题,jsonException的解析问题。如下:message: 2019-04-10 23:37:43,952 ERROR aop.AspectAdvice eid=410724004 not match : - ,com.alibaba.fastjson.JSONException: not match : - , atcom.alibaba.fastjs...
继续访问
富文本编辑器内容存储至Mysql
文章目录概述获取富文本编辑器内容后端数据处理 概述 在所有的编辑器中,大概最受欢迎的就是富文本编辑器和MarkDown编辑器了,无论哪一种编辑器,我们需要知道的是,发给后端的内容是带着html标签的字符串,而我们需要把这些字符串存储到数据库中,其实原理非常简单,为了便于理解,我们首先创建一张表: CREATE TABLE `tb_title` ( `title_id` int(11) NOT NULL COMMENT '文章Id', `sort_id` int(11) DEFAULT NULL CO
继续访问
富文本数据保存
原文: Bootstrap提供了一个叫wysiwyg的富文本组件,用来显示和编辑富文本数据,但如何将编辑后的数据保存到mysql数据库,却不得而知。另外,如何将mysql数据库中的数据显示到wysiwyg也不得而知,对于这两个问题,让我来告诉你解决方案! 一、效果展示 首先,我们先来看...
继续访问
最新发布 java 将富文本转化为word,保留原本格式
通过java,将富文本转化为word
继续访问
热门推荐 Bootstrap wysiwyg,将富文本数据保存到mysql
Bootstrap提供了一个叫[wysiwyg]()的富文本组件,用来显示和编辑富文本数据,但如何将编辑后的数据保存到mysql数据库,却不得而知
继续访问
java富文本框信息如何保存
java
开发语言
写评论
评论
10
3
踩
分享