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

SpringMVC 中 JdbcTemplate 查詢結果在 JSP 頁面無法顯示的解決方案

     編輯:程式設計疑難解答

問題背景

在使用 SpringMVC、JdbcTemplate 和 RowMapper 開發用戶查詢功能時,Service 層通過斷點調試確認已成功獲取到用戶數據(包含用戶名和密碼),但在 JSP 頁面使用 JSTL 標簽遍歷顯示時,卻只輸出了對象的內存地址(如 com.frame.model.User@123456),無法正常渲染具體屬性值。

代碼排查

JSP 頁面 (users.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用戶列表</title>
</head>
<body>
<table>
<c:if test="${not empty userlist}">
<c:forEach var="s" items="${userlist}" varStatus="status">
<thead>
<tr><td>用戶姓名</td><td>用戶密碼</td></tr>
</thead>
<tbody>
<tr><td>${s.user_name}</td><td>${s.user_pwd}</td></tr>
</tbody>
</c:forEach>
</c:if>
</table>
</body>
</html>

控制器 (HelloController.java)

@RequestMapping("/howareyou.do")
public String getUserbyUserId(Model model, HttpServletRequest req) {
    Long userid = (long) Integer.parseInt(req.getParameter("user_id"));
    List<User> users = userService.findAllByUserId(userid);
    model.addAttribute("userlist", users);
    return "users";
}

Service 實現類 (UserServiceImplement.java)

@Override
public List<User> findAllByUserId(Long user_id) {
    String sql = "select * from user where user_id = ?";
    Object[] params = new Object[] {user_id};
    BeanPropertyRowMapper<User> UserRowMapper = new BeanPropertyRowMapper<User>(User.class);
    List<User> users = null;
    
    // 方式一:使用 BeanPropertyRowMapper
    users = jdbcTemplate.query(sql, params, UserRowMapper);
    
    // 方式二:使用匿名內部類 RowMapper
    users = jdbcTemplate.query(sql, params, new RowMapper<User>() {
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setUser_name(rs.getString(3));
            user.setUser_pwd(rs.getString(2));
            System.out.println("user_name is " + user.getUser_name());
            System.out.println("user_pwd is " + user.getUser_pwd());
            System.out.println("user_id is " + user.getUser_id());
            return user;
        }
    });
    
    return (users != null && users.size() > 0) ? users : null;
}

問題分析與解決

經過仔細排查,發現代碼邏輯本身沒有錯誤,Service 層確實能正確查詢並封裝數據。問題的根本原因在於 JSP 頁面缺少 JSTL 核心標簽庫的引入聲明。

在 JSP 頁面頂部必須添加以下指令:

<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>

核心原因解析

  • 若未引入 JSTL 標簽庫,JSP 引擎無法識別 <c:if>、<c:forEach> 等標簽
  • 這些標簽會被當作普通文本輸出,導致 EL 表達式 ${s.user_name} 也無法正確解析
  • 最終頁面直接輸出 User 對象的 toString() 默認實現(類名@哈希碼)

最佳實踐建議

  1. 必須引入 JSTL:在使用 JSTL 標簽的 JSP 頁面頂部添加 taglib 指令
  2. 確保依賴存在:項目中需包含 jstl.jar 和 standard.jar(或通過 Maven 引入 javax.servlet:jstl)
  3. 屬性命名規範:User 實體類的屬性名(user_name、user_pwd)需與數據庫列名一致,或在 SQL 中使用別名映射
  4. 優化 RowMapper:推薦使用 BeanPropertyRowMapper 自動映射,減少手動設置屬性的樣板代碼

修正後的 JSP 完整示例

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用戶列表</title>
</head>
<body>
<table border="1">
<c:if test="${not empty userlist}">
    <thead>
    <tr><th>用戶姓名</th><th>用戶密碼</th></tr>
    </thead>
    <tbody>
    <c:forEach var="user" items="${userlist}">
        <tr>
            <td>${user.user_name}</td>
            <td>${user.user_pwd}</td>
        </tr>
    </c:forEach>
    </tbody>
</c:if>
</table>
</body>
</html>

添加上述 taglib 指令後,重新部署項目即可正常顯示用戶數據。這是一個典型的「代碼邏輯正確但配置缺失」導致的前端渲染異常案例。

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