使用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>
相关产品推荐
相关产品推荐

