首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JSP 資料庫查詢報錯:Servlet 轉發缺少 Bean 屬性導致顯示異常

     編輯:程式設計綜合問答

錯誤場景

Servlet 查詢資料庫後 forward 至 displayinform.jsp,但 JSP 使用 <jsp:getProperty> 取值時發生錯誤,或頁面顯示空白。

程式碼缺陷分析

  1. Servlet 未將查詢結果放入請求屬性:
    ProductBean product = productdao.searchinfom(username);
    // 缺少 request.setAttribute("product", product);
    RequestDispatcher view = request.getRequestDispatcher("/displayinform.jsp");
    view.forward(request, response);
    
  2. JSP 缺少 <jsp:useBean> 聲明,直接使用 <jsp:getProperty> 會找不到 Bean。
  3. DAO 回傳 null 未處理:查無資料時 searchinfom 回傳 null,JSP 取值拋出 NullPointerException。

修正完整流程

1. Servlet 端

public void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
    String username = request.getParameter("username");
    ProductDao dao = new ProductDao();
    ProductBean product = dao.searchinfom(username);
    
    if (product != null) {
        request.setAttribute("product", product); // 關鍵:放入 request 作用域
        request.getRequestDispatcher("/displayinform.jsp").forward(request, response);
    } else {
        request.setAttribute("errorMsg", "查無此用戶訂單");
        request.getRequestDispatcher("/error.jsp").forward(request, response);
    }
}

2. JSP 端 (displayinform.jsp)

<%@ page contentType="text/html; charset=gb2312" %>
<jsp:useBean id="product" class="com.bean.ProductBean" scope="request"/>
<!DOCTYPE html>
<html>
<body>
  書號:<jsp:getProperty name="product" property="product_id"/><br>
  書名:<jsp:getProperty name="product" property="product_name"/><br>
  價格:<jsp:getProperty name="product" property="price"/>
</body>
</html>

3. DAO 資源關閉優化

try (Connection conn = dataSource.getConnection();
     PreparedStatement pstmt = conn.prepareStatement(sql);
     ResultSet rst = pstmt.executeQuery()) {
    // 查詢邏輯
} catch (SQLException e) {
    throw new RuntimeException("資料庫查詢失敗", e); // 拋出運行時異常讓 Servlet 捕獲
}

除錯技巧

  • 在 JSP 加入 <% System.out.println("product=" + request.getAttribute("product")); %> 確認屬性是否存在。
  • 檢查 Tomcat 控制台完整堆疊,定位行號。
  • 使用 JSTL <c:out> 替代 jsp:getProperty,更靈活且支援 EL 運算式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved