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.pswp.cn/bicheng/78599.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78599.shtml
    英文地址,請注明出處:http://en.pswp.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…