Erro em Página JSP Utilizando JSTL ( RESOLVIDO )

Fala ai galera!!
Tava desenvolvendo uma Página Web JSP aqui juntamente com JSTL, mas deu um erro aqui, e não conseguir encontrar a solução… Irei postar minha página JSP com JSTL e o erro que está ocorrendo

Obrigado!!

PÁGINA JSP

[code]<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“ISO-8859-1”%>

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

<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=ISO-8859-1”>
<title>Primeira Página JSP Utilizando JSTL</title>
</head>
<body>

     &lt;!-- cria o DAO --&gt;
     &lt;jsp:useBean id="dao" class="br.com.caelum.agenda.dao.ContatoDAO"/&gt;
    
    &lt;table&gt;
        &lt;!-- percorre contatos montando as linhas da tabela --&gt;
        &lt;c:forEach var="contato" items="${dao.lista}"&gt;
            &lt;tr&gt;
               &lt;td&gt;${contato.nome}&lt;/td&gt;
               &lt;td&gt;${contato.email}&lt;/td&gt;
               &lt;td&gt;${contato.endereco}&lt;/td&gt;

            &lt;/tr&gt;
        &lt;/c:forEach&gt;
    &lt;/table&gt;           

</body>
</html>[/code]
PÁGINA DE ERRO

[code]HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /lista-contatos-elegante.jsp at line 19

16:
17: <table>
18: <!-- percorre contatos montando as linhas da tabela -->
19: <c:forEach var=“contato” items="${dao.lista}">
20: <tr>
21: <td>${contato.nome}</td>
22: <td>${contato.email}</td>

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

root cause

org.apache.jasper.el.JspPropertyNotFoundException: /lista-contatos-elegante.jsp(19,12) ‘${dao.lista}’ Property ‘lista’ not found on type br.com.caelum.agenda.dao.ContatoDAO
org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:104)
org.apache.jsp.lista_002dcontatos_002delegante_jsp._jspx_meth_c_005fforEach_005f0(lista_002dcontatos_002delegante_jsp.java:114)
org.apache.jsp.lista_002dcontatos_002delegante_jsp._jspService(lista_002dcontatos_002delegante_jsp.java:84)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.
Apache Tomcat/6.0.16[/code]

1 curtida

Você criou o método lista em ContatoDAO?

Sim, Criei o método lista em ContatoDAO…

De uma olhada na minha classe…

package br.com.caelum.agenda.dao;

import java.sql.*;
import java.util.*;
import br.com.caelum.agenda.modelo.Contato;
import br.com.caelum.jdbc.Conexao;

public class ContatoDAO {
	
	public void adiciona(Contato contato) throws SQLException
	{
		Connection conn = Conexao.getConexao();
		String sql = "INSERT INTO contatos(nome,email,endereco) VALUES (?,?,?)";
		PreparedStatement stmt = conn.prepareStatement(sql);
		stmt.setString(1,contato.getNome());
		stmt.setString(2,contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		
		stmt.execute();
		stmt.close();
	}
	
	public List&lt;Contato&gt; lista() throws SQLException
	{
		Connection conn = Conexao.getConexao();
		String sql = "SELECT * FROM contatos";
		PreparedStatement stmt = conn.prepareStatement(sql);
		ResultSet rs = stmt.executeQuery();
		
		List&lt;Contato&gt; lista = new ArrayList&lt;Contato&gt;();
		
		while(rs.next())
		{
			Contato cont = new Contato();
			cont.setIdcontato(rs.getInt("idcontato"));
			cont.setNome(rs.getString("nome"));
			cont.setEmail(rs.getString("email"));
			cont.setEndereco(rs.getString("endereco"));
			
			lista.add(cont);
		}
		rs.close();
		stmt.close();
		return lista;
	}

}

Cara, esse ta terrível, ja fiz altas paradas e não encontrei esse Erro…
O mais sinistro é que eu to estudando JSP e JSTL agora, e me deparo com esse erro terrível desse!!!

Boa noite,

Modifica

dao.lista

e

lista

para

dao.getLista

e

getLista

[]'s

[quote=getAdicted]Boa noite,

Modifica

dao.lista

e

lista

para

dao.getLista

e

getLista

[]'s

[/quote]

Continua dando o mesmo erro, por que você sugeriu trocar “nomes”, infelizmente não mudou nada!!
Obrigado!

Aparentemente ta Ok.
Vc debugou para ver se o método lista() está sendo chamado e se está trazendo os registros?

[quote=romarcio]Aparentemente ta Ok.
Vc debugou para ver se o método lista() está sendo chamado e se está trazendo os registros?[/quote]
Não, como faz esse processo

Faz o seguinte,

Deixa o DAO com o método getLista e na JSP:

&lt;c:forEach var="contato" items="${dao.lista}"&gt;

[]'s

[quote=romarcio]Aparentemente ta Ok.
Vc debugou para ver se o método lista() está sendo chamado e se está trazendo os registros?[/quote]
Acabei de realizar um teste simples aqui com o método lista, e ele retornou os dados no console do Java…

[quote=getAdicted]Faz o seguinte,

Deixa o DAO com o método getLista e na JSP:

&lt;c:forEach var="contato" items="${dao.lista}"&gt;

[]'s[/quote]

Uai, eu fiz isso e deu certo…
Mas qual a explicação para isso…

Por que o método lista do DAO foi alterado o nome para getLista, e na JSTL no arquivo JSP o certo sería colocar depois do “dao” o mesmo nome do metodo, agora eu pergunto, por que coloquei um nome diferente dentro do “dao” do JSP e deu certo…
como na classe ContatoDAO existe o método getLista(), pela lógica que estou lendo aqui na apostila da Caelum, onde ele explica sobre JSTL, dentro da página JSP onde eu coloco dao dentro da expression Lenguage sería assim dao.getLista, esse sería o certo, mas por que eu coloquei um nome diferente dentro da expression Lenguage do dao e deu certo???

Usa scriptlets e veja se retorna na pagina:

&lt;jsp:useBean id="dao" class="br.com.caelum.dao.ContatoDAO"/&gt;
&lt;%
    List&lt;Contato&gt; contatos = dao.lista();
    for (Contato contato : contatos ) {
%&gt;
      &lt;%=contato.getNome()%&gt;, &lt;%=contato.getEmail()%&gt;, &lt;%=contato.getEndereco()%&gt;
&lt;%
    }
%&gt;

[quote=romarcio]Usa scriptlets e veja se retorna na pagina:

&lt;jsp:useBean id="dao" class="br.com.caelum.dao.ContatoDAO"/&gt;
&lt;%
    List&lt;Contato&gt; contatos = dao.lista();
    for (Contato contato : contatos ) {
%&gt;
      &lt;%=contato.getNome()%&gt;, &lt;%=contato.getEmail()%&gt;, &lt;%=contato.getEndereco()%&gt;
&lt;%
    }
%&gt;

[/quote]

A Solução que nosso amigo ai acima sugeriu deu certo, eu só quero entender por que dentro da Expression Lenguage “dao” eu tirei o get, e só coloquei lista e deu certo,
Dentro da classe ContatoDAO eu troquei o nome do método para getLista(), pela lógica dentro a Expression Lenguage “dao” eu tería que colocar ${dao.getLista}, mas ao inves disso eu tirei o “get” e coloquei somente o “lista”, e deu certo, a dúvida agora é, por que deu certo sendo que o nome dentro do Expression Lenguage “dao” está diferente do nome do método

[quote=Anderson S.][quote=romarcio]Usa scriptlets e veja se retorna na pagina:

&lt;jsp:useBean id="dao" class="br.com.caelum.dao.ContatoDAO"/&gt;
&lt;%
    List&lt;Contato&gt; contatos = dao.lista();
    for (Contato contato : contatos ) {
%&gt;
      &lt;%=contato.getNome()%&gt;, &lt;%=contato.getEmail()%&gt;, &lt;%=contato.getEndereco()%&gt;
&lt;%
    }
%&gt;

[/quote]

A Solução que nosso amigo ai acima sugeriu deu certo, eu só quero entender por que dentro da Expression Lenguage “dao” eu tirei o get, e só coloquei lista e deu certo,
Dentro da classe ContatoDAO eu troquei o nome do método para getLista(), pela lógica dentro a Expression Lenguage “dao” eu tería que colocar ${dao.getLista}, mas ao inves disso eu tirei o “get” e coloquei somente o “lista”, e deu certo, a dúvida agora é, por que deu certo sendo que o nome dentro do Expression Lenguage “dao” está diferente do nome do método[/quote]

Eu acho interessante procurarmos direto na fonte (documentação), mas tem um cheiro aqui:

[]'s

Realmente, faltava o get.

O que acontece é que o JSTL vai no bean sempre em busca de um método get.
Veja que você tem o método getLista() e chama ele sem usar o get, só como lista (para simplificar não se usa o get no código JSTL).
Para as variareis acontece a mesma coisa, você tem na classe contato os métodos getNome(), getEmail() e getEndereco(), mas quando chama no JSTL faz apenas .nome, .email e .endereco.
Se você for na classe contato e excluir os métodos getNome(), getEmail() e getEndereco(), o JSTL não vai encontralos quando fizer .nome, .email e .endereco. E isso acontece também com o método getLista().

Se não estou enganado o JSTL usa o padrão da sun para EJB, por isso sempre quando voce usa o <c:forEach items="{lista}"> ele vai buscar no bean o comando getLista();

[quote=romarcio]Realmente, faltava o get.

O que acontece é que o JSTL vai no bean sempre em busca de um método get.
Veja que você tem o método getLista() e chama ele sem usar o get, só como lista (para simplificar não se usa o get no código JSTL).
Para as variareis acontece a mesma coisa, você tem na classe contato os métodos getNome(), getEmail() e getEndereco(), mas quando chama no JSTL faz apenas .nome, .email e .endereco.
Se você for na classe contato e excluir os métodos getNome(), getEmail() e getEndereco(), o JSTL não vai encontralos quando fizer .nome, .email e .endereco. E isso acontece também com o método getLista().

Se não estou enganado o JSTL usa o padrão da sun para EJB, por isso sempre quando voce usa o <c:forEach items="{lista}"> ele vai buscar no bean o comando getLista(); [/quote]

Perfeito! :thumbup:

Encerra seus tópicos com a tag [RESOLVIDO] caso a sua dúvida tenha sído sanada… :wink:

[]'s

[quote=romarcio]Realmente, faltava o get.

O que acontece é que o JSTL vai no bean sempre em busca de um método get.
Veja que você tem o método getLista() e chama ele sem usar o get, só como lista (para simplificar não se usa o get no código JSTL).
Para as variareis acontece a mesma coisa, você tem na classe contato os métodos getNome(), getEmail() e getEndereco(), mas quando chama no JSTL faz apenas .nome, .email e .endereco.
Se você for na classe contato e excluir os métodos getNome(), getEmail() e getEndereco(), o JSTL não vai encontralos quando fizer .nome, .email e .endereco. E isso acontece também com o método getLista().

Se não estou enganado o JSTL usa o padrão da sun para EJB, por isso sempre quando voce usa o <c:forEach items="{lista}"> ele vai buscar no bean o comando getLista(); [/quote]

Perfeito!!
Entendi…

Obrigado ai por tudo!!

Pessoal estou com erro nessa página já tentei de varias formas solucionar e não consigo me ajudem por favor?

<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“ISO-8859-1”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

${contato.nome} ${contato.email} ${contato.endereco} ${contato.dataNascimento.time}

Este é o erro que está dando

HTTP Status 500 - An exception occurred processing JSP page /lista-contatos-elegante.jsp at line 9

type Exception report

message An exception occurred processing JSP page /lista-contatos-elegante.jsp at line 9

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /lista-contatos-elegante.jsp at line 9

6:
7:
8:
9: <jsp:useBean id=“dao” class=“br.com.caelum.jdbc.dao.ContatoDao”/>
10:


11:
12: <c:forEach var=“contato” items="${dao.lista}">

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
root cause

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:14)
br.com.caelum.jdbc.dao.ContatoDao.(ContatoDao.java:21)
org.apache.jsp.lista_002dcontatos_002delegante_jsp._jspService(lista_002dcontatos_002delegante_jsp.java:76)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
root cause

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
java.sql.DriverManager.getConnection(Unknown Source)
java.sql.DriverManager.getConnection(Unknown Source)
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:11)
br.com.caelum.jdbc.dao.ContatoDao.(ContatoDao.java:21)
org.apache.jsp.lista_002dcontatos_002delegante_jsp._jspService(lista_002dcontatos_002delegante_jsp.java:76)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.40 logs.

Apache Tomcat/7.0.40