JSP/Servlet页面无法显示MySQL数据库数据问题排查
我仔细看了你的代码和问题描述,虽然SQL在Workbench能正常返回数据,但代码里有好几处关键逻辑错误导致表格显示不出数据,咱们一个个来修复:
1. Servlet层(AdminPanel.java)的致命问题
你的Servlet逻辑完全走不通,根本没法把数据传递给JSP:
- 直接使用未初始化的
rs对象:你在Servlet里写的while(rs.next())中的rs根本没有关联到数据库查询结果,这个循环不会执行哪怕一次。 - 错误调用
UserDAO.adminPanel(user):这个方法的设计根本不是用来获取用户列表的,你传入空的UserBean也拿不到任何数据。 - 没有转发请求到JSP:就算你把数据放到request属性里,不转发到JSP页面,前端也接收不到
memberList。 - 字段名不匹配:数据库里的列是
tipo,但你用rs.getInt("type")会抛出SQL异常,导致数据封装失败。
修复后的AdminPanel.java示例:
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 调用DAO获取所有用户列表 ArrayList<UserBean> memberList = UserDAO.getAllUsers(); // 将列表存入request属性(要在数据准备完成后再设置) request.setAttribute("memberList", memberList); // 转发到JSP页面,让前端能拿到数据 RequestDispatcher dispatcher = request.getRequestDispatcher("/AdminPanel.jsp"); dispatcher.forward(request, response); }
2. DAO层(UserDAO.java)的逻辑重构
原来的adminPanel方法是针对单个用户的验证逻辑,完全不符合获取所有用户的需求,需要重写为专门的列表查询方法:
修复后的UserDAO.java新增getAllUsers方法(可以替换原有的adminPanel):
public static ArrayList<UserBean> getAllUsers() { ArrayList<UserBean> userList = new ArrayList<>(); Connection currentCon = null; Statement stmt = null; ResultSet rs = null; String searchQuery = "select firstname, lastname, username, tipo from idusuario"; try { Class.forName("com.mysql.jdbc.Driver"); currentCon = DriverManager.getConnection("jdbc:mysql://localhost:3306/usuarios", "root", "admin"); stmt = currentCon.createStatement(); rs = stmt.executeQuery(searchQuery); // 遍历结果集,封装每个用户到列表 while (rs.next()) { UserBean user = new UserBean(); user.setFirstName(rs.getString("firstname")); user.setLastName(rs.getString("lastname")); user.setUserName(rs.getString("username")); // 注意数据库列名是tipo,对应UserBean的type属性 user.setType(rs.getInt("tipo")); userList.add(user); } } catch (ClassNotFoundException ex) { System.out.println("Error al cargar el driver: " + ex.getMessage()); } catch (SQLException ex) { System.out.println("Error en la consulta de base de datos: " + ex.getMessage()); } finally { // 必须关闭数据库资源,防止泄漏 try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (currentCon != null) currentCon.close(); } catch (SQLException ex) { ex.printStackTrace(); } } return userList; }
3. JSP页面(AdminPanel.jsp)的两个关键修复
你的JSP存在标签未生效、HTML结构错误的问题:
- 必须引入JSTL标签库:
c:forEach和c:out属于JSTL核心标签,不引入的话浏览器会把它们当作普通文本,根本不会执行循环。 - HTML结构错误:你把
c:forEach嵌套在一个<tr>标签内部,导致生成的表格结构混乱,应该直接用循环生成每一行<tr>。
修复后的AdminPanel.jsp示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!-- 引入JSTL核心标签库,这是使用c:forEach的前提 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <form action="AdminPanel" method="get"> <table style="width:100%"> <caption>Usuarios Registrados</caption> <tr> <th>Nombre</th> <th>Apellido</th> <th>Usuario</th> <th>Estado</th> <th>Habilitar</th> </tr> <!-- 直接用c:forEach循环生成每一行,不要嵌套在<tr>里 --> <c:forEach var="row" items="${memberList}"> <tr> <td><c:out value="${row.firstname}"/></td> <td><c:out value="${row.lastname}"/></td> <td><c:out value="${row.username}"/></td> <td><c:out value="${row.type}"/></td> <!-- 编辑按钮指向Servlet,传递用户标识以便后续修改逻辑 --> <td><a href="AdminPanel?action=edit&username=${row.username}">Habilitar usuario</a></td> </tr> </c:forEach> </table> </form>
额外注意事项
- 确保项目中添加了JSTL依赖:如果是Maven项目,需要引入jstl和standard的依赖包,否则JSP标签会报错。
- 检查UserBean的getter/setter:比如
firstname对应的getter应该是getFirstName()(驼峰命名),EL表达式会自动匹配这个方法。 - 查看控制台日志:如果还是有问题,去Tomcat控制台看是否有SQL异常或空指针异常,这些是排查问题的关键。
内容的提问来源于stack exchange,提问作者Gastón Saillán
相关产品推荐
相关产品推荐

