Problemas com forEach

10 respostas
A

Boa noite pessoal

Bom , estou me aventurando em java EE e me deparei com um problema no qual nãoconsigo resolver.

Estou tentando utilizar taglibs e beans , porem o negocio não quer rolar.

O "sistema" que eu montei para testes deverá armazenar em uma única lista um campo Nome e um ID então idealizei o um bean que irá servir apenascomo uma "estrutura" , outro bean que irá ser a lista e um jsp p/ acessar tudo isso.

Bom antes de ir parao mais cmplicado fiz testes usando um ArrayList e funcionou perfeitamente, então substitui o String pelo meu bean (estruturaDados)... e ai começou a m.. toda.

Alguem poderia me dar uma luz sobre o ocorrido e talvez indicar um material p/ consulta.

Obrigaod a todos.

[]s

[list][/list]

ao executar o TomCat me reportou o seguinte erro
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 /listaDados2.jsp at line 16

13:         
14:     </head>
15:     <body>
16:         <c:forEach var="estDados" items="${nvDados.dados}">
17:             <c:out value="${estDados.Nome}" /> 
18:             <br/>
19:         </c:forEach>


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:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


root cause 
java.lang.NullPointerException
	javax.el.BeanELResolver$BeanProperty.read(BeanELResolver.java:259)
	javax.el.BeanELResolver$BeanProperty.access$000(BeanELResolver.java:209)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:60)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:925)
	org.apache.jsp.listaDados2_jsp._jspx_meth_c_005fforEach_005f0(listaDados2_jsp.java:113)
	org.apache.jsp.listaDados2_jsp._jspService(listaDados2_jsp.java:85)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
Bom , se entendi bem este erro diz que a linha 16 está retornando null (será?)

bom .. os arquivos são

listaDados2.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@page import="PkgRevisao.*"%>
<jsp:useBean id="nvDados" class="PkgRevisao.navegarDados" scope="session"/>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!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=UTF-8">
        
    </head>
    <body>
        <c:forEach var="estDados" items="${nvDados.dados}">
            <c:out value="${estDados.Nome}" /> 
            <br/>
        </c:forEach>
    </body>
</html>

navegarDados.java

package PkgRevisao;

import java.util.ArrayList;
import java.util.Iterator;

public class navegarDados {
    public final int                 ANT = 1;
    public final int                 PRX = 0;
    private Iterator<estruturaDados> it  = null;
    private ArrayList<estruturaDados>     dados ;

    public navegarDados() {
        this.dados = new ArrayList<estruturaDados>();

        addDados("Nome 1", 1);
        addDados("Nome 2", 2);
        addDados("Nome 3", 3);
        addDados("Nome 4", 4);
    }

    public void addDados(String nome, int id) {
        estruturaDados ldados = new estruturaDados();

        ldados.setNome(nome);
        ldados.setID(id);
        this.dados.add(ldados);
        it = null;
    }

    public ArrayList<estruturaDados> getDados() {
        return this.dados;
    }
}

estruturaDados.java

package PkgRevisao;

public class estruturaDados {
    private String Nome = null;
    private int ID = 0;


    public int getID() {
        return this.ID;
    }

    public String getNome() {
        return this.Nome;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public void setNome(String Nome) {
        this.Nome = Nome;
    }
}

10 Respostas

Andre_Fonseca

oi

substitua

&lt;c:out value="${estDados.Nome}" /&gt;

por

&lt;c:out value="${estDados.nome}" /&gt;

preste atenção que o nome é minusculo

A

André , obrigado.

Já tinha feito isso antes, e não resolveu. Mas lendo sua dica resolvi alterar os nomes das 2 variaveis p/ “nome” e “id” (tudo em minusculo) no bean estruturaDados. Mas mesmo após essa alteração o erro continua.

Andre_Fonseca

oi

onde vc está chamando o construtor? ou seja, onde está fazendo o

new navegarDados()
A

Oi André.

Então o objeto está sendo construido, tanto é que se eu faço um loop usando a mesma instancia do bean eu consigo recuperar os dados.
Testei isso no listaDados2.jsp e em outro jsp, onde coloquei um link p/ abrir o listaDados2.jsp .

E para desencargo, coloquei um break point no construtor do navegarDados para verificar se realmente ele passaria lá , e passou em qualquer um dos testes.

Andre_Fonseca

oi

pelo que eu entendi a sua classe navegarDados seria tipo uma action ou então uma servlet né? bom, nesse caso talvez o que você precise talvez seja apenas mudar o escopo

já tentou mudar

&lt;jsp:useBean id="nvDados" class="PkgRevisao.navegarDados" scope="session"/&gt;

para

&lt;jsp:useBean id="nvDados" class="PkgRevisao.navegarDados" scope="request"/&gt;

você precisa mesmo desses dados no escopo da session? como você está adicionando então?

deveria fazer algo como

session.setAttribute("array",valor);

veja se ajuda…

A

Oi.

Bom o navegarDados é um servlet, em meu teste uso ele p/ disponibilizar sa poucas informações. Tentei mudar o escopo mas tbm deu o mesmo erro …então resolvi ler novamente o help e resolvi mudar o tipo de retorno do getDados p/ “Iterator” e funcionou perfeitamente.

Eu substitui o metodo

public ArrayList<estruturaDados> getDados() {
        return this.dados;
    }

por

public Iterator<estruturaDados> getDados() {
        return this.dados.listIterator();
    }

e tudo funcionou.

O que não entendo é pq no meu teste usando ArrayList tinha funcionado… estranho

Outra dica q vc passou foi usar o setAttribute … se eu usar ele não estaria sobrepondo meu objeto ?
ou seja, perderia as informações nele contido até no momento que eu usei o setAttribute ?

Andre_Fonseca

anderson.rossi:
Oi.

Bom o navegarDados é um servlet, em meu teste uso ele p/ disponibilizar sa poucas informações. Tentei mudar o escopo mas tbm deu o mesmo erro …então resolvi ler novamente o help e resolvi mudar o tipo de retorno do getDados p/ “Iterator” e funcionou perfeitamente.

Eu substitui o metodo

public ArrayList<estruturaDados> getDados() {
        return this.dados;
    }

por

public Iterator<estruturaDados> getDados() {
        return this.dados.listIterator();
    }

e tudo funcionou.

O que não entendo é pq no meu teste usando ArrayList tinha funcionado… estranho

Outra dica q vc passou foi usar o setAttribute … se eu usar ele não estaria sobrepondo meu objeto ?
ou seja, perderia as informações nele contido até no momento que eu usei o setAttribute ?

oi

é estranho mesmo

o setAttribute serviria para você setar o objeto na sua servlet no escopo da session, mas isso apenas se você precisa-se usar depois de receber a request

A

Entendi.

Bom André, obrigado pelas dicas …t+

[]s

C
<c:out value="${estDados.nome}" />

Cara, esse seu atributo ‘nome’ tem um get???

public String getNome() {
 return this.nome;
}
A

Sim , ele tem, é o getNome . mas quando uso o a EL ela suprime o “get” do metodo, ficando apenas “nome”.

Criado 12 de outubro de 2009
Ultima resposta 14 de out. de 2009
Respostas 10
Participantes 3