在 search_result.jsp 中使用 JDBC 連接 SQL Server 實現分頁,運行時拋出 NullPointerException,堆疊指向 rs.last() 或 rs.getRow()。
<%
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
// ... 連接、查詢賦值 rs = stmt.executeQuery(strSql);
}catch(Exception e){
// 空 catch 塊吞沒異常
}
%>
<%
// 此處 rs 為 null,因為 try 塊結束後區域變量 rs 已超出作用域
String str = (String)request.getParameter("page");
rs.last(); // NullPointerException
%>
ResultSet rs 在 try 塊內聲明並賦值,屬於局部變量,try 塊結束後即銷毀。後續 Scriptlet 中引用的 rs 實為未初始化的外部變量(或根本不存在),導致空指針。
Connection、Statement、ResultSet 聲明在頁面頂層 <%! %> 宣告區,或使用頁面上下文屬性 pageContext.setAttribute("rs", rs) 傳遞。List<Map>)存入 request 轉發給 JSP 純展示,徹底避免 JSP 中混寫 JDBC 代碼。try-with-resources(JDK 7+)或 finally 確保連接關閉,避免洩漏。// Servlet
List<Student> list = studentDao.findByPage(page, pageSize);
request.setAttribute("students", list);
request.setAttribute("pageInfo", pageInfo);
request.getRequestDispatcher("/search_result.jsp").forward(req, resp);
JSP 僅遍歷 ${students} 渲染表格,邏輯清晰、易維護、無作用域陷阱。