C:FOREACH Passando Reto! :O

6 respostas
jayBean

Olá a todos!
Criei um método que me retorna um ArrayList com todas as contas a pagar de certo usuário.
A montagem do arraylist está 100%, porém na hora de jogar no FOR:EACH, o laço passa reto após a primeira vez, e nem na primeira vez, consegue pegar os valores.
Alguém poderia me ajudar?

A seguir está meu código JSP:

<table width="748" border="1">
<tr>
    <th width="44" scope="col">ID</th>
    <th width="78" scope="col">VALOR</th>
    <th width="105" scope="col">DECRIÇÃO</th>
    <th width="97" scope="col">CREDOR</th>
    <th width="165" scope="col">DATA PAGAMENTO</th>
    <th width="219" scope="col">DATA CADASTRO</th>
</tr>
<c:forEach var="contapagar" items="<%=modelcontapagar.getAllContaPagar((UsuarioBean)session.getAttribute("usrLogado"))%>">
<tr>
    <td>${contapagar.id}</td>
    <td>${contapagar.valor}></td>
    <td>${contapagar.desc}</td>
    <td>${contapagar.credor}</td>
    <td>${contapagar.dataPagamento}</td>
    <td>${contapagar.dataCadastro}</td>
</tr>
</c:forEach>
</table>

Atenciosamente,

Jean

6 Respostas

Dieval_Guizelini

Acho que você deve verificar algumas coisas:

  1. usrLogado está mesmo na sessão
  2. se o servlet ou filter que deve ser executado antes desse código, foi mesmo executado…
  3. não ocorreu um sessin.invalidade ou sobreposição (por filtros por exemplo)

fw

jayBean

Eu fiz o debug, e o arraylist no método getAllContaPagar() está sendo montado corretamente.
O valor do UsuarioBean está sendo passado corretamente, por mais inacreditável que seja.
Alguém tem alguma idéia?

jayBean

Abaixo está o método que me retorna o ArrayList:

public static ArrayList<ContaPagarBean> getAllContaPagar(UsuarioBean usuario) throws SQLException, NamingException{
        Connection cnn = Utils.getConexao();
		Usuario usrFinder = new Usuario();
		String cmdSQL;
        int idUsuario;
		ArrayList<ContaPagarBean> contasPagar  = new ArrayList<ContaPagarBean>();
		try{
			Statement sta = cnn.createStatement();
            idUsuario = usuario.getId();
            cmdSQL = "SELECT * FROM contaspagar WHERE idUsuario = " + idUsuario +" ORDER BY dataPagamento";
			ResultSet rs = sta.executeQuery(cmdSQL);
			
            while(rs.next()){
               ContaPagarBean contaPagar = new ContaPagarBean();
               int id = rs.getInt("id");
               double valor = rs.getDouble("valor");
               String desc = rs.getString("descricao");
               String credor = rs.getString("credor");
               int idUsuarioBd = rs.getInt("idUsuario");
               String dataCad = rs.getString("dataCadastro");
               String dataPag = rs.getString("dataPagamento");
               contaPagar.setId(id);
               contaPagar.setValor(valor);
               contaPagar.setCredor(credor);
               contaPagar.setDesc(desc);
               contaPagar.setIdUsuario(idUsuario);
               contaPagar.setDataCadastro(dataCad);
               contaPagar.setDataPagamento(dataPag);
               contasPagar.add(contaPagar);
            }
			return contasPagar;
		}
		catch(Exception e){
			return contasPagar;
		}
		finally{
			if(cnn != null){
				cnn.close();
			}
		}
   }

Não reparem em como estou fazendo aqueles gets/sets absurdos, eu tinha eles em um só construtor mas por debug fiz todas essas linhas.

Abraço!

jayBean

Cheguei a outro erro pessoal:
[i]
org.apache.jasper.JasperException: /index.jsp(64,42) Attribute value modelcontapagar.getAllContaPagar((UsuarioBean)session.getAttribute(“usrLogado”)) is quoted with " which must be escaped when used within the value
[/i]

Abração!

R

Altere para aspas simples

items="&lt;%=modelcontapagar.getAllContaPagar((UsuarioBean)session.getAttribute('usrLogado'))%&gt;"&gt;
arkhan

Acho q vc deveria fazer assim:

<jsp:useBean name="nomeQualquer" class="nome_da_classe_que_vai_receber_os_dados"/>

<c:forEach var="nome" items="nomeQualquer.allContaPagar>
    ...
</c:forEach>

Acho q seria a forma mais correta de se trabalhar, porque ai você não coloca scriplets no meio do seu código da view

Se tiver problemas em recuperar dados de uma sessão eu sugiro que faça o seguinte:

public class bla{
    
    private HTTPSession session;
    private UsuarioBean usuario;

   public void setSession(HttpSession session){
          this.sessiont = session;
   }


   public HttpSessiont getSession(){
          return this.sessiont;
   }


   public void setUsuario(UsuarioBean usuario){
          this.usuario = usuario;
   }

   public void getUsuario(UsuarioBean usuario){
          return (UsuarioBean) this.getSession.getAttribute("nome_do_registro_session");
   }


   public static ArrayList(ContaPagarBean) getAllContaPagar() throws SQLException{
       # Connection cnn = Utils.getConexao();  
#         Usuario usrFinder = new Usuario();  
#         String cmdSQL;  
#         int idUsuario;  
#         ArrayList<ContaPagarBean> contasPagar  = new ArrayList<ContaPagarBean>();  
#         try{  
#             Statement sta = cnn.createStatement();  
#             cmdSQL = "SELECT * FROM contaspagar WHERE idUsuario = "+ this.getUsuario().getId() + " ORDER BY dataPagamento";  
#             ResultSet rs = sta.executeQuery(cmdSQL);  
#               
#             while(rs.next()){  
#                ContaPagarBean contaPagar = new ContaPagarBean();  
#                int id = rs.getInt("id");  
#                double valor = rs.getDouble("valor");  
#                String desc = rs.getString("descricao");  
#                String credor = rs.getString("credor");  
#                int idUsuarioBd = rs.getInt("idUsuario");  
#                String dataCad = rs.getString("dataCadastro");  
#                String dataPag = rs.getString("dataPagamento");  
#                contaPagar.setId(id);  
#                contaPagar.setValor(valor);  
#                contaPagar.setCredor(credor);  
#                contaPagar.setDesc(desc);  
#                contaPagar.setIdUsuario(idUsuario);  
#                contaPagar.setDataCadastro(dataCad);  
#                contaPagar.setDataPagamento(dataPag);  
#                contasPagar.add(contaPagar);  
#             }  
#             return contasPagar;  
#         }  
#         catch(Exception e){  
#             return contasPagar;  
#         }  
#         finally{  
#             if(cnn != null){  
#                 cnn.close();  
#             }  
#         }
   } 
}

Ai no jsp vc faz o seguinte:

<jsp:setProperty name="nomeQualquer" property="session" value="${pageContext.session}"/>

Então vc pode fazer o forEach daquela forma que descrevi ali em cima.

O que acontece, vc seta o atributo session da sua classe, ai qndo vc chama o método que te retorna o arrayList ele vai pegar o objeto UsuarioBean que estava guardo na sessao, e desse objeto ele vai pegar o id q é o que vc precisa para fazer a consulta. E tudo funcionará certinho.

Espero ter ajudado e desculpa pela falta de detalhes, estou com um pouco de pressa.

Abraço

Criado 4 de abril de 2009
Ultima resposta 5 de abr. de 2009
Respostas 6
Participantes 4