Problemas ao listar arraylist com jstl[RESOLVIDO]

7 respostas
Thiago_de_Paula_Bese

Pessoal boa noite.

To tentanto listar um arrayList retornado pelo método lista(Classe CategoriaDAO) via JSTL. Porém, não tive sucesso. Por diversas vezes tentei achar erros no código, porem não encontrei.

Segue o codigo:
package Model;

public class Categoria {
    private String nome;
    
    public Categoria(){
        
    }
    
    public Categoria(String nome){
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}
package DAO;

import Model.Categoria;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class CategoriaDAO {
    
    private Connection con;
    private PreparedStatement stmt;
    private ResultSet rs;
    
    public void adiciona(Categoria cat) throws SQLException{
        con = new conexao.ConexaoMysql().getConexao();
        stmt = (PreparedStatement) con.prepareStatement("insert into categoria("
                + "cat_nome) values (?)");
        
        stmt.setString(1, cat.getNome());
        stmt.execute();
        
        stmt.close();
        con.close();
    }
    
    public List<Categoria> lista(String catNome) throws SQLException{
        
        con = new conexao.ConexaoMysql().getConexao();
        stmt = (PreparedStatement) con.prepareStatement("select cat_nome from categoria where cat_nome=?");
        stmt.setString(1, catNome);
        rs = stmt.executeQuery();
        ArrayList cat = new ArrayList<Categoria>();
        while(rs.next())
        {
            cat.add(new Categoria(rs.getString("cat_nome")));
        }
        return cat;
    }
}
<%-- 
    Document   : testa-lista
    Created on : 25/09/2011, 19:59:03
    Author     : Thiago
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>

<%@page import="DAO.CategoriaDAO" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <jsp:useBean id="dao" class="DAO.CategoriaDAO" />
        <table>
            <c:forEach var="categoria" items="${dao.lista}">
                <tr>
                    <td>${categoria.nome}</td>
                </tr>
            </c:forEach>
        </table>
    </body>
</html>

E POR ULTIMO, SEGUE O ERRO RETORNADO =/

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 /testa-lista.jsp at line 20

17:     <body>
18:         <jsp:useBean id="dao" class="DAO.CategoriaDAO" />
19:         <table>
20:             <c:forEach var="categoria" items="${dao.lista}">
21:                 <tr>
22:                     <td>${categoria.nome}</td>
23:                 </tr>


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:567)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:471)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)


root cause 

org.apache.jasper.el.JspPropertyNotFoundException: /testa-lista.jsp(20,12) '${dao.lista}' Property 'lista' not found on type DAO.CategoriaDAO
	org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:109)
	org.apache.jsp.testa_002dlista_jsp._jspx_meth_c_005fforEach_005f0(testa_002dlista_jsp.java:119)
	org.apache.jsp.testa_002dlista_jsp._jspService(testa_002dlista_jsp.java:90)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)


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

Se alguem tive alguma sugestão para a resolução, fico agradecido.

VAleuuw

7 Respostas

leonardobhbr

Amigo o problema esta no seu metodo

lista(String catNome)

Que esta recebendo um parametro, jstl foi feito para chamar metodos get e set

portanto esse metodo lista não faz parte do JavaBeans, se realmente quiser chamar este metodo de uma olhada no link abaixo q ele pode te ajudar
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html

Thiago_de_Paula_Bese

leonardobhbr:
Amigo o problema esta no seu metodo

lista(String catNome)

Que esta recebendo um parametro, jstl foi feito para chamar metodos get e set

portanto esse metodo lista não faz parte do JavaBeans, se realmente quiser chamar este metodo de uma olhada no link abaixo q ele pode te ajudar
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html

Na verdade, estou seguindo a apostila da Caelum FJ-21. Estou fazendo um exercicio desta apostila, e nela tem esse esquema de listar uma lista de tarefas com JSTL.
Como estou desenvolvendo um projeto aki em casa, estava tentando implementar esse esquema no meu sistema web.

Se vc tiver algum exemplo de como listar com JSTL, fico agradecido.

obrigado.

Roger75

Acho que você tem que ter um atributo “lista” no seu DAO. Pelo menos é isto o que ele está reclamando…

programadora

Como o leonardobhbr mesmo disse, o problema é que, para realizar listagens no JSTL, vc deve ter um método "lista" sem parâmetros e que atenda ao padrão JavaBeans de nomeação (getLista)...
Experimenta criar um método getLista, que não receba como parâmetro a String catNome, só pra entender melhor a lógica. Tipo:

// repare a mudança do nome do método de "lista" para "getLista"
    public List<Categoria> getLista() throws SQLException{  
           
         con = new conexao.ConexaoMysql().getConexao();  
         //listando todos os registros, sem fazer filtro, apenas para teste!
         stmt = (PreparedStatement) con.prepareStatement("select cat_nome from categoria");  
         //stmt.setString(1, catNome);  
         rs = stmt.executeQuery();  
         ArrayList cat = new ArrayList<Categoria>();  
         while(rs.next())  
         {  
             cat.add(new Categoria(rs.getString("cat_nome")));  
         }  
         return cat;  
     }

Dessa forma, seu código agora lista todas as categorias, sem filtrá-las pelo nome...
Do jeito que estava sendo feito não era possível, através do JSTL, chamar o método de listagem pois o mesmo possuía um parãmetro que nao era possível passar através do JSTL.
Deu pra entender a idéia???

Thiago_de_Paula_Bese
programadora:
Como o leonardobhbr mesmo disse, o problema é que, para realizar listagens no JSTL, vc deve ter um método "lista" sem parâmetros e que atenda ao padrão JavaBeans de nomeação (getLista)... Experimenta criar um método getLista, que não receba como parâmetro a String catNome, só pra entender melhor a lógica. Tipo:
// repare a mudança do nome do método de "lista" para "getLista"
    public List<Categoria> getLista() throws SQLException{  
           
         con = new conexao.ConexaoMysql().getConexao();  
         //listando todos os registros, sem fazer filtro, apenas para teste!
         stmt = (PreparedStatement) con.prepareStatement("select cat_nome from categoria");  
         //stmt.setString(1, catNome);  
         rs = stmt.executeQuery();  
         ArrayList cat = new ArrayList<Categoria>();  
         while(rs.next())  
         {  
             cat.add(new Categoria(rs.getString("cat_nome")));  
         }  
         return cat;  
     }

Dessa forma, seu código agora lista todas as categorias, sem filtrá-las pelo nome...
Do jeito que estava sendo feito não era possível, através do JSTL, chamar o método de listagem pois o mesmo possuía um parãmetro que nao era possível passar através do JSTL.
Deu pra entender a idéia???

Olá programadora.

Entendi sim. Sobre o padrão JavaBeans, eu tinha até mudado o método lista para getLista (por que na apostila falava que no jstl tinha que seguir dessa forma), porém, não tive sucesso.

Depois que eu sair do trabalho, vou modificar o método para deixa-lo sem argumento (este deve ser o empecilho para a não execução com sucesso), e tentar utiliza-lo no meu projeto.

Mas Desde Já fico agradecido pela ajuda.

=)

programadora

Exatamante!!! Acho que você pegou o espírito da coisa… Posta aí qqr coisa!!!

Vlw!

:wink:

Thiago_de_Paula_Bese

programadora:
Exatamante!!! Acho que você pegou o espírito da coisa… Posta aí qqr coisa!!!

Vlw!

:wink:

RESOLVIDO!

Era isso mesmo. Tirei o atributo do metodo e executou com sucesso.

Obrigado pela ajuda :wink:

Criado 25 de setembro de 2011
Ultima resposta 26 de set. de 2011
Respostas 7
Participantes 4