You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:20:55