首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Struts2 + AJAX 表單提交:解決 CKEditor 內容無法傳輸及 Action 跳轉失效的雙重難題

     編輯:程式設計綜合問答

在 Struts2 專案中使用 jQuery AJAX 提交表單時,常遇到兩個經典問題:CKEditor 富文本內容為空,以及 Action 返回結果頁面無法跳轉。本文梳理根因並給出完整解決方案。

問題一:CKEditor 內容無法隨表單提交

原因:CKEditor 實際將內容寫入隱藏的 <textarea>,但 $("#form").serialize() 或 FormData 只會讀取 <input>/<select> 等標準表單元素,不會自動同步 CKEditor 實例的最新內容到 textarea。

解決方案:提交前手動調用 CKEDITOR.instances[editorId].updateElement(),或直接讀取實例內容追加到請求數據。

// 方案 A:同步所有 CKEditor 實例
for (var instance in CKEDITOR.instances) {
    CKEDITOR.instances[instance].updateElement();
}
var formData = $("#sendmail").serialize(); // 現在 textarea 已有最新值

// 方案 B:手動構建數據(適用於 $.ajax)
var content = CKEDITOR.instances.guide_content.getData();
var parm = $("#sendmail").serialize() + "&guide_content=" + encodeURIComponent(content);

問題二:AJAX 成功回調中無法實現 Struts2 結果頁面跳轉

原因:AJAX 請求屬於異步 HTTP 請求,瀏覽器不會自動處理 302 重定向或直接渲染返回的 HTML 頁面。Struts2 Action 返回 "sendMailSuccess" 對應的 JSP 只是作為 AJAX 響應文本返回給 success 回調的 data 參數。

解決方案:

  1. 後端返回 JSON 指令,前端根據狀態碼決定 window.location.href。
  2. 放棄 AJAX,改用普通表單提交(配合方案一同步 CKEditor),瀏覽器原生支持跳轉。
  3. iframe 彈窗提交:將表單 target 指向隱藏 iframe,提交後由 iframe 載入結果頁。

推薦最佳實踐:普通提交 + CKEditor 同步

<form id="sendmail" action="<%=basePath%>user/sendMail!sendEmail.action" method="post">
    <textarea id="guide_content" name="guide_content" class="ckeditor"></textarea>
    <input type="submit" value="發送" onclick="syncCKEditor()">
</form>

<script>
function syncCKEditor() {
    for (var i in CKEDITOR.instances) {
        CKEDITOR.instances[i].updateElement();
    }
    return true; // 繼續原生提交
}
</script>

後端 Action 保持不變:

public String sendEmail() {
    MailBean mailBean = setMailBean();
    // 直接從 request 獲取同步後的 textarea 值
    String tContent = request.getParameter("guide_content");
    mailBean.setContent(tContent);
    // ... 發送郵件邏輯
    return "sendMailSuccess"; // 對應 struts.xml 中的 result 頁面
}

總結

  • CKEditor 必須 手動同步 到底層 textarea 才能被表單序列化。
  • AJAX 無法直接觸發瀏覽器頁面跳轉,普通表單提交 是最省事、最符合 Struts2 設計的方式。
  • 若必須用 AJAX(如顯示進度條),後端返回 {success: true, redirectUrl: "..."},前端 window.location.href = data.redirectUrl。

掌握這兩點,即可徹底解決 Struts2 + AJAX + CKEditor 的提交與跳轉難題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved