Jsf com hibernate, DataTable

5 respostas
Ocdigital

Bom dia Pessoal !
Estou com o seguinte problema tenho uma DataTable que mostra os dados do meu banco porém só funciona se eu adicionar um commandbutton com a ação de “mostrar dados” como faço para esses dados serem carregados automaticamente ao carregar a página sem ter que apertar esse botão?

Obs. estou ultilizando : JSF, PrimeFaces, Hibernate no server Tomcat e IDE Eclipse

Essa é a DataTable que estou ultilizando
http://www.primefaces.org/showcase/ui/datatableRowSelectionByColumn.jsf

Obrigado!

5 Respostas

fredericomaia10

Se você postar seu código fica mais fácil de ajudar. Mas pra isso não tem segredo, basta no seu managed bean você ter um atributo com sua lista e seus respectivos getters e setters. No próprio get da lista você poderia populá-la com os dados do banco. Como nos exemplos abaixo:

Esse poderia ser seu managed bean:
@ManagedBean
public class ContatoBean {

	private List<Contato> listaContatos;
	
	public List<Contato> getListaContatos() {
		if(listaContatos==null){
			listaContatos= contatoServico.listarTodos();			
		}
		return listaContatos;		
	}

	public void setListaContatos(List<Contato> listaContatos) {
		this.listaContatos= listaContatos;
	}
}
E este o dataTable da sua página xhtml do JSF:
<p:dataTable value="#{contatoBean.listaContatos}" var="contato">
    <p:column>
       <f:facet name="header">
           <h:outputText value="Nome" />
       </f:facet>
       <h:outputText value="#{contato.nome}" />
    </p:column>
   					
    <p:column>
        <f:facet name="header">
            <h:outputText value="Telefone" />
        </f:facet>
        <h:outputText value="#{contato.telefone}" />
    </p:column>
</p:dataTable>
Ocdigital

Olá Frederico. segue os códigos...

Classe Contato
package modelo;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the contato database table.
 * 
 */
@Entity
@Table(name="contato")
public class Contato implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(unique=true, nullable=false)
	private int codigo;

	@Column(length=45)
	private String nome;

	@Column(length=45)
	private String telefone;

    public Contato() {
    }

	public int getCodigo() {
		return this.codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getTelefone() {
		return this.telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

}
ManagedBen
ackage bean;

import java.util.List;


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

import modelo.Contato;

public class ContatoBean {
	
	Contato novoContato = new Contato();
	
	private List<Contato>contatos;
	private Contato ContatoSelecionado; 
	
	public void cadastra(){
		EntityManagerFactory factory =  Persistence.createEntityManagerFactory("Basico");			
	    EntityManager manager = factory.createEntityManager();			
		manager.persist(novoContato);
		System.out.println("Salvando contato...");	
		manager.getTransaction().begin();
		manager.getTransaction().commit();		
		factory.close();
		System.out.println("Contato cadastrado!!!!");
			
	}
    public void consulta(){
    	EntityManagerFactory factory =Persistence.createEntityManagerFactory("Basico");
   		EntityManager manager = factory.createEntityManager();
   		javax.persistence.Query query = manager.createQuery("SELECT e FROM Contato e");
   		contatos = query.getResultList();
   		 		
   		}
	public Contato getNovoContato() {
		return novoContato;
	}
	public void setNovoContato(Contato novoContato) {
		this.novoContato = novoContato;
	}
	public List<Contato> getContatos() {
		return contatos;
	}
	public void setContatos(List<Contato> contatos) {
		this.contatos = contatos;
	}
	public Contato getContatoSelecionado() {
		return ContatoSelecionado;
	}
	public void setContatoSelecionado(Contato contatoSelecionado) {
		ContatoSelecionado = contatoSelecionado;
	}
       	
    }
Faces.config
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
 <managed-bean>
  <managed-bean-name>contatoBean</managed-bean-name>
  <managed-bean-class>bean.ContatoBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
 </managed-bean>
</faces-config>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Basico</display-name>
  <welcome-file-list>
    
    <welcome-file>index.jsf</welcome-file>
  
  </welcome-file-list>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
  <context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>
</web-app>
index.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui" >
      
      <h:head></h:head>
      <h:body>
      <h:form target="#{contatoBean.contatos}">
      <h:panelGrid columns="2">
      <h:outputText value="Nome:"/>
      <h:inputText value="#{contatoBean.novoContato.nome}" />
       <h:outputText value="Telefone:"/>
      <h:inputText value="#{contatoBean.novoContato.telefone}" />
      <h:commandButton action="#{contatoBean.cadastra}" value="Cadastrar" />
      </h:panelGrid>
      </h:form>
      
      
   
<h:form prependId="false">  
  <h:commandButton action="#{contatoBean.consulta}" value="Atualizar" />
  
    <p:dataTable var="c" value="#{contatoBean.contatos}" paginator="true" rows="10">  
  
        <p:column>  
            <f:facet name="header">  
                <h:outputText value="Nome" />  
            </f:facet>  
            <h:outputText value="#{c.nome}" />  
        </p:column>  
  
        <p:column>  
            <f:facet name="header">  
                <h:outputText value="Telefone" />  
            </f:facet>  
            <h:outputText value="#{c.telefone}" />  
        </p:column>  
  
        
  
      
  
         <p:column style="width:32px">  
            <p:commandButton update="display" oncomplete="cDialog.show()"  
                    image="ui-icon ui-icon-search">  
                <f:setPropertyActionListener value="#{c}" target="#{contatoBean.contatoSelecionado}" />  
            </p:commandButton>  
        </p:column>  
  
    </p:dataTable>  
  
    <p:dialog header="Detalhe do Contato" widgetVar="cDialog" resizable="false"  
              width="200" showEffect="explode" hideEffect="explode">  
  
        <h:panelGrid id="display" columns="2" cellpadding="4">  
  
            <f:facet name="header">  
                <p:graphicImage value="/images/cars/#{tableBean.selectedCar.manufacturer}.jpg"/>  
            </f:facet>  
  
            <h:outputText value="Nome:" />  
            <h:outputText value="#{contatoBean.contatoSelecionado.nome}" />  
  
            <h:outputText value="Telefone:" />  
            <h:outputText value="#{contatoBean.contatoSelecionado.telefone}" />  
            
        </h:panelGrid>  
    </p:dialog>  
  
</h:form>  
                     
</h:body>
</html>
fredericomaia10

Ainda acertei o projeto hein, uma agenda de contatos! hehe

Pois é, seria legal você separar essas lógicas, separar a camada de persistência (JPA) da visão (JSF) por exemplo. Mas isso não vem ao caso agora.

De acordo com seu código você poderia alterar o seus métodos getContatos e consulta para algo como:
public List<Contato> consulta(){  
    EntityManagerFactory factory =Persistence.createEntityManagerFactory("Basico");  
    EntityManager manager = factory.createEntityManager();  
    javax.persistence.Query query = manager.createQuery("SELECT e FROM Contato e");  
    return query.getResultList();  
}

public List<Contato> getContatos() {  
    if(contatos==null){
        contatos = consulta();
    }
    return contatos;  
}
Se você está usando Primefaces está usando JSF 2 correto? Portanto não há necessidade do facesconfig.xml. Basta anotar o seu bean com @ManagedBean.
Ocdigital

Perfeito!!! Valeu Funfou que uma beleza !

Ocdigital

Aproveitando o Tópico …

como faço para setar o valor do objeto que desejo deletar do banco a partir de um botão no jsf

public void deleta(){
	    		
		EntityManagerFactory factory =  Persistence.createEntityManagerFactory("Basico");			
	    EntityManager manager = factory.createEntityManager();			
	    Contato contato = manager.find(Contato.class,?);
	    manager.remove(contato);
		System.out.println("deletando contato...");	
		manager.getTransaction().begin();
		manager.getTransaction().commit();		
		factory.close();
		System.out.println("Contato deletado!!!!");

Botão deleta o determinado item …

Obrigado !!!

Criado 25 de agosto de 2011
Ultima resposta 26 de ago. de 2011
Respostas 5
Participantes 2