Meu bean não retorna dados

9 respostas
nunesfns

Pessoal.
Sou iniciante em java. Já li diversos materiais sobre orientação a objetos e conceitos básicos da linguagem. Estou tentando desenvolver, de início, uma simples página que me liste todos os dados de uma determinada tabela que eu já possuo criada no postgresql.
Criei o modelo, o bean, a classe de conexão e um simples jsp que deveria listar as localidades que existem em minha tabela. Procurei no google e também aqui nos fóruns do guj algo que me ajudasse, mas não consegui êxito em sanar o meu problema. O fato é que, quando executo, a página jsp aparece somente com os títulos da h:datatable, mas sem os dados da minha tabela, a qual já está populada.
Estou utilizando o eclipse indigo, tomcat 7.0 e jsf 2.0.
Para falar bem a verdade, não sei nem como debugar o código no eclipse para verificar se é de fato o bean que não está retornando meus dados (bem coisa de iniciante mesmo).
Qualquer ajuda é bem vinda. Passo, logo abaixo, os códigos das classes a que me referi e aproveito para agradecer desde já a todos.

O modelo:

package br.com.copel.ldi.modelo;

public class Localidade {
	
	private long cod_localidade;
	private String sigla_localidade;
	private String municipio;
	private String localidade;
	private String ag;
	private String dsm;
	
	
	
    public Localidade(){
    }
	
	public long getCod_localidade() {
		return cod_localidade;
	}
	public void setCod_localidade(long cod_localidade) {
		this.cod_localidade = cod_localidade;
	}
	public String getSigla_localidade() {
		return sigla_localidade;
	}
	public void setSigla_localidade(String sigla_localidade) {
		this.sigla_localidade = sigla_localidade;
	}
	public String getMunicipio() {
		return municipio;
	}
	public void setMunicipio(String municipio) {
		this.municipio = municipio;
	}
	public String getLocalidade() {
		return localidade;
	}
	public void setLocalidade(String localidade) {
		this.localidade = localidade;
	}
	public String getAg() {
		return ag;
	}
	public void setAg(String ag) {
		this.ag = ag;
	}
	public String getDsm() {
		return dsm;
	}
	public void setDsm(String dsm) {
		this.dsm = dsm;
	}
	
	
	
	
	
	

}

A conexão:

package br.com.copel.ldi.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {
	public Connection getConnection() {
		System.out.println("Conectando ao banco");
		try {
			return DriverManager.getConnection(
					"jdbc:postgresql://localhost:5432/LDI", "postgres",
					"postgres");

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}

}

O bean:

package br.com.copel.ldi.bean;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.copel.ldi.jdbc.ConnectionFactory;
import br.com.copel.ldi.modelo.Localidade;


public class LocalidadeBean {
	private Connection connection;


	public LocalidadeBean() {
		this.connection = new ConnectionFactory().getConnection();

	}

	public List<Localidade> getLista(){
		try { List<Localidade> localidades = new ArrayList<Localidade>();		
		PreparedStatement stmt = connection.prepareStatement("select * from tbllocalidade");
		ResultSet rs = stmt.executeQuery();
		while (rs.next()) {
			Localidade localidade = new Localidade();			
			localidade.setCod_localidade(rs.getLong("cod_localidade"));
			localidade.setSigla_localidade(rs.getString("sigla_localidade"));
			localidade.setMunicipio(rs.getString("municipio"));
			localidade.setLocalidade(rs.getString("localidade"));
			localidade.setAg(rs.getString("ag"));
			localidade.setDsm(rs.getString("dsm"));

			localidades.add(localidade);	


		}
		rs.close();
		stmt.close();
		return localidades;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}




}

A view (jsp)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!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=ISO-8859-1">
<title>Listagem de localidades</title>
</head>
<body>
	<f:view>
		<h:dataTable var="obj" value="#{localidadeBean.Lista}" border="1">
			<h:column>
				<f:facet name="header">
					<h:outputText value="Código"></h:outputText>
				</f:facet>
				<h:outputText value="#{obj.Cod_localidade}" />

			</h:column>


			<h:column>
				<f:facet name="header">
					<h:outputText value="Sigla"></h:outputText>
				</f:facet>
				<h:outputText value="#{obj.Sigla_localidade}" />

			</h:column>

			<h:column>
				<f:facet name="header">
					<h:outputText value="Município"></h:outputText>
				</f:facet>
				<h:outputText value="#{obj.Municipio}" />

			</h:column>

			<h:column>
				<f:facet name="header">
					<h:outputText value="Localidade"></h:outputText>
				</f:facet>
				<h:outputText value="#{obj.Localidade}" />

			</h:column>

			<h:column>
				<f:facet name="header">
					<h:outputText value="Agência"></h:outputText>
				</f:facet>
				<h:outputText value="#{obj.Ag}" />

			</h:column>

			<h:column>
				<f:facet name="header">
					<h:outputText value="DSM"></h:outputText>
				</f:facet>
				<h:outputText value="#{obj.Dsm}" />

			</h:column>
		</h:dataTable>
	</f:view>
</body>
</html>

9 Respostas

luiz_renato

Tente trocar o nome da lista que alimenta seu dataTable :

nunesfns

Luiz Renato. Muito obrigado por sua resposta.
Na verdade, eu já havia tentado isto que você me indicou. O meu problema persiste. Tentei iniciar um novo projeto também, mas não tive sucesso em resolver o problema. Não consigo achar em que eu posso estar errando.

luiz_renato

nunesfns,

É interessante vc ter certesa que o método do DAO está retornando dados, usando uma classe comum de testes pra imprimir os dados retornado .
Daí vc criar uma pagina de teste p/ imprimir algo vindo deste DAO e por aí vai, vc tem q certificar que as classes do seu sistema estão funcionando isoladamente e depois em conjunto…

De início isso está errado:

porque no seu bean vc declarou o atributo assim:

entao deveria ser assim:

Verifique em todos os value’s dos ouputText vc está colocando os atributos de obj iniciando com maiúsculo sendo que os mesmos estão em declarados em minúsculo no seu bean, dê uma olhada em http://ricardospinoza.wordpress.com/2011/04/13/regras-para-nomeacao-de-propriedades-javabeans/ .

Uma dica tbm é vc ter nomes dos atributos diferentes das colunas do banco, p. ex em private long cod_localidade vc usaria private long codigoLocalidade ou private long codLocalidade pois na classe vc tem atributos/caracteristicas que representam o domínio do problema q vc quer resolver e normalmente não é obrigatoriamente a coluna do seu banco de dados…

A

Seu bean está mapeado?

nunesfns

Oi, Alex. Meu bean está mapeado, mas fiz isto no faces-config. Deixei o escopo como “session”.
Segue abaixo o source do faces-config. Tentei utilizar annotations em vez do faces-config, mas deu erro, então resolvi fazer desta maneira:

<?xml version="1.0" encoding="UTF-8"?>

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
	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"
	version="2.0">
	<managed-bean>
		<managed-bean-name>LocalidadeBean</managed-bean-name>
		<managed-bean-class>br.com.copel.ldi.bean.LocalidadeBean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>

</faces-config>

Luiz_Renato:

Tentei debugar e pus o breakpoint tanto na classe bean quanto no modelo. Dei o comando no teclado para debugar no eclipse e entrei com a opção de “debugar no servidor”, mas ele retorna a página em branco ainda e não para nos breakpoints. Achei estranho.
Esta minha tentativa de debugar é justamente para verificar se o meu bean está retornando os dados do banco ou não, conforme sua orientação anterior, mas tá difícil. Fiz algumas alterações nos nomes dos atributos também, da maneira como você indicou.
Ainda não estou conseguindo mostrar os dados na tela.

luiz_renato

Colocando o acesso a banco de dados no managedBean vai ficar muito dificil...

Faz o seguinte: cria uma classe só pra manipular dados do banco (DAO Data Acess Object pesquisa esse padrão ) e use-a p/ testar e pegar os dados no bean.
public class LocalidadeDAO {

	public LocalidadeDAO() {
		this.connection = new ConnectionFactory().getConnection();
	}

	public List&lt;Localidade&gt; listaLocalidades(){
		try { List&lt;Localidade&gt; localidades = new ArrayList&lt;Localidade&gt;();		
		PreparedStatement stmt = connection.prepareStatement("select * from tbllocalidade");
		ResultSet rs = stmt.executeQuery();
		while (rs.next()) {
			Localidade localidade = new Localidade();			
			localidade.setCod_localidade(rs.getLong("cod_localidade"));
			localidade.setSigla_localidade(rs.getString("sigla_localidade"));
			localidade.setMunicipio(rs.getString("municipio"));
			localidade.setLocalidade(rs.getString("localidade"));
			localidade.setAg(rs.getString("ag"));
			localidade.setDsm(rs.getString("dsm"));

			localidades.add(localidade);	


		}
		rs.close();
		stmt.close();
		return localidades;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}
}
Lá no seu bean vc chama esse objeto:
public List&lt;Localidade&gt; getLista(){
	LocalidadeDAO dao = new LocalidadeDAO();
	return dao.listaLocalidades();
}
e pra testá-la cria outra:
public class TesteConexao {
	
	public static void main(String[]args) {
		List&lt;Localidade&gt; lista = new LocalidadeDAO().listaLocalidades();
		if (lista!=null && lista.size()!=0) {
		     System.out.println("Foram encontradas " + lista.size() + " localidades ");
		} else {
                     System.out.println("Não foram encontradas localidades");
		}
	}...

A partir daí vc vai saber se os dados estão vindo...
Depois cria uma pagina de teste com um commandButton e uma cria uma action no bean que imprime algo caso a sua lista está válida aí vc sabe que o bean está ok , tenta seguir essa linha de eliminação até chegar no erro. Se vc tivesse usando TDD ficaria mais fácil mas aí são outros 500...

nunesfns

Luiz_Renato.

Fiz conforme você orientou e consegui debugar. A classe de teste está conseguindo acessar de fato os dados no banco. Creio que o problema seja no meu bean mesmo. Eu já havia lido alguns materiais que esclareciam acerca do uso de uma classe DAO. Não utilizei por pura inexperiência mesmo. Achei que a forma como vinha fazendo estava correta. Compreendo os conceitos da programação java, mas eles ainda não estão bem fixados na minha prática. Não sei se você me entende. Acho que é questão de tempo mesmo.
O fato é que fiquei um pouco mais feliz agora, pois ao menos consegui ver os dados do banco sendo listados no eclipse. Entretanto, preciso descobrir o porquê que minha view não apresenta os dados. Você teria alguma ideia?
Mais uma vez, agradeço imensamente a sua ajuda e atenção.

nunesfns

Luiz_Renato.

Consegui resolver o problema. Apaguei o managed bean no faces-config e recriei-o em seguida. Quando fiz isso, o eclipse passou a trazer mensagens de erro quando tentava carregar a página orientando-me que não encontrava correspondentes de alguns atributos. Eu havia esquecido de alterar de maiúscula para minúscula a primeira letra de alguns campos da tabela no jsp. Fiz as alterações necessárias e ele retornou a listagem das localidades normalmente na minha view. Interessante é que eu já havia recriado o managed bean várias vezes para ver se funcionava, mas não tinha dado certo. Basta adicionar “[Resolvido]” no fim do assunto para encerrar o tópico?
Não sei nem como agradecer a sua ajuda.
Deus te abençoe!

luiz_renato

Amém.

Sobre o DAO tem muito material na net, vai aplicando os conhecimentos , pesquisa tbm sobre MVC e com o tempo fica natural. Com o tempo chega um ponto que vc domina e começa inclusive a questionar o próprio padrão javabean,DAO e outras coisas …

Com projetos que envolvem várias fases (todos eu acho ) tipo ler os dados de algum lugar,processar , retornar dados processados e renderizar , eu sempre tento garantir que cada fase cumpre o seu papel e passo p/ posterior; no teu caso vc consulta o banco então tem q saber antes se a consulta retorna dados; dai vc tem q exibir, então tem q garantir que a ação é executada e a sua view é exibida sem dados ainda, depois vc coloca os dados na view e executa; se os dados fossem lidos de um arquivo, tem que saber se a leitura está ok e retornando os dados lidos no formato certo, se fossem lidos de um webservice, tem q saber se está conectando e assim vai. Por isso é essencial separar as classes conforme suas responsabilidades. E quando encontrar um problema vai eliminado as possibilidades e se todas forem eliminadas volta tudo de novo, vejo muita gente no forúm desesperado com problema mas não tem um linha de resolução.

Pode acreditar que com os problemas aprendemos muito!!

Um abraço!

Criado 24 de julho de 2012
Ultima resposta 26 de jul. de 2012
Respostas 9
Participantes 3