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

Java 留言板教學(五):回覆頁面開發——傳統 JSP Scriptlet 版

     編輯:Java 相關知識

對比上篇 JSTL 版,本篇用Scriptlet實現相同的回覆頁面,直觀展示代碼混雜、手動轉義、錯誤處理分散等痛點。

Scriptlet 回覆頁完整代碼

Scriptlet 回覆頁面截圖

<%@ page contentType="text/html;charset=UTF-8" import="java.util.*,com.example.model.*" %>
<html><head><title>回覆留言</title>
<style>.error{color:red} textarea{width:100%;height:120px}</style></head><body>
<h2>回覆留言</h2>

<% 
    Message parent = (Message) request.getAttribute("parent");
    Map<String,String> errors = (Map<String,String>) request.getAttribute("errors");
    User loginUser = (User) session.getAttribute("loginUser");
%>

<fieldset><legend>原貼文</legend>
  <strong>標題:</strong><%= parent.getTitle() %><br/>
  <strong>作者:</strong><%= parent.getUser().getUsername() %><br/>
  <strong>內容:</strong><%= parent.getContent() %>
</fieldset>

<form action="replySubmit" method="post">
  <input type="hidden" name="parentId" value="<%= parent.getId() %>" />
  <input type="hidden" name="userId" value="<%= loginUser.getId() %>" />
  
  <div>
    <label>標題(選填):</label>
    <input type="text" name="title" size="60" value="<%= request.getParameter("title") != null ? request.getParameter("title") : "" %>" />
  </div>
  <div>
    <label>內容(必填):</label><br/>
    <textarea name="content"><%= request.getParameter("content") != null ? request.getParameter("content") : "" %></textarea>
    <% if (errors != null && errors.get("content") != null) { %>
      <span class="error"><%= errors.get("content") %></span>
    <% } %>
  </div>
  <div>
    <input type="submit" value="送出回覆" />
    <input type="button" value="取消" onclick="history.back()" />
  </div>
</form>
</body></html>

痛點逐一拆解

  1. 取值冗長:request.getParameter("title") != null ? ... : "" 每個欄位都要寫一次;JSTL 只需 ${param.title}。
  2. 無自動轉義:<%= parent.getTitle() %> 直接輸出,若標題含 <script> 將觸發 XSS;必須手動 StringEscapeUtils.escapeHtml()。
  3. 錯誤 Map 取值繁瑣:需判空再 get(),JSTL ${errors.content} 自動處理 null。
  4. Java 代碼插在 HTML 中:閱讀時需在標簽屬性裡解析 Java 表達式,極易漏寫 %> 或引號不匹配。
  5. Session 取值硬編碼鍵名:"loginUser" 字串分散在多個 JSP,重構時易遺漏。

重構建議

  • 引入 JSTL + EL 立即替換所有 Scriptlet。
  • 若專案禁用 EL(極舊環境),可自訂標簽庫封裝常用邏輯(<my:input>、<my:error>)。
  • 長期規劃遷移至 Thymeleaf / FreeMarker / JSF 等現代模板引擎,徹底杜絕 Scriptlet。

系列下一篇將進入 Service 層:JDBC 實現留言板核心業務邏輯。

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