response.sendRedirect() 依賴發送 HTTP 302 狀態碼 + Location Header。**一旦 Response Body 寫入任何內容 (哪怕是一個空白字元、換行、JSP 輸出),Header 就會被強制刷新提交,後續呼叫 sendRedirect 會拋出 IllegalStateException: Cannot forward after response has been committed 或直接無效導致頁面空白。**
<%@ page ... %>\n<html> → 模板文字輸出 → 提交。System.out.println / out.print: 你的 doGet 沒顯示輸出,但若有任何 response.getWriter() 寫入即觸發。<% ... %> 邏輯輸出: 你的結果頁 chengji_jieguo.jsp 有 out.print,但那是跳轉目標,不影響來源 Servlet。response.sendRedirect("chaxun_chengji/chengji_jieguo.jsp") 是相對路徑,若當前 Servlet 路徑為 /ChengjiServlet2,重定向目標變為 /chaxun_chengji/chengji_jieguo.jsp (相對根目錄) 或 /ChengjiServlet2/chaxun_chengji/... (相對當前),極易 404。建議用絕對路徑 /項目名/chaxun_chengji/chengji_jieguo.jsp。protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 參數獲取
String sname = request.getParameter("sname");
String sno = request.getParameter("sno");
String selectScore = request.getParameter("select"); // 注意:表單無 name="select" 輸入框,這值永遠為 null
// 2. 業務邏輯 (建議移至 Service 層)
List chengji = new ArrayList<>();
Connection conn = null;
try {
conn = getConnection(); // 你的連線方法
// ... 執行 SQL 查詢填充 chengji ...
// 3. 存入 Session
request.getSession().setAttribute("score", chengji);
} catch (SQLException e) {
e.printStackTrace();
// 錯誤處理:轉向錯誤頁
request.setAttribute("errorMsg", "查詢失敗: " + e.getMessage());
request.getRequestDispatcher("/error.jsp").forward(request, response);
return; // 關鍵:forward 後必須 return 防止繼續執行
} finally {
closeQuietly(conn);
}
// 4. 重定向 (絕對路徑 + encodeURL)
String redirectUrl = request.getContextPath() + "/chaxun_chengji/chengji_jieguo.jsp";
response.sendRedirect(response.encodeRedirectURL(redirectUrl));
}
select 值<form method="post" action="<%=request.getContextPath()%>/ChengjiServlet2">
<input type="hidden" name="select" value="score_1" /> <!-- 或由 JS 動態設定 -->
姓名: <input name="sname" /><br/>
學號: <input name="sno" /><br/>
<input type="submit" value="查詢" />
</form>
chengji_jieguo.jsp 修正:EL 表達式替代 Scriptlet<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<html><body>
<h2>成績情況</h2>
<table border="1">
<c:forEach items="${sessionScope.score}" var="item" varStatus="status">
<tr><td>${status.index + 1}</td><td>${item}</td></tr>
</c:forEach>
</table>
</body></html>
"... where sno='"+Sno+"'"。必須使用 PreparedStatement:ps = conn.prepareStatement("SELECT ... WHERE sno=? AND sname=?"); ps.setString(1, sno);ResultSet, Statement, Connection 需在 finally 中依序關閉,或用 Try-with-resources (Java 7+)。Service 類,資料訪問移至 DAO 類。頁面空白 90% 是 **Response 已提交導致 sendRedirect 失效** 或 **重定向路徑 404**。
檢查清單:
1. Servlet 確保**零輸出** (含 JSP 包含、空白行)。
2. 使用 request.getContextPath() 構建絕對重定向路徑。
3. 表單補全所有需傳遞的參數 (如 select)。
4. **立即修復 SQL 注入漏洞**,改用 PreparedStatement。
5. 善用 RequestDispatcher.forward (伺服器端跳轉,保留 Request 屬性) 替代 sendRedirect (客戶端跳轉,需重新請求),視業務場景選擇。