` 靜態標題都不顯示**,且無任何異常拋出。這類「靜默失敗」最令人抓狂。以下整理核心排查步驟與高頻坑位。
現象複現
- 昨晚連線正常、資料正常顯示。
- 今日刪除資料庫一欄位,同步刪除 JSP 對應
rs.getString()。
- 重跑專案:瀏覽器真空白,連 HTML 靜態結構都不渲染,Console 無錯誤、Server Log 無異常。
- 半小時後未動代碼重跑,神奇地又正常了。
核心排查清單
1. 異常被吞沒——最兇手
} catch (SQLException e1) {
// 空 catch 區塊!任何 SQL 錯誤、連線中斷、欄位不存在都會被吞掉
// 導致後續 HTML 不輸出,頁面直接斷在這裡
}
修正:至少 e1.printStackTrace(); 或記錄日誌,開發期建議直接拋出或頁面輸出錯誤訊息。
2. JSP 指令語法錯誤導致編譯失敗
<%@page contentType="text/html;charset=gbk"%> <-- 缺少空格與引號,應為 -->
<%@ page contentType="text/html; charset=gbk" %>
語法錯誤會導致 JSP 編譯成 Servlet 失敗,伺服器可能返回空白或 500,視容器配置而定。
3. ResultSet 游標與欄位索引不匹配
- 刪除資料庫欄位後,
SELECT * 返回欄位數變少,但 JSP 仍按原索引 rs.getString(5) 取值 → 拋出 SQLException: Column index out of range,被空 catch 吞掉。
- 建議:SQL 明確列出欄位
SELECT id, name, desc, price FROM tb_goods,JSP 按名稱取值 rs.getString("name"),避免索引錯位。
4. 連線/Statement/ResultSet 資源未關閉導致連線洩漏
長期運行會耗盡連線池,後續請求卡死或報錯。請使用 try-with-resources (JDK 7+) 或 finally 區塊確實關閉。
5. 容器熱部署/快取導致舊類殘留
Tomcat 熱部署偶爾會載入舊版 Servlet 類,造成行為不一致。遇到「碼沒動卻自動好」時,優先嘗試:清理 work 目錄、重啟容器、Maven clean compile。
建議除錯流程
- 在 catch 區塊輸出堆疊追蹤至頁面或日誌。
- 將 JDBC 邏輯抽離至純 Java 類(POJO/DAO),單元測試驗證 SQL 與映射邏輯,排除 JSP 編譯干擾。
- 開啟容器詳細日誌(Tomcat:
logging.properties 設定 FINE)。
- 檢查瀏覽器「檢查元素 → Network」確認回應內容是否為空、狀態碼。
「把代碼搬到 Java 測試類裡跑一遍,調試往往分分鐘定位問題。」—— 這才是最高效的排查原則。
copyright ©
萬盛學電腦網 all rights reserved