Apostila Caelum fj21 - Erro forEach JSTL

Bom dia Pessoal,

Estou fazendo os exercícios da apostila fj21, exatamente o exercício 7.7 onde eles pedem que se crie um forEach para listar os objetos(“Contatos armazenados no BD”) no JSP utilizando as TAG’s do JSTL.

Segue abaixo o código do meu JSP:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@page import="br.com.agenda.DAO.*, br.com.modelo.*"%> <%@page import="java.util.List"%> <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> <html> <body> <!-- cria a lista--> <jsp:useBean id="dao" class="br.com.agenda.DAO.ContatoDAO" /> <table> <!-- for --> <c:forEach var="contato" items="${dao.lista}"> <tr> <td>${contato.nome}</td> <td>${contato.email}</td> <td>${contato.endereco}</td> <td>${contato.telRes}</td> <td>${contato.telCel}</td> <td>${contato.dtNascimento}</td> </tr> </c:forEach> </table> </body> </html>

Abaixo o Código da minha classe DAO:

[code]package br.com.agenda.DAO;

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.conexao.ConDBSQL;
import br.com.modelo.Contato;

public class ContatoDAO{

private static final long serialVersionUID = 1L;
private Connection connection;

public ContatoDAO() {
	this.connection = new ConDBSQL().getConnection();
}

/**
 * @author Sergio
 * metodo insere contato
 * @param contato
 */
public void adiciona(Contato contato){
	
	String sql = "insert into tb_contatos (nome,email,endereco,telRes,telCel,dtNasc) values (?,?,?,?,?,?)";
		
	try{
		//prepared statement para inserir dados
		PreparedStatement stmt = connection.prepareStatement(sql);
		
		//seta os valores
		stmt.setString(1,contato.getNome());
		stmt.setString(2,contato.getEmail());
		stmt.setString(3,contato.getEndereco());
		stmt.setString(4,contato.getTelRes());
		stmt.setString(5,contato.getTelCel());
		stmt.setString(6,contato.getDtNascimento());
		
		stmt.execute();
		stmt.close();
		
	}catch(SQLException e){
		throw new RuntimeException(e);
	}
}

/**
 * @author Sergio
 * metodo que lista os contatos armazenados no banco
 * @return
*/
public List<Contato> getLista(){
	
	try{
		List<Contato> listContatos = new ArrayList<Contato>();
		PreparedStatement stmt = this.connection.prepareStatement("select * from tb_contatos");
		ResultSet rs = stmt.executeQuery();
		
		
		while(rs.next()){
			//cria objeto contato
			Contato objContato = new Contato();
			
			objContato.setNome(rs.getString("nome"));
			objContato.setEmail(rs.getString("email"));
			objContato.setEndereco(rs.getString("endereco"));
			objContato.setTelRes(rs.getString("telRes"));
			objContato.setTelCel(rs.getString("telCel"));
			objContato.setDtNascimento(rs.getString("dtNasc"));
			
			listContatos.add(objContato);
		}
		rs.close();
		stmt.close();
		
		return listContatos;
		
	}catch(SQLException e){
		throw new RuntimeException(e);	
	}
}

}
[/code]

[size=18][color=darkblue]Agora o erro que aparece no browser:[/color][/size]

[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: /lista-contatos-elegante.jsp(13,1) According to TLD or attribute directive in tag file, attribute items does not accept any expressions
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)
org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:952)
org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:706)
org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1442)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2166)
org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2216)
org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2222)
org.apache.jasper.compiler.Node$Root.accept(Node.java:457)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2166)
org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1481)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:188)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:317)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:298)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:302)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.28 logs.


Apache Tomcat/5.5.28[/code]

E por fim o erro que aparece no console do eclipse:

03/09/2010 08:47:38 org.apache.catalina.core.AprLifecycleListener lifecycleEvent INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Arquivos de programas\Java\jre6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Arquivos de programas/Java/jre6/bin/client;C:/Arquivos de programas/Java/jre6/bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;%JAVA_HOME%\bin;C:\Arquivos de programas\Microsoft SQL Server\80\Tools\BINN;;C:\ARQUIV~1\E!98 03/09/2010 08:47:38 org.apache.coyote.http11.Http11BaseProtocol init INFO: Initializing Coyote HTTP/1.1 on http-8080 03/09/2010 08:47:38 org.apache.catalina.startup.Catalina load INFO: Initialization processed in 281 ms 03/09/2010 08:47:38 org.apache.catalina.core.StandardService start INFO: Starting service Catalina 03/09/2010 08:47:38 org.apache.catalina.core.StandardEngine start INFO: Starting Servlet Engine: Apache Tomcat/5.5.28 03/09/2010 08:47:38 org.apache.catalina.core.StandardHost start INFO: XML validation disabled 03/09/2010 08:47:38 org.apache.coyote.http11.Http11BaseProtocol start INFO: Starting Coyote HTTP/1.1 on http-8080 03/09/2010 08:47:38 org.apache.jk.common.ChannelSocket init INFO: JK: ajp13 listening on /0.0.0.0:8009 03/09/2010 08:47:38 org.apache.jk.server.JkMain start INFO: Jk running ID=0 time=0/16 config=null 03/09/2010 08:47:39 org.apache.catalina.storeconfig.StoreLoader load INFO: Find registry server-registry.xml at classpath resource 03/09/2010 08:47:39 org.apache.catalina.startup.Catalina start INFO: Server startup in 359 ms 03/09/2010 08:48:29 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: /lista-contatos-elegante.jsp(13,1) According to TLD or attribute directive in tag file, attribute items does not accept any expressions at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40) at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407) at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148) at org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:952) at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:706) at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1442) at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2166) at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2216) at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2222) at org.apache.jasper.compiler.Node$Root.accept(Node.java:457) at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2166) at org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1481) at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:188) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:317) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:298) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286) at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:302) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Unknown Source)

A declaração da Taglib está errada. Faltou um “jsp” no meio.

O correto é:

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

[]´s

Coloquei o import acima e contina dando erro…

Subi meu servidor em modo debug, fui indo passo a passo, ele entra na minha classe dao, monta o list, com os select’s do BD e retorna um list no final do meu método, porém o JSP não consegue entender e mostrar na tela.