Exercicio da fj21-caelum - lista-contatos-scriptlet.jsp

Bom dia senhores, estou com dificuldades nessa parte da apostila da caelum, onde é necessário criar uma JSP para listar os contatos que estão armazenados no banco. Segui os passos da apostila mas estou recebendo um erro (HTTP-500) que não consegui identificar:

Segue a mensagem do console informando a Exception, onde me diz que a JSP requer que um nome do atributo seja precedido por espaço, mas não entendi esse erro:

Grave: Servlet.service() for servlet [jsp] in context with path [/fj21-agenda] threw exception [/lista-contatos-scriptlet.jsp (line: 1, column: 94) The JSP specification requires that an attribute name is preceded by whitespace] with root cause
org.apache.jasper.JasperException: /lista-contatos-scriptlet.jsp (line: 1, column: 94) The JSP specification requires that an attribute name is preceded by whitespace

Posta sua classe que contenha o scriplet, para podermos analisar melhor

Esta é a classe que contem o scriplet. Esse exemplo esta na apostila!!!

<%@ page import=“java.util., br.com.caelum.modelo., br.com.caelum.dao.*” %>

Lista de contatos <% ContatoDao dao = new ContatoDao(); List contatos = dao.getLista(); for (Contato contato : contatos) { %> <% } %>
<%=contato.getNome()%> <%=contato.getEmail()%> <%=contato.getEndereco()%> <%=contato.getDataNascimento().getTime()%>

Quando for postar seus códigos poste-os dentro das tag code [ code] [/ code] assim fica mais fácil a visualização do código.

Não seis se você esqueceu de colocar aqui ou se apagou sem querer mas, seu código possui essa linha?

&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%&gt;

ela é a primeira linha do arquivo jsp, verifique se você não apagou sem querer porque o resto do código está certo

Eu não enviei com essa linha de código mas tem sim!!

Obrigado pela dica.


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<%@ page import="java.util.*, br.com.caelum.modelo.*, br.com.caelum.dao.*" %>
<!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>Lista de contatos</title>

</head>
<body>
	<table>
		<%
			ContatoDao dao = new ContatoDao();
			List<Contato> contatos = dao.getLista();
			for (Contato contato : contatos) {
		%>
		<tr>
			<td><%=contato.getNome()%></td>
			<td><%=contato.getEmail()%></td>
			<td><%=contato.getEndereco()%></td>
			<td><%=contato.getDataNascimento().getTime()%></td>
		</tr>
		<%
			}
		%>
	</table>

</body>
</html>

bom seus pacotes estão importados certo? sua classe dao você escreveu realmente ContatoDao mesmo e não “ContatoDAO” rejeveja tudo certo pois eu recompilei sua classe aqui a unica diferença, coisa que alterei foi de ContatoDao para ContatoDAO que foi o jeito que escrevi minha classe, e aqui compilou e exibiu meus contatos, sua jsp está dentro de WebContent? caso qualquer coisa apaga esse arquivo jsp e reecreva outro.

Fiz o que você me aconselhou, só que agora o erro mudou. Estou recebendo um erro referente a data - [color=red] Unparseable date: “2012-02-28”[/color]

Os códigos para tratar a data:

ContatoDao com o metodo getLista:


	public List<Contato> getLista() {

		try {

			PreparedStatement stmt = this.conn
					.prepareStatement("select * from contatos");
			ResultSet rs = stmt.executeQuery();

			List<Contato> contatos = new ArrayList<Contato>();

			while (rs.next()) {
				// criando o objeto contato
				Contato contato = new Contato();
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));
				contato.setDataFormatada(rs.getString("dataNascimento"));

				contatos.add(contato);
			}

			rs.close();
			stmt.close();

			return contatos;

		} catch (Exception e) {
			throw new DaoException(e);
		}

	}

E o meu DTO com setDataFormatada e getDataFormatada:

	public String getDataFormatada(){
		SimpleDateFormat formatado = new SimpleDateFormat("dd/MM/yyyy");
		String dataFormat = formatado.format(dataNascimento);
		return dataFormat;
	}
	public Date getDataNascimento() {
		return this.dataNascimento;
	}
	public Date setDataFormatada(String dataNascimento){
		try {
			SimpleDateFormat formatado = new SimpleDateFormat("dd/MM/yyyy");
			Date dataFormat = formatado.parse(dataNascimento);
			return dataFormat;
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	public void setDataNascimento(String dataNascimento) {
		this.dataNascimento = setDataFormatada(dataNascimento);
	}

Cara desculpa a demora mas eu fiquei sem pc no final de semana.

quando você declarou sua dataNascimento na classe contato com qual tipo?? String? Calendar?

Olhe sua classe Contato e declare Data Nascimento como Calendar, e faça os getter e setters como tal também

[code]
private Calendar dataNascimento;

public Calendar getDataNascimento() {
return dataNascimento;
}

public void setDataNascimento(Calendar dataNascimento) {
this.dataNascimento = dataNascimento;
}[/code]

Na no seu Dao faça da seguinte maneira

[code]public List<Contato> getLista(){

	try{
		
		List&lt;Contato&gt; listaContatos = new ArrayList&lt;Contato&gt;();
		
		PreparedStatement stmt =  con.prepareStatement("select * from contatos");
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next()){
			Contato contato = new Contato();
			
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));

			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("dataNascimento"));
			contato.setDataNascimento(data);
			
			listaContatos.add(contato);				
		}
		
		rs.close();
		stmt.close();
		return listaContatos;
	}catch(SQLException e){
		throw new RuntimeException(e);
	}
	
}[/code]

Eu fiz dessa forma minha data e funcionou qualqer coisa posta novamente