Hibernate nao gera tabela em jsp

20 respostas
aajjbb

estou começando com hibernate, entao, aqui vai o meu DAO, e exceção gerada e meu jsp

package com.dao;

import java.sql.Connection;
import java.util.List;

import org.hibernate.Session;

import com.jdbc.ConnectionFactory;
import com.model.Pessoa;

public class PessoaDAO {
	private Session session;
	@SuppressWarnings("unused")
	private Connection connection;

	public PessoaDAO(Session session) {
		this.session = session;
		this.connection = new ConnectionFactory().getConnetion();
	}
	
	public void adiciona(Pessoa p){
		this.session.save(p);
	}
	
	public void exclui(Pessoa p){
		this.session.delete(p);
	}
	
	public void atualiza(Pessoa p){
		this.session.update(p);
	}
	
	@SuppressWarnings("unchecked")
	public List<Pessoa> getLista() {
		return this.session.createCriteria(Pessoa.class).list();
	}

}

Exceçao

org.apache.jasper.JasperException: /lista-pessoa.jsp(12,0) The value for the useBean class attribute com.dao.PessoaDAO is invalid.

org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)

org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)

org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)

org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1226)

org.apache.jasper.compiler.Node$UseBean.accept(Node.java:1182)

org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)

org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2428)

org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2434)

org.apache.jasper.compiler.Node$Root.accept(Node.java:475)

org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)

org.apache.jasper.compiler.Generator.generate(Generator.java:3475)

org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:249)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:365)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:345)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:332)

org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:594)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:341)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:332)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

/exceção/

e o jsp

<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>

<title>Lista de Contatos</title>

<link rel=“stylesheet” type=“text/css” href=“css/phone.css”>

</head>

<body>

<jsp:useBean id=“dao” class=“com.dao.PessoaDAO”></jsp:useBean>

<table border=“1”>

<tr>

<th>Nome:</th>

<th>Telefone:</th>

</tr>

<c:forEach var=“pessoa” items="${dao.lista}">

<tr>

<td>${<a href="http://pessoa.name">pessoa.name</a>}</td>

<td>${pessoa.telefone}</td>

</tr>

</c:forEach>

</table>

Voltar ao Menu Principal
</body>
</html>

20 Respostas

paulo1911

Olá aajjbb,
Vc está acessando o dao direto na View?

O ideal é que vc tenha uma action para esse get no Dao.

Se não me engano tente mudar o trecho para:

&lt;c:forEach var="pessoa" items="${dao.['lista']}"&gt;
&lt;tr&gt;
&lt;td&gt;${pessoa['name']}&lt;/td&gt;
&lt;td&gt;${pessoa['telefone']}&lt;/td&gt;
&lt;/tr&gt;
&lt;/c:forEach&gt;

Verifique sua classe dao tem o nome do método get da mesma forma que o definido vc EL ex.: getNome() e getTelefone(), pois a EL vai chamar esses métodos.

Espero ter ajudado…

Fallow

aajjbb

pela stacktrace, acho que o erro esta nessa linha de codigo, mas ainda nao sei qual.

<jsp:useBean id=“dao” class=“com.dao.PessoaDAO”></jsp:useBean>

visola

Eu acho que o problema está no seu construtor.
Pelo que diz aqui a tag useBean espera um Java Bean.
E como sabemos, Java Beans precisam ter um construtor default (sem argumentos).

Provavelmente por isso ele não está conseguindo instanciar seu DAO. Como ele não tem um construtor default, é um valor inválido.

aajjbb

vou tentar isso…

aajjbb

agora a stacktrace é outra… criei um construtor default no meu dao. e agora a stacktrace aponta para meu jsp

<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>
<title>Lista de Contatos</title>
<link rel=“stylesheet” type=“text/css” href=“css/phone.css”>
</head>

<body>

<jsp:useBean id=“dao” class=“com.dao.PessoaDAO”></jsp:useBean>

<table border=“1”>

<tr>

<th>Nome:</th>

<th>Telefone:</th>

</tr>

<c:forEach var=“pessoa” items="${dao.lista}">

<tr>

<td>${<a href="http://pessoa.name">pessoa.name</a>}</td>

<td>${pessoa.telefone}</td>

</tr>

</c:forEach>

</table>

Voltar ao Menu Principal
</body>
</html>

13/01/2011 10:16:49 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [jsp] in context with path [/PhonesHibernate] threw exception [An exception occurred processing JSP page /lista-pessoa.jsp at line 20

17: <th>Nome:</th>

18: <th>Telefone:</th>

19: </tr>

20: <c:forEach var=“Pessoa” items="${dao.lista}">

21: <tr>

22: <td>${<a href="http://pessoa.name">pessoa.name</a>}</td>

23: <td>${pessoa.telefone}</td>
Stacktrace:] with root cause

java.lang.NullPointerException

at com.dao.PessoaDAO.getLista(PessoaDAO.java:38)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)

at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)

at org.apache.el.parser.AstValue.getValue(AstValue.java:169)

at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)

at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:106)

at org.apache.jsp.lista_002dpessoa_jsp._jspx_meth_c_005fforEach_005f0(lista_002dpessoa_jsp.java:113)

at org.apache.jsp.lista_002dpessoa_jsp._jspService(lista_002dpessoa_jsp.java:82)

at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)

at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)

at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:332)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:237)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:662)
paulo1911

Olá amigo,

É melhor vc colocar uma Action e um controlador entre sua view e seu dao pra vc nao ter problemas depois de escalabilidade e manutenção…

Mas com relação ao erro sua lista está retornando nula…ou seja o hibernate nao está achando nada na sua base e sua lista está nula e vc tb nao está tratando as exception de forma correta…por isso que as exception estão explodindo na view…

Crie uma classe de teste maisn e chame seu dao e chame seu método getLista pra ver se retorna algo…

FAllow

aajjbb

eu ja tenho os controladores… criei umas servlets, uma para adicionar, outra para remover, e outra para atualizar. nao sei se essa é a forma correta. e como eu criaria uma action?

aajjbb

alterei meu forEach, nao recebo mais a exception. mas agora minha list retorna vazia, e no meu teste em um metodo main, ela retorna os contatos normalmente.

<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>

<title>Lista de Contatos</title>

<link rel=“stylesheet” type=“text/css” href=“css/phone.css”>

</head>

<body>

<jsp:useBean id=“dao” class=“com.dao.PessoaDAO”></jsp:useBean>

<table border=“1”>

<tr>

<th>Nome:</th>

<th>Telefone:</th>

</tr>

<c:forEach var=“pessoa” items="${dao.lista}">

<tr>

<td>${<a href="http://pessoa.name">pessoa.name</a>}</td>

<td>${pessoa.telefone}</td>

</tr>

</c:forEach>

</table>

Voltar ao Menu Principal
</body>
</html>

visola

O que o paulo1911 quer dizer é que você precisa colocar a chamada para o seu DAO num servlet e adicionar a lista recebida no request como em:

// Dentro do doPost ou doGet
List&lt;Pessoa&gt; pessoas = dao.getLista();
request.setAttribute("pessoas", pessoas);
// Redireciona para o JSP aqui, usando um RequestDispatcher por exemplo

A sua exception está ocorrendo porque agora, no seu DAO, ninguém está inicializando sua session. Como ela é nula, não pode chamar nenhum método nela, por isso a exceção.

Você precisa inicializar a sua session. Isso poderia ser feito no método init do seu Servlet.

aajjbb

estranho, nunca criei uma servlet para listagem. isso ta certo?

visola

Sim, por que não? Normalmente se cria servlets/actions para qualquer acesso a camada de dados/serviço, qualquer acesso, salvar, carregar, apagar, listar, etc.
Os dados acessados de dentro da JSP, normalmente vêm do request ou da sessão.

Não é uma boa prática acessar a camada de dados/serviço de dentro do JSP.

aajjbb

fiz um esboço mais ou menos assim, mas ainda ta confuso pra mim

package com.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.Session;

import com.dao.PessoaDAO;
import com.hibernate.HibernateUtil;
import com.model.Pessoa;

public class ListaServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Session session = new HibernateUtil().getSession();
		Pessoa pessoa = new Pessoa();
		PessoaDAO dao = new PessoaDAO(session);
		
		session.beginTransaction();
		List&lt;Pessoa&gt; pessoas = dao.getLista();
		request.setAttribute("pessoa", pessoa);
		session.getTransaction().commit();
		session.close();
		
		RequestDispatcher rd = request.getRequestDispatcher("/lista-pessoa.jsp");
		rd.forward(request, response);
		
		
		
	}
}
visola

A criação e controle da transação deveria ser transparente para o Servlet.
Talvez fosse melhor colocar isso dentro do DAO (quando necessário).
Mas pelo que entendi, você está passando para o JSP uma pessoa vazia. Acredito que não seja isso que você quer.
Talvez fosse melhor fazer o seguinte:

public void doPost(....) throws ... {
        PessoaDAO dao = new PessoaDAO(new HibernateUtil().getSession());
        // No load você não precisa de uma transação
        request.setAttribute("pessoas", dao.getLista());
        RequestDispatcher rd = request.getRequestDispatcher("/lista-pessoa.jsp");  
        rd.forward(request, response);
    }

E dentro do seu JSP, mudar para o seguinte código:

&lt;c:forEach var="pessoa" items="${pessoas}"&gt;
    &lt;tr&gt;
        &lt;td&gt;${pessoa.name}&lt;/td&gt;
        &lt;td&gt;${pessoa.telefone}&lt;/td&gt;
    &lt;/tr&gt;
&lt;/c:forEach&gt;
aajjbb

conclui as mudanças. mas mesmo assim. minha lista continua voltando vaiza. segue o codigo do controller, e do jsp.

package com.controller;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dao.PessoaDAO;
import com.hibernate.HibernateUtil;

public class ListaServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PessoaDAO dao = new PessoaDAO(new HibernateUtil().getSession());
		
		request.setAttribute("pessoas", dao.getLista());
	
		RequestDispatcher rd = request.getRequestDispatcher("/lista-pessoa.jsp");
		rd.forward(request, response);
			
	}
}
package com.dao;

import java.sql.Connection;
import java.util.List;

import org.hibernate.Session;

import com.jdbc.ConnectionFactory;
import com.model.Pessoa;

public class PessoaDAO {
	private Session session;
	@SuppressWarnings("unused")
	private Connection connection;

	public PessoaDAO(Session session) {
		this.session = session;
		this.connection = new ConnectionFactory().getConnetion();
	}
	public PessoaDAO() {
		
	}
	
	public void adiciona(Pessoa p){
		this.session.save(p);
	}
	
	public void exclui(Pessoa p){
		this.session.delete(p);
	}
	
	public void atualiza(Pessoa p){
		this.session.update(p);
	}
	
	@SuppressWarnings("unchecked")
	public List&lt;Pessoa&gt; getLista() {
		return this.session.createCriteria(Pessoa.class).list();
	}

}

<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>
<title>Lista de Contatos</title>
<link rel=“stylesheet” type=“text/css” href=“css/phone.css”>
</head>

<body>

<jsp:useBean id=“dao” class=“com.dao.PessoaDAO”></jsp:useBean>

<table border=“1”>

<tr>

<th>Nome:</th>

<th>Telefone:</th>

</tr>

<c:forEach var=“pessoa” items="${pessoas}">

<tr>

<td>${<a href="http://pessoa.name">pessoa.name</a>}</td>

<td>${pessoa.telefone}</td>

</tr>

</c:forEach>

</table>

Voltar ao Menu Principal
</body>
</html>

visola

Só para ter certeza. Tem dados no seu banco né? Nessa tabela especificamente?

Se sim, não deu nenhuma exceção?

Tenta pegar o SQL que o hibernate está gerando adicionando isso na configuração do hibernate:

&lt;property name="hibernate.show.sql" value="true"&gt;&lt;/property&gt;

Aí executa ele no banco para ver se está retornando alguma coisa.

aajjbb

sim. tenho dados no banco… ja tinha essa linha no meu hibernate.cfg. "<property name=“show_sql”>true</property>

mas tambem adicionei a que você postou acima. quando eu chamo a pagina da listagem. ele ja da essa exceção. e nao mosta nenhum codigo sql

org.apache.jasper.JasperException: /lista-pessoa.jsp(14,0) The value for the useBean class attribute com.dao.PessoaDAO is invalid.

org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:41)

org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)

org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)

org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1226)

org.apache.jasper.compiler.Node$UseBean.accept(Node.java:1182)

org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)

org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2428)

org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2434)

org.apache.jasper.compiler.Node$Root.accept(Node.java:475)

org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)

org.apache.jasper.compiler.Generator.generate(Generator.java:3480)

org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:249)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:365)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:345)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:332)

org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:594)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:342)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)l
visola

Você não precisa mais da tag useBean criando o seu DAO na sua JSP.

Se já tinha, não precisa adicionar a linha que falei.
Vocẽ consegue ver o SQL que o Hibernate gera no console ou no log da sua aplicação?
Tentou executá-lo no bando de dados?

aajjbb

sim, agora ja retirei o taga “useBean”…
sim. quando eu insiro um contato. o sql aparece no meu console. já quando executo a listagem. nao aparece nada. e a lista retorna vazia.

aajjbb

nao sei o por que da minha lista estar retornando vazia, sendo que o banco esta populado… nao vejo erro no meu foreach. veja o jsp corrigido

<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>
<title>Lista de Contatos</title>
<link rel=“stylesheet” type=“text/css” href=“css/phone.css”>
</head>

<body>

<table border=“1”>

<tr>

<th>Nome:</th>

<th>Telefone:</th>

</tr>

<c:forEach var=“pessoa” items="${pessoas}">

<tr>

<td>${<a href="http://pessoa.name">pessoa.name</a>}</td>

<td>${pessoa.telefone}</td>

</tr>

</c:forEach>

</table>

Voltar ao Menu Principal
</body>
</html>

aajjbb

ainda nao consegui resolver esse problema tambem… se alguem pudesse me ajudar.

Criado 12 de janeiro de 2011
Ultima resposta 21 de jan. de 2011
Respostas 20
Participantes 3