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
Guike
Agosto 31, 2012, 8:30am
#2
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()%>
<%
}
%>
Guike
Agosto 31, 2012, 11:22am
#4
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?
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
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>
Guike
Agosto 31, 2012, 2:41pm
#6
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);
}
Guike
Setembro 4, 2012, 6:50am
#8
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<Contato> listaContatos = new ArrayList<Contato>();
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