在使用 SpringMVC、JdbcTemplate 和 RowMapper 開發用戶查詢功能時,Service 層通過斷點調試確認已成功獲取到用戶數據(包含用戶名和密碼),但在 JSP 頁面使用 JSTL 標簽遍歷顯示時,卻只輸出了對象的內存地址(如 com.frame.model.User@123456),無法正常渲染具體屬性值。
<%@ 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>
@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";
}
@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" %>
<c:if>、<c:forEach> 等標簽${s.user_name} 也無法正確解析toString() 默認實現(類名@哈希碼)jstl.jar 和 standard.jar(或通過 Maven 引入 javax.servlet:jstl)BeanPropertyRowMapper 自動映射,減少手動設置屬性的樣板代碼<%@ 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 指令後,重新部署項目即可正常顯示用戶數據。這是一個典型的「代碼邏輯正確但配置缺失」導致的前端渲染異常案例。