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

使用Hibernate+MySQL时JSP页面无法显示数据的问题求助

问题描述

我正在为MySQL Workbench中的数据库开发前端接口,目前可以成功添加客户数据(数据能在MySQL Workbench中正常显示),但无法在JSP页面中查看任何表的数据,请帮忙排查遗漏的配置或代码问题。

相关代码

pojo.Clienti

package pojo;

import java.util.HashSet;
import java.util.Set;

public class Clienti implements java.io.Serializable {

    private Integer idclient;
    private String nume_institutie_firma;
    private String cod_unic;
    private String adresa;
    private Set angajats = new HashSet(0);

    public Clienti() {
    }

    public Clienti(String nume_institutie_firma, String cod_unic, String adresa, Set angajats) {
        this.nume_institutie_firma = nume_institutie_firma;
        this.cod_unic = cod_unic;
        this.adresa = adresa;
        this.angajats = angajats;
    }

    public Integer getIdclient() {
        return this.idclient;
    }

    public void setIdclient(Integer idclient) {
        this.idclient = idclient;
    }
    public String getnume_institutie_firma() {
        return this.nume_institutie_firma;
    }

    public void setnume_institutie_firma(String nume_institutie_firma) {
        this.nume_institutie_firma = nume_institutie_firma;
    }
    public String getcod_unic() {
        return this.cod_unic;
    }

    public void setcod_unic(String cod_unic) {
        this.cod_unic = cod_unic;
    }
    public String getAdresa() {
        return this.adresa;
    }

    public void setAdresa(String adresa) {
        this.adresa = adresa;
    }
    public Set getAngajats() {
        return this.angajats;
    }

    public void setAngajats(Set angajats) {
        this.angajats = angajats;
    }
}

pojo.Clienti.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="pojo.Clienti" table="clienti" catalog="tema"
        optimistic-lock="version">
        <id name="idclient" type="java.lang.Integer">
            <column name="idclient" />
            <generator class="identity" />
        </id>
        <property name="nume_institutie_firma" type="string">
            <column name="nume_institutie_firma" length="45" />
        </property>
        <property name="cod_unic" type="string">
            <column name="cod_unic" length="45" />
        </property>
        <property name="adresa" type="string">
            <column name="adresa" length="45" />
        </property>
        <set name="angajats" table="angajati" inverse="true"
            lazy="true" fetch="select">
            <key>
                <column name="idclient" />
            </key>
            <one-to-many class="pojo.Angajati" />
        </set>
    </class>
</hibernate-mapping>

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
      <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/tema</property>
    <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">pass</property>
    <mapping resource="pojo/Angajati.hbm.xml"/>
    <mapping resource="pojo/Clienti.hbm.xml"/>
    <mapping resource="pojo/Proiecte.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

hibernate.reveng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">
<hibernate-reverse-engineering>
  <schema-selection match-catalog="tema"/>
  <table-filter match-name="proiecte"/>
  <table-filter match-name="clienti"/>
  <table-filter match-name="angajati"/>
</hibernate-reverse-engineering>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>ClientiController</servlet-name>
        <servlet-class>Controller.ClientiController</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>ProiecteController</servlet-name>
        <servlet-class>Controller.ProiecteController</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>AngajatiController</servlet-name>
        <servlet-class>Controller.AngajatiController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ClientiController</servlet-name>
        <url-pattern>/ClientiController</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ProiecteController</servlet-name>
        <url-pattern>/ProiecteController</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>AngajatiController</servlet-name>
        <url-pattern>/AngajatiController</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

DAO.ClientiDao

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, use Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import java.util.List;
import pojo.Clienti;

/**
 *
 * @author vali
 */
public interface ClientiDao {
    public void adaugaClienti (Clienti client);
    public List<Clienti> afiseazaClienti();
    public void modificaClienti (int idclient, String nume_institutie_firma, String cod_unic, String adresa);
    public void stergeClient (Clienti client);
}

DAOImpl.ClientiDaoImpl

/*
 * To change this license header, use License Headers in Project Properties.
 * To change this template file, use Tools | Templates
 * and open the template in the editor.
 */
package DAOImpl;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pojo.Clienti;
import DAO.ClientiDao;

/**
 *
 * @author vali
 */
public class ClientiDaoImpl implements ClientiDao{

    public void adaugaClienti(Clienti client) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.save(client);
        transaction.commit();
        session.close();
    }

    public List<Clienti> afiseazaClienti() {
        List<Clienti> listaClienti = new ArrayList();
        Session session = HibernateUtil.getSessionFactory().openSession();
        org.hibernate.Query query = session.createQuery("From Clienti");
        listaClienti = query.list();
        return listaClienti;
    }

    public void modificaClienti(int idclient, String nume_institutie_firma, String cod_unic, String adresa) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        Clienti detaliiclienti = (Clienti) session.load(Clienti.class, idclient);
        detaliiclienti.setnume_institutie_firma(nume_institutie_firma);
        detaliiclienti.setcod_unic(cod_unic);
        detaliiclienti.setAdresa(adresa);
        session.update(detaliiclienti);
        transaction.commit();
        session.close();
    }

    public void stergeClient(Clienti client) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.delete(client);
        transaction.commit();
        session.close();
    }
}

Controller.ClientiController

package Controller;

import DAO.ClientiDao;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import pojo.Clienti;
import DAOImpl.ClientiDaoImpl;

/**
 *
 * @author vali
 */
public class ClientiController extends HttpServlet {

    Clienti client = new Clienti();
    ClientiDaoImpl clientDaoImpl = new ClientiDaoImpl();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        if (request.getParameter("adaugaClient") != null) {
            String nume_institutie_firma = request.getParameter("nume_institutie_firma");
            String cod_unic = request.getParameter("cod_unic");
            String adresa = request.getParameter("adresa");
            client.setnume_institutie_firma(nume_institutie_firma);
            client.setcod_unic(cod_unic);
            client.setAdresa(adresa);
            clientDaoImpl.adaugaClienti(client);
            RequestDispatcher rd = request.getRequestDispatcher("adauga_Client.jsp");
            rd.forward(request, response);
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        if (request.getParameter("afiseazaClienti") != null) {
            List<Clienti> listaClienti = new ArrayList();
            listaClienti = clientDaoImpl.afiseazaClienti();
            request.setAttribute("listaClienti", listaClienti);
            RequestDispatcher rd = request.getRequestDispatcher("tabela_Clienti.jsp");
            rd.forward(request, response);
        }

        if (request.getParameter("modificaClient") != null) {
            int id1 = Integer.parseInt(request.getParameter("idclient"));
            String nume_institutie_firma = request.getParameter("nume_institutie_firma");
            String cod_unic = request.getParameter("cod_unic");
            String adresa = request.getParameter("adresa");
            clientDaoImpl.modificaClienti(id1, nume_institutie_firma, cod_unic, adresa);
            RequestDispatcher rd = request.getRequestDispatcher("adauga_Client.jsp");
            rd.forward(request, response);

        }

        if (request.getParameter("stergeClient") != null) {
            int id2 = Integer.parseInt(request.getParameter("idclient"));
            client.setIdclient(id2);
            clientDaoImpl.stergeClient(client);
            RequestDispatcher rd = request.getRequestDispatcher("adauga_Client.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

问题排查与修复

1. 请求方法不匹配(最直接原因)

你把查询客户列表的逻辑放在了doPost方法中,但通常查看数据的操作是通过GET请求触发的(比如页面上的查看按钮是GET链接,或者表单用了method="GET")。此时请求会进入doGet方法,完全不会执行查询逻辑,自然无法把数据传到JSP。

修复:将查询逻辑移至doGet方法,或者在doGet中调用doPost:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    if (request.getParameter("adaugaClient") != null) {
        // 原添加逻辑...
    } else if (request.getParameter("afiseazaClienti") != null) {
        List<Clienti> listaClienti = clientDaoImpl.afiseazaClienti();
        request.setAttribute("listaClienti", listaClienti);
        RequestDispatcher rd = request.getRequestDispatcher("tabela_Clienti.jsp");
        rd.forward(request, response);
    }
}

2. Hibernate Session未关闭

afiseazaClienti方法中打开了Session但未关闭,会导致Session资源泄漏,可能引发后续查询异常:

修复:用try-finally确保Session关闭:

public List<Clienti> afiseazaClienti() {
    List<Clienti> listaClienti = new ArrayList<>();
    Session session = null;
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        org.hibernate.Query query = session.createQuery("From Clienti");
        listaClienti = query.list();
    } finally {
        if (session != null && session.isOpen()) {
            session.close();
        }
    }
    return listaClienti;
}

3. Servlet实例变量的线程安全隐患

你把Clienti client定义为Servlet的实例变量,而Servlet是单实例多线程的,多个请求会共享这个对象,可能导致数据混乱(比如添加时的属性覆盖)。虽然这不是当前无法显示数据的直接原因,但必须修复:

修复:将client改为方法内的局部变量:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    if (request.getParameter("adaugaClient") != null) {
        Clienti client = new Clienti(); // 局部变量,每个请求独立
        String nume_institutie_firma = request.getParameter("nume_institutie_firma");
        String cod_unic = request.getParameter("cod_unic");
        String adresa = request.getParameter("adresa");
        client.setnume_institutie_firma(nume_institutie_firma);
        client.setcod_unic(cod_unic);
        client.setAdresa(adresa);
        clientDaoImpl.adaugaClienti(client);
        RequestDispatcher rd = request.getRequestDispatcher("adauga_Client.jsp");
        rd.forward(request, response);
    }
}

4. JSP页面渲染逻辑检查(需自行验证)

如果以上修复后仍无法显示数据,检查tabela_Clienti.jsp的代码:

  • 确保引入JSTL核心标签库:
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
  • 确保正确遍历listaClienti:
    <table border="1">
        <tr>
            <th>ID</th>
            <th>机构名称</th>
            <th>统一编码</th>
            <th>地址</th>
        </tr>
        <c:forEach items="${listaClienti}" var="client">
            <tr>
                <td>${client.idclient}</td>
                <td>${client.nume_institutie_firma}</td>
                <td>${client.cod_unic}</td>
                <td>${client.adresa}</td>
            </tr>
        </c:forEach>
    </table>
    
  • 确保EL表达式生效:Servlet 3.1默认开启EL,若为旧版本,需在web.xml中添加:
    <jsp-config>
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:40:18