JSTL e Hibernate (JSP) [RESOLVIDO]

2 respostas
kaahxd

Primeiramente me apresentando, meu nome é Carlos porém sou conhecido por Kaah ou Kaahxd :D
Sou nome aqui no fórum, pesquisei antes de abrir o tópico porém não obtive resultados satisfatórios e espero que alguém possa me ajudar. Bem vamos lá então:

Estava aprendendo a usar o hibernate e até então tudo tranquilo, foi quando resolvi testar seu funcionamento na web. Então descobri que com o uso de scriptlets que não é o adequado, logo pensei, se funciona com scriptlets funcionará com a JSTL e EL .. Bem não foi bem isso que aconteceu. Creio que o erro seja pela necessidade do DAO receber em seu construtor o EntityManager instanciando uma JPAUtil().getEntituManager();, porém não sei como resolver. Vou postar o código da aplicação teste para vocês poderem me auxiliar.

ContaDAO

package br.com.dao;

import java.util.List;

import javax.persistence.EntityManager;

import br.com.modelo.Conta;

public class ContaDAO {
	private final DAO<Conta> dao;

	public ContaDAO(EntityManager em) {
		dao = new DAO<Conta>(em, Conta.class);
	}

	public void adicona(Conta t) {
		dao.adiciona(t);
	}

	public void remove(Conta t) {
		dao.remove(t);
	}

	public Conta busca(Integer id) {
		return dao.busca(id);
	}

	public List<Conta> lista() {
		return dao.lista();
	}
}

JPAUtil

package br.com.infra;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JPAUtil {
	private static EntityManagerFactory entityManagerFactory = Persistence
			.createEntityManagerFactory("controlefinancas");

	public EntityManager getEntityManager() {
		return entityManagerFactory.createEntityManager();
	}
}
ListaElegante.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<jsp:useBean id="dao" class="br.com.dao.ContaDAO" />
	<table>
		<c:forEach var="conta" items="${dao.lista}">
			<tr>
				<td>${conta.titular}</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>
E por fim o meu não tão querido erro.
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: /listaElegante.jsp(11,1) The value for the useBean class attribute br.com.dao.ContaDAO 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:1221)
	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:3474)
	org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:249)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:372)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:352)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:339)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:594)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:344)
	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)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.12 logs.

Espero que possam me ajudar. Até mais!

2 Respostas

drsmachado

Benvindo ao Guj.
Bom, primeiro, você está errando ao usar o conceito de javaBean, pois, o único construtor da tua classe ContaDAO necessita de argumento.
Um javaBean exige que, caso haja um construtor com argumento, você precisa declarar outro sem nenhum argumento, o que acabaria por gerar algo assim

public ContaDAO(){}
public ContaDAO(EntityManager em) {  
        dao = new DAO<Conta>(em, Conta.class);  
    }

Aí você pergunta: "Ok, mas como eu faço para ter uma instância de JPAUtil?
Simples, trasforme o método e os atributos de JPAUtil em static e pronto.

public class JPAUtil {  
    private static EntityManagerFactory entityManagerFactory = Persistence  
            .createEntityManagerFactory("controlefinancas");  
  
    public static EntityManager getEntityManager() {  
        return entityManagerFactory.createEntityManager();  
    }  
}

E no construtor sem argumentos

public ContaDAO(){
 dao = new DAO
(JPAUtil.getEntityManager(), Conta.class);
}
kaahxd

drsmachado Muito obrigado! Funcionou perfeitamente aqui.

Criado 27 de agosto de 2012
Ultima resposta 27 de ago. de 2012
Respostas 2
Participantes 2