首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 留言板教學(四):回覆頁面開發——JSTL 版

     編輯:Java 相關知識

本篇實作回覆發文頁面,包含表單驗證、巢狀回覆顯示、隱藏父貼 ID 傳遞,採用 JSTL + EL 保持視圖純淨。

頁面流程

  1. 用戶點擊列表頁「回覆」連結,攜帶 parentId 進入 replyForm。
  2. Controller 查詢父貼文資訊(標題、作者、內容),放入 request 轉發至 reply_jstl.jsp。
  3. 頁面顯示父貼文摘要,提供回覆表單(標題可選、內容必填)。
  4. 提交至 replySubmit,Service 驗證後持久化,重導向列表頁或詳情頁。

JSTL 回覆頁完整代碼

JSTL 回覆頁面截圖

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<html><head><title>回覆留言</title>
<style>.error{color:red} textarea{width:100%;height:120px}</style></head><body>
<h2>回覆留言</h2>

<!-- 顯示父貼文摘要 -->
<fieldset><legend>原貼文</legend>
  <strong>標題:</strong><c:out value="${parent.title}" /><br/>
  <strong>作者:</strong><c:out value="${parent.user.username}" /><br/>
  <strong>內容:</strong><c:out value="${parent.content}" />
</fieldset>

<!-- 回覆表單 -->
<form action="replySubmit" method="post">
  <input type="hidden" name="parentId" value="<c:out value='${parent.id}'/>" />
  <input type="hidden" name="userId" value="<c:out value='${sessionScope.loginUser.id}'/>" />
  
  <div>
    <label>標題(選填):</label>
    <input type="text" name="title" size="60" value="<c:out value='${param.title}'/>" />
  </div>
  <div>
    <label>內容(必填):</label><br/>
    <textarea name="content"><c:out value="${param.content}"/></textarea>
    <span class="error"><c:out value="${errors.content}" /></span>
  </div>
  <div>
    <input type="submit" value="送出回覆" />
    <input type="button" value="取消" onclick="history.back()" />
  </div>
</form>
</body></html>

關鍵技術點

  • 隱藏域傳遞父 ID:<input type="hidden" name="parentId"> 確保提交時關聯正確父貼文。
  • 回顯用戶輸入:value="${param.title}"、<c:out value="${param.content}">,驗證失敗時保留用戶已輸入內容。
  • 錯誤訊息顯示:Controller 驗證失敗將 Map<String,String> errors 放入 request,頁面用 ${errors.content} 顯示。
  • Session 取得登入用戶:${sessionScope.loginUser.id} 直接取得當前用戶 ID,無需 Controller 額外傳遞。
  • XSS 防護:所有動態輸出均用 <c:out> 自動轉義。

Controller 驗證邏輯片段

Map<String, String> errors = new HashMap<>();
if (content == null || content.trim().isEmpty()) {
    errors.put("content", "回覆內容不能為空");
}
if (!errors.isEmpty()) {
    request.setAttribute("errors", errors);
    request.setAttribute("parent", parentMessage); // 重新查詢父貼文
    return "reply_jstl"; // 轉發回表單頁
}
// 通過驗證 -> 建立 Message 物件 -> messageService.reply(parentId, userId, title, content)
// 重導向:return "redirect:list";

下一篇將展示同功能的 Scriptlet 版本對比。

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