[Resolvido] pegar sql.date e imprimir com taglib

14 respostas
andreacerqueira

não consigo imprimir a data que ta no meu bd de forma alguma, nem erro dá.
tenho um campo tipo date no mysql
na hora de colocar os dados em uma lista na DAO, faço isso:

contato.setDataNascimento(rs.getDate("dataNascimento"));

ou

java.util.Date date = rs.getDate("dataNascimento"); 
contato.setDataNascimento(date);

e no jsp puxo assim:

${contato.dataNascimento}

ou

<fmt:formatDate value="${contato.dataNascimento}" pattern="dd/MM/yyyy" />

o setDataNascimento tá assim

public void setDataNascimento(Date data) {
	this.dataNascimento = data;
}

14 Respostas

Rodrigo_Sasaki

e você recupera o objeto sem problemas com o rs.getDate()?

que valor vem nele ?

andreacerqueira
Exception in thread "main" java.lang.NullPointerException
	at pack.teste.TestaCadLista.main(TestaCadLista.java:24)
linha 24:

System.out.println("Data de Nascimento: " + contato.getDataNascimento() + “\n);

ou

System.out.println("Data de Nascimento: " + contato.getDataNascimento().getTime() + “\n);
Rodrigo_Sasaki

certo hehe…

isso quer dizer que você tem uma referência nula. ou o seu objeto contato ou seu objeto dataNascimento estão nulos.

você precisa instanciá-los de alguma forma.

se quiser pode postar seu código e a gente vê a melhor forma.

andreacerqueira

blz :slight_smile:
eu estou seguindo aquela apostila da caelum.

a classe Contato.java tá assim:

package pack.modelo;

import java.util.*;

public class Contato {
	private Long id;
	private String nome;
	private String email;
	private String endereco;
	private Date dataNascimento;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public Date getDataNascimento() {
		return dataNascimento;
	}
	public void setDataNascimento(Date data) {
		this.dataNascimento = data;
	}

}

esse aqui é o metodo na classe ContatoDAO.java

package pack.modelo;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import pack.jdbc.ConnectionFactory;

public class ContatoDAO {
	// a conexão com o banco de dados
	private Connection connection;
	
	public ContatoDAO() {
		this.connection = new ConnectionFactory().getConnection();
	}
	
	public void adiciona(Contato contato) {
		String sql = "INSERT INTO cadastros (nome, email, endereco, dataNascimento) VALUES (?, ?, ?, ?)";
		try {
			// prepared statement para inserção
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			
			// seta oa valores
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, (Date) contato.getDataNascimento());
			
			// executa
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public List<Contato> getLista() {
		try {
			List<Contato> contatos = new ArrayList<Contato>();
			
			String sql = "SELECT * FROM cadastros ORDER BY id ASC";
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()) {
				// criando o objeto Contato
				Contato contato = new Contato();
				contato.setId(rs.getLong("id"));
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));
				
				// converte o sql.date em util.date antes do setEndereco
				//contato.setDataNascimento(rs.getDate("dataNascimento"));
				java.util.Date date = rs.getDate("dataNascimento"); 
				contato.setDataNascimento(date);
				
				// adicionando o objeto à lista
				contatos.add(contato);
			}
			
			rs.close();
			stmt.close();			
			return contatos;
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public void altera(Contato contato) {
		try {
			String sql = "UPDATE cadastros SET nome=?, email=?, endereco=?, dataNascimento=? WHERE id=?";
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, (Date) contato.getDataNascimento());
			stmt.setLong(5, contato.getId());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public void remove(Contato contato) {
		try {
			String sql = "DELETE FROM cadastros WHERE id=?";
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setLong(1, contato.getId());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

}

O jsp de listagem tá assim:

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

<c:import url="header.jsp" />

	<h1>Lista de Contatos</h1>
	
	<!-- cria lista -->
	<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" />

	<table class="lista">
		<thead>
			<tr>
				<th>Nome</th>
				<th>Email</th>
				<th>Endereço</th>
				<th>Nascimento</th>
			</tr>
		</thead>
		<tbody>
			<!-- for -->
			<c:forEach var="contato" items="${dao.lista}">
				<tr>
					<td>${contato.nome}</td>
					<td>
						<c:if test="${not empty contato.email}">
							<a href="mailto:${contato.email}">${contato.email}</a>
						</c:if>
						<c:if test="${empty contato.email}">
							Email não informado
						</c:if>
					</td>
					<td>${contato.endereco}</td>
					<td>
						${contato.dataNascimento}
						<fmt:formatDate value="${contato.dataNascimento}" pattern="dd/MM/yyyy" />
					</td>
				</tr>
			</c:forEach>
		</tbody>
	</table>
	
	<br clear="all" />
	
<c:import url="footer.jsp" />

meu teste

package pack.teste;

import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.*;

import pack.modelo.Contato;
import pack.modelo.ContatoDAO;

public class TestaCadLista {
	
	public static void main(String[] args) throws SQLException {
		ContatoDAO dao = new ContatoDAO();
		List<Contato> contatos = dao.getLista();
		
		// formata a data como eu quero que apareça
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
		 
		for(Contato contato : contatos) {
			System.out.println("Nome: " + contato.getNome());
			System.out.println("Email: " + contato.getEmail());
			System.out.println("Endereço: " + contato.getEndereco());
			System.out.println("Data de Nascimento: " + contato.getDataNascimento().getTime() + "\n");
			//System.out.println("Data de Nascimento: " + contato.getDataNascimento() + "\n");
		}
	}
}
Rodrigo_Sasaki

no seu teste, experimente debugar o seu for, e ver o que vem no getDataNascimento(), porque acho que ele está vindo nulo…

olhe o seu getLista() também…

andreacerqueira

me ensina a debugar, sou leiga total :slight_smile:

Rodrigo_Sasaki

vixe hehehe…

http://www.vogella.com/articles/EclipseDebugging/article.html

andreacerqueira

vlw :slight_smile:
vou ler e amanhã te respondo.

andreacerqueira

só pra constar, em variables tá constando como null mesmo quando mando debugar.

Rodrigo_Sasaki

o seu getDate não está funcionando na hora de montar o objeto contato… não sei dizer o por que…
você ja tentou usar Calendar? se não me engano a FJ-21 usa hehehe

andreacerqueira

tentei mas estava dando pau na inclusão de contatos dai resolvi usar o date que resolveu o cadastro, mas ferrou a listagem :slight_smile:
enfim, amanha vou ler o que vc me passou direito e vou testar com o calendar tb.
vlw :wink:

Rodrigo_Sasaki

haahha… pra ir convertendo de Date pra Calendar e vice versa pode confundir no começo… mas rapidinho você pega o jeito…

poste os resultados depois

andreacerqueira

Blz, pode deixar :wink:

andreacerqueira

Mudei tudo pra Calendar mesmo não dando erro no código com o Date.
E continua a mesma coisa, dai comecei a pirar e apagar codigo pra ver o que acontecia e nada acontecia, o mesmo erro sempre na linha da data, falei po não é possivel, desativei o xamp, reiniciei o server varias vezes, cheguei a reiniciar o computador e o erro continua igualzinho, mesmo eu tirando a parte do codigo que imprime a data.
Eu não sei o que é, abri o Netbeans e fiz o projeto lá, funcionou perfeitamente.
Alguém já teve esse problema?
Acho que vou reinstalar o eclipse.
:shock:

Criado 11 de abril de 2012
Ultima resposta 12 de abr. de 2012
Respostas 14
Participantes 2