Servlet+Tomcat+MySQL+JSP应用员工列表无法在JSP显示问题
问题:Servlet+JSP+Hibernate Web应用无法展示员工列表
在基于Servlet、Tomcat、MySQL和JSP搭建的Web应用中,Controller的listEmployee方法无法将员工记录展示在JSP页面中。相关代码如下:
Controller方法
private void listEmployee(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException, ServletException { List<Employee> employees = employeeDAO.getAllEmployee(); request.setAttribute("employees", employees); RequestDispatcher dispatcher = request.getRequestDispatcher("Employee.jsp"); dispatcher.forward(request, response); }
DAO方法
public List getAllEmployee() { try { Configuration cfg = new Configuration().configure("hibernate.cfg.xml"); SessionFactory sf = cfg.addAnnotatedClass(Employee.class).buildSessionFactory(); Session session = sf.getCurrentSession(); session.beginTransaction(); Query<Employee> q = session.createQuery("from Employee"); List<Employee> employee = q.getResultList(); System.out.println("Records retrieved : " + employee); } catch (HibernateException e) { System.out.print(e); } return null; }
JSP代码片段
<c:forEach items="${employees.rows}" var="employees"> <tr> <td><c:out value="${employees.empid}"/></td> <td><c:out value="${employees.firstName}"/></td> <td><c:out value="${employees.lastName}" /></td> <td><c:out value="${employees.department}"/></td> </tr> </c:forEach>
同时存在两张相关运行截图,显示页面未加载出员工数据。
问题分析与修复方案
1. DAO方法核心错误:未返回查询结果
DAO的getAllEmployee方法中,虽然成功查询到员工列表并打印,但最后固定返回null,导致Controller拿到的employees为null,JSP自然无法渲染数据。此外还缺少事务提交操作,可能导致会话资源泄漏。
修复后的DAO方法:
public List<Employee> getAllEmployee() { // 指定泛型避免类型转换问题 List<Employee> employees = null; try { Configuration cfg = new Configuration().configure("hibernate.cfg.xml"); SessionFactory sf = cfg.addAnnotatedClass(Employee.class).buildSessionFactory(); Session session = sf.getCurrentSession(); session.beginTransaction(); // 显式指定返回类型,提升代码安全性 Query<Employee> q = session.createQuery("from Employee", Employee.class); employees = q.getResultList(); System.out.println("Records retrieved : " + employees); session.getTransaction().commit(); // 提交事务,确保会话正常关闭 } catch (HibernateException e) { e.printStackTrace(); // 打印完整异常栈,便于排查问题 } return employees; // 返回查询到的列表,而非null }
2. JSP代码错误:遍历路径与变量名冲突
Controller存入request的属性是employees(一个List<Employee>对象),但JSP中错误地尝试遍历${employees.rows}——List并没有rows属性。同时var变量名与属性名重复,容易引发混淆。
修复后的JSP代码:
<c:forEach items="${employees}" var="emp"> <tr> <td><c:out value="${emp.empid}"/></td> <td><c:out value="${emp.firstName}"/></td> <td><c:out value="${emp.lastName}" /></td> <td><c:out value="${emp.department}"/></td> </tr> </c:forEach>
3. 额外注意事项
- 确保JSP页面顶部已引入JSTL核心标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>,否则<c:forEach>标签无法生效。 - Hibernate的
SessionFactory是重量级资源,建议全局初始化一次后复用,不要每次调用DAO都重新创建,避免性能损耗。
内容的提问来源于stack exchange,提问作者user24871119
相关产品推荐
相关产品推荐

