UEditor文档在Servlet项目上的应用

UEditor 是一款功能强大的富文本编辑器,在项目中应用广泛。

Ueditor使用

引入 UEditor

  1. 下载 UEditor:从 UEditor 官方网站(ueditor 官网)下载适合项目需求的版本。
  2. 解压文件:将下载的压缩包解压到项目的静态资源目录下,例如在 Web 项目中,可将其解压到webapp目录下的static文件夹中。
  3. 引入相关文件:在需要使用 UEditor 的页面中,通过 HTML 的<script><link>标签引入 UEditor 的 JavaScript 和 CSS 文件。

 初始化 UEditor

在页面的 JavaScript 代码中,使用以下代码初始化 UEditor:

var ue = UE.getEditor('editor', {// 在这里可以配置UEditor的各种参数toolbars: [// 定义工具栏按钮['source', '|', 'undo', 'redo', '|', 'bold', 'italic', 'underline', 'strikethrough', '|', 'fontsize']],// 其他配置项autoHeightEnabled: true,autoFloatEnabled: false
});

其中,'editor'是页面中用于显示 UEditor 的<textarea>或<div>元素的 ID。通过配置toolbars可以定义显示哪些工具栏按钮,还可以配置其他参数如autoHeightEnabled(自动调整高度)、autoFloatEnabled(自动浮动工具栏)等。

创建demo文件

解压下载的包,在解压后的目录创建 demo.html 文件,填入下面的html代码(如果不是本目录下建立要在WEB—INF下的lib中添加ueditor-1.1.2.jar)

<!DOCTYPE HTML>
<html lang="en-US"><head><meta charset="UTF-8"><title>ueditor demo</title>
</head><body><!-- 加载编辑器的容器 --><script id="container" name="content" type="text/plain">这里写你的初始化内容</script><!-- 配置文件 --><script type="text/javascript" src="ueditor.config.js"></script><!-- 编辑器源码文件 --><script type="text/javascript" src="ueditor.all.js"></script><!-- 实例化编辑器 --><script type="text/javascript">var ue = UE.getEditor('container');</script>
</body></html>

在浏览器打开demo.html

如果看到了下面这样的编辑器,恭喜你,初次部署成功!

 

内容获取与提交

获取内容:在表单提交或其他需要获取 UEditor 内容的地方,使用ue.getContent()方法获取编辑器中的富文本内容。例如

var content = ue.getContent();
// 将内容设置到隐藏域或直接作为表单数据提交
document.getElementById('hiddenContent').value = content;

提交内容:将获取到的内容作为表单数据提交到后端服务器。可以通过表单的submit方法提交,也可以使用 AJAX 进行异步提交。例如,使用 AJAX 提交的代码如下:

$.ajax({url: 'yourServletUrl',type: 'post',data: {content: content},success: function (result) {// 处理服务器返回的结果},error: function () {// 处理错误}
});

后端接收与处理

在后端的 Servlet 或其他处理程序中,通过request.getParameter("content")获取提交的 UEditor 内容。然后可以将其存储到数据库中,或者进行其他相应的处理。例如,在 Java Servlet 中:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String content = request.getParameter("content");// 对content进行处理,如存储到数据库// ...response.getWriter().write("success");
}

完整项目代码: 

student.sql数据表:

CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,`age` int(11) DEFAULT NULL,`sex` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,`introduce` text COLLATE utf8mb4_bin,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

add.html代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="js/jquery-3.7.1.min.js"></script>
<script src="js/add.js" defer></script>
<style>
.addModel, .deleteModel, .updateModel {margin-top: 20px;border: 5px, solid yellow;padding;5px;
}
</style>
</head>
<body><div class='addModel'>姓名:<input type='text' class='addName'><br> 年龄:<input type='text' class='addAge'><br> 性别:<input type='text'class='addSex'><br> 自我介绍<br><!-- 加载编辑器的容器 --><script id="container" name="content" type="text/plain">这里写你的初始化内容</script><!-- 配置文件 --><script type="text/javascript" src="utf8-jsp/ueditor.config.js"></script><!-- 编辑器源码文件 --><script type="text/javascript" src="utf8-jsp/ueditor.all.js"></script><input type='button' value='添加'class='addBtn'> <input type='button' value='取消' class='back'></div>
</body>
</html>

add.js代码:

var ue=UE.getEditor('container');
//点取消小模块隐藏	$(".back").click(function(){
//	$(".addModel").css("display","none")
//	$(".updateModel").css("display","none")
//	$(".deleteModel").css("display","none")location.href="student.html"})
//添加$(".addBtn").click(function(){var name = $(".addName").val().trim();var sex = $(".addSex").val().trim();var age = $(".addAge").val().trim();var introduce=ue.getContent();if (name === "") {alert("姓名不能为空");return;}if (sex === "") {alert("性别不能为空");return;}if (age === "") {alert("年龄不能为空");return;}$.ajax({url: "AddServlet1",type: "post", // 修正拼写错误data: { name, age, sex,introduce},success: function (value) {alert(value);location.href="student.html"},error: function () {alert("出错啦");}});
});

 servlet代码:

package com.qcby.servlet;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.qcby.db.MysqlUtil;/*** Servlet implementation class AddServlet1*/
@WebServlet("/AddServlet1")
public class AddServlet1 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public AddServlet1() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.getWriter().append("Served at: ").append(request.getContextPath());}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String name=request.getParameter("name");String age=request.getParameter("age");String sex=request.getParameter("sex");String introduce=request.getParameter("introduce");introduce=introduce.replaceAll("\"", "\'");String sql ="insert into student(name,age,sex,introduce) values(\""+name+"\","+age+",\""+sex+"\",\""+introduce+"\")";System.out.println(sql);int num=MysqlUtil.add(sql);String res="worng";if(num>0) {res="添加成功";}response.setCharacterEncoding("utf-8");response.getWriter().write(res);}}
package com.qcby.servlet;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.qcby.db.MysqlUtil;/*** Servlet implementation class UpdateServlet1*/
@WebServlet("/UpdateServlet1")
public class UpdateServlet1 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public UpdateServlet1() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.getWriter().append("Served at: ").append(request.getContextPath());}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("update post成功");String id = request.getParameter("id");String name = request.getParameter("name");String age = request.getParameter("age");String sex = request.getParameter("sex");String introduce=request.getParameter("introduce");// 检查 introduce 是否为 nullif (introduce != null) {introduce = introduce.replaceAll("\"", "\'");} else {introduce = ""; // 若为 null,将其设为一个空字符串}String sql = "UPDATE student set name=\""+name+"\",age="+age+",sex=\""+sex+"\",introduce=\""+introduce+"\" where id="+id+";";int num=MysqlUtil.update(sql);String res="worng";if(num>0) {res="欢迎入住!!";}response.setCharacterEncoding("utf-8");response.getWriter().write(res);}}

添加: 

 修改:

 

问题:

1 引入文件时会报错

如上边的图所示,在引入Editor时会报错,1.原因时jsp文件没放到正确的位置2.  "imageUrlPrefix": "", /* 图片访问路径前缀 */需要添加项目名。

 2. 空指针异常

在 UpdateServlet1 的 doPost 方法中,introduce=introduce.replaceAll("\"", "\'"); 这行代码会报错。原因是当 request.getParameter("introduce") 获取到的 introduce 为 null(即前端请求未传递该参数)时,对 null 对象调用 replaceAll 方法会引发 NullPointerException。

3.SQL 注入风险

构建 SQL 语句时采用字符串拼接的方式,如 String sql = "UPDATE student set name=\"" + name + "\",age=" + age + ",sex=\"" + sex + "\",introduce=\"" + introduce + "\" where id=" + id + ";";。这种方式存在严重的 SQL 注入风险,恶意用户可通过构造特殊输入改变 SQL 语句原意,执行非法操作。

4. 参数处理问题

  • 参数为空或格式错误:对于从请求中获取的参数,如 idnameagesexintroduce 等,未进行充分的空值检查和格式验证。若 id 或 age 为空,或者 age 无法转换为整数(在 pstmt.setInt(2, Integer.parseInt(age)); 时),会抛出 NullPointerException 或 NumberFormatException
  • 参数名称不匹配:前端传递参数的名称可能与后端 request.getParameter 方法中使用的参数名称不一致,导致获取不到对应的值,如前端传递的 introduce 参数名与后端获取时使用的名称不同。

5. “ ,‘ 问题:

introduce = introduce.replaceAll("\"", "\'"); 这行代码的目的是将字符串 introduce 里的所有双引号 " 替换为单引号 '。不过,在实际运用时会存在一些问题和需要留意的地方,下面为你详细分析。replaceAll 是 Java 中 String 类的一个方法,其功能是用指定的替换字符串替换原字符串里所有匹配给定正则表达式的子字符串。在这个代码里,正则表达式 "\"" 代表双引号,而 "\'" 代表单引号。因此,这行代码会把 introduce 字符串里的所有双引号替换成单引号。

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

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

    相关文章

    ThinkPHP快速使用手册

    目录 介绍 安装&#xff08;windows环境&#xff09; 安装Composer 安装ThinkPHP 目录结构 配置文件 第一个接口&#xff08;Controller层&#xff09; Hello World 自定义Controller 请求参数 获取查询参数&#xff08;Get请求&#xff09; 获取指定请求参数 获取…

    面向 C# 初学者的完整教程

    &#x1f9f1; 一、项目结构说明 你的项目大致结构如下&#xff1a; TaskManager/ ├── backend/ │ ├── TaskManager.Core/ // 实体类和接口 │ ├── TaskManager.Infrastructure/ // 数据库、服务实现 │ └── TaskManager.API/ // We…

    Axios 的 GET 和 POST 请求:前端开发中的 HTTP 通信

    &#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

    【前端】如何检查内存泄漏

    在实际的场景中&#xff0c;如果观察到内存持续出现峰值&#xff0c;并且内存消耗一直没有减少&#xff0c;那可能存在内存泄漏。 使用 Chrome DevTools 来识别内存图和一些内存泄漏&#xff0c;我们需要关注以下两个方面&#xff1a; ● 使用性能分析器可视化内存消耗&#xf…

    JavaScript的JSON处理Map的弊端

    直接使用 Map 会遇到的问题及解决方案 直接使用 Map 会导致数据丢失&#xff0c;因为 JSON.stringify 无法序列化 Map。以下是详细分析及解决方法&#xff1a; 问题复现 // 示例代码 const myMap new Map(); myMap.set(user1, { name: Alice }); myMap.set(user2, { name: B…

    【数据结构】第五弹——Stack 和 Queue

    文章目录 一. 栈(Stack)1.1 概念1.2 栈的使用1.3 栈的模拟实现1.3.1 顺序表结构1.3.2 进栈 压栈1.3.3 删除栈顶元素1.3.4 获取栈顶元素1.3.5 自定义异常 1.4 栈的应用场景1.改变元素序列2. 将递归转化为循环3. 四道习题 1.5 概念分区 二. 队列(Queue)2.1 概念2.2 队列的使用2.3…

    第七届能源系统与电气电力国际学术会议(ICESEP 2025)

    重要信息 时间&#xff1a;2025年6月20-22日 地点&#xff1a;中国-武汉 官网&#xff1a;www.icesep.net 主题 能源系统 节能技术、能源存储技术、可再生能源、热能与动力工程 、能源工程、可再生能源技术和系统、风力发…

    深入解析C++ STL Stack:后进先出的数据结构

    一、引言 在计算机科学中&#xff0c;栈&#xff08;Stack&#xff09;作为一种遵循后进先出&#xff08;LIFO&#xff09;​原则的数据结构&#xff0c;是算法设计和程序开发的基础构件。C STL中的stack容器适配器以简洁的接口封装了底层容器的操作&#xff0c;为开发者提供了…

    Golang | 自行实现并发安全的Map

    核心思路&#xff0c;读写map之前加锁&#xff01;哈希思路&#xff0c;大map化分为很多个小map

    Mac 「brew」快速安装MySQL

    安装MySQL 在 macOS 上安装 MySQL 环境可以通过Homebrew快速实现&#xff0c;以下是步骤指南&#xff1a; 方法 1&#xff1a;使用 Homebrew 安装 MySQL 1. 安装 Homebrew 如果尚未安装 Homebrew&#xff0c;可以通过以下命令安装&#xff1a; /bin/bash -c "$(curl -…

    【数字孪生世界的搭建之旅:从0到1理解飞渡平台】

    数字孪生世界的搭建之旅&#xff1a;从0到1理解飞渡平台 前言&#xff1a;数字分身的魔法 想象一下&#xff0c;如果你能在现实世界之外&#xff0c;创造一个物理世界的"分身"&#xff0c;这个分身能完美复制现实中的一切变化&#xff0c;甚至可以预测未来可能发生…

    【漏洞复现】Struts2系列

    【漏洞复现】Struts2系列 1. 了解Struts21. Struts2 S2-061 RCE &#xff08;CVE-2020-17530&#xff09;1. 漏洞描述2. 影响版本3. 复现过程 1. 了解Struts2 Apache Struts2是一个基于MVC设计模式的Web应用框架&#xff0c;会对某些标签属性&#xff08;比如 id&#xff09;的…

    [FPGA Video IP] Video Processing Subsystem

    Xilinx Video Processing Subsystem IP (PG231) 详细介绍 概述 Xilinx LogiCORE™ IP Video Processing Subsystem (VPSS)&#xff08;PG231&#xff09;是一个高度可配置的视频处理模块&#xff0c;设计用于在单一 IP 核中集成多种视频处理功能&#xff0c;包括缩放&#xf…

    自动驾驶(ADAS)功能--相关名称及缩写

    根据《道路车辆先进驾驶辅助系统&#xff08;ADAS&#xff09;术语及定义》GB/T 39263—2020&#xff0c;如下表格&#xff1a; 编号中文术语英文缩写定义类别2.1.1先进驾驶辅助系统ADAS利用传感、通信、决策及执行等装置&#xff0c;实时监测驾驶员、车辆及行驶环境&#xff…

    1.9软考系统架构设计师:优秀架构设计师 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析

    超简记忆要点 1. 优秀架构师标准 ✅ 技术&#xff08;深度/广度&#xff09; 实战&#xff08;大型项目&#xff09; 素养&#xff08;沟通/业务前瞻&#xff09; 2. 演化路径 &#x1f4c8; 积累&#xff08;技术/项目&#xff09; → 思维&#xff08;系统视角/抽象建模&…

    (MySQL)库的操作

    目录 创建数据库 语法 创建数据库实例 不使用可选项 使用可选项1 字符集和校验规则 校验规则对数据库的影响 不区分大小写 查看配置 添加可选项2 操纵数据库 使用数据库 查看数据库 查看所有数据库 查询当前正在使用的数据库名称 显示创建数据库语句 修改数据库…

    10.ArkUI Grid的介绍和使用

    ArkUI Grid 组件详解与使用指南 Grid 是 ArkUI 中用于实现网格布局的容器组件&#xff0c;能够以行和列的形式排列子组件。以下是 Grid 组件的详细介绍和使用方法。 基本介绍 Grid 组件特点&#xff1a; 支持固定列数和自适应布局提供灵活的间距和排列控制支持滚动显示大量…

    目标检测原理简介

    目标检测是一类计算机视觉任务,简单来说,目标检测可被定义为在计算机中输入一张图像,计算机需要找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,如图一所示。目标检测是计算机视觉领域的核心问题之一,相较于最原始的将整张图片分类为某一类别,目标检测不光可…

    ZYNQ笔记(十四):基于 BRAM 的 PS、PL 数据交互

    版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 实验任务&#xff1a; PS 将字符串数据写入BRAM&#xff0c;再将数据读取出来&#xff1b;PL 从 BRAM 中读取数据&#xff0c;bing。通过 ILA 来观察读出的数据&#xff0c;与前面串口打印的数据进行对照&#xff0…

    Python-Django系列—部件

    部件是 Django 对 HTML 输入元素的表示。部件处理 HTML 的渲染&#xff0c;以及从对应于部件的 GET&#xff0f;POST 字典中提取数据。 内置部件生成的 HTML 使用 HTML5 语法&#xff0c;目标是 <!DOCTYPE html>。例如&#xff0c;它使用布尔属性&#xff0c;如 checked…