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

Java 留言板教學(九):發文頁面開發——傳統 JSP Scriptlet 版

     編輯:Java 相關知識

對比上篇 JSTL 版,本篇用Scriptlet實現相同的發文頁面,直觀展示驗證邏輯分散、CSRF 處理繁瑣、HTML5 屬性與 Java 代碼混雜等痛點。

Scriptlet 發文頁完整代碼

Scriptlet 發文頁面截圖

<%@ page contentType="text/html;charset=UTF-8" import="java.util.*" %>
<html><head><title>發布主題</title>
<style>.error{color:red} textarea{width:100%;height:150px}</style></head><body>
<h2>發布新主題</h2>

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

<form action="postSubmit" method="post">
  <input type="hidden" name="csrfToken" value="<%= csrfToken %>" />
  <input type="hidden" name="userId" value="<%= loginUser.getId() %>" />
  
  <div>
    <label>標題(必填):</label>
    <input type="text" name="title" size="80" maxlength="200" required
           value="<%= request.getParameter("title") != null ? request.getParameter("title") : "" %>" />
    <% if (errors != null && errors.get("title") != null) { %>
      <span class="error"><%= errors.get("title") %></span>
    <% } %>
  </div>
  <div>
    <label>內容(必填):</label><br/>
    <textarea name="content" required><%= 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. 三元運算符泛濫:每個輸入框 value 都要寫 request.getParameter("x") != null ? ... : "",JSTL 一個 ${param.x} 搞定。
  2. 錯誤判斷冗長:errors != null && errors.get("x") != null 重複寫;JSTL ${errors.x} 自動安全導航。
  3. CSRF Token 硬編碼:<%= csrfToken %> 直接輸出,若 Token 含特殊字元需手動轉義;JSTL <c:out> 自動處理。
  4. HTML5 required 與 Scriptlet 混雜:瀏覽器端驗證與伺服器端邏輯交織,閱讀時需在標簽屬性裡解析 Java 代碼。
  5. 無自動轉義:所有 <%= ... %> 直接輸出,極易造成 XSS。

遷移建議

  • 逐頁替換:優先替換高流量、高風險頁面(登入、發文、設定)。
  • 引入 jsp:include 抽取通用片段(表頭、表尾、錯誤顯示片段),減少重複 Scriptlet。
  • 長期規劃遷移至 Thymeleaf/FreeMarker,徹底告別 JSP。

系列最後一篇將介紹 Hibernate 整合,展示 ORM 如何簡化 DAO/Service 代碼。

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