<Resolvido>Mostrando lista de objetos na tela - VRaptor

9 respostas
cleisommais

Amigos,
Talvés seja coisa boba mas é que não estou consiguindo iterar no foreach via tag no jsp.
Eu printo o resultado na tela mas o foreach não consegue iterar.

Código java e jsp:

@Path("/login/restoreAll")
	public Collection<Usuario> restoreAll() {
		try {
			logger.info("Listando!");
			lista = dao.restoreAll(usr);
			List x = new ArrayList();
			for(Usuario lst : lista){
				x.add(lst);
				logger.info(lst.toString());
			}
			result.include("propriedades", x);
			return lista;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

Essa redundância que vocês viram no método é porque eu estava procurando o porque de não iterar no jsp.
Favor desconsiderar a redudância.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
${propriedades}
	<ul>
		<c:forEach items="${propriedades}" var="us">
			<li>${us.usrLogin} - ${us.usrNome}</li>
		</c:forEach>

	</ul>
</body>
</html>

O resultado na tela é:

Alguém sabe me dizer onde que eu errei?

9 Respostas

Rafael_Guerreiro

Bem estranho isso, hein…

Eu posso dar algumas dicas: Não precisa retornar uma lista se você já está fazendo um result.include… Então faça a sua action void.

Ele não está preenchendo nenhum item na sua UL??

Pode me mostrar a classe Usuario?

Esse resultado na tela é por que você tem um ${propriedades} solto ali em cima. Então deveriam ficar duplicados.

&lt;body&gt; ${propriedades} &lt;!--// aqui vai fazer um toString() da sua lista... --&gt; <ul>

cleisommais

Rafael Guerreiro:
Bem estranho isso, hein…

Eu posso dar algumas dicas: Não precisa retornar uma lista se você já está fazendo um result.include… Então faça a sua action void.

Ele não está preenchendo nenhum item na sua UL??

Pode me mostrar a classe Usuario?

Esse resultado na tela é por que você tem um ${propriedades} solto ali em cima. Então deveriam ficar duplicados.

&lt;body&gt; ${propriedades} &lt;!--// aqui vai fazer um toString() da sua lista... --&gt; <ul>

O código da entidade usuário não tema nada demais mas vou mostrar toda a classe de controller para você entender melhor.

/**
 * 
 */
package br.com.filesystem.controller;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.log4j.Logger;

import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.filesystem.dao.UsuarioDao;
import br.com.filesystem.entities.Usuario;

/**
 * @author Destroyer
 * 
 */
@Resource
public class LoginController {
	private final Result result;
	static Logger logger = Logger.getLogger(LoginController.class);

	public Collection&lt;Usuario&gt; lista = new ArrayList&lt;Usuario&gt;();

	private Usuario usr = new Usuario();
	
	private UsuarioDao&lt;Usuario&gt; dao = new UsuarioDao&lt;Usuario&gt;();

	public LoginController(Result result) {
		this.result = result;
	}

	@Path("/")
	public void login() {
		try {
		} catch (Exception e) {
			logger.error("Erro ao gravar usuário! Erro: " + e.getMessage());
			e.printStackTrace();
		}
	}
	@Path("/login/restoreAll")
	public Collection&lt;Usuario&gt; restoreAll() {
		try {
			logger.info("Listando!");
			lista = dao.restoreAll(usr);
			List x = new ArrayList();
			for(Usuario lst : lista){
				x.add(lst);
				logger.info(lst.toString());
			}
			result.include("propriedades", x);
			return lista;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}	
}
Rafael_Guerreiro

Eu a mudaria um pouquinho:

@Resource  
public class LoginController {  
    private final Result result;  
    private final UsuarioDao dao;
    private final Logger logger = Logger.getLogger(this.getClass()); // assim fica mais fácil de copiar essa linha...

// Por que você passa o &lt;Usuario&gt; para um dao que, pelo nome,  pode ser de Usuário?

    public LoginController(Result result, UsuarioDao dao) {// Anote UsuarioDAO com @Component e deixe que o VRaptor entregue-o à vc.
        this.result = result;  
        this.dao = dao;
    }  
  
    @Path("/")  
    public void login() {  
        try {  
        } catch (Exception e) {  
            logger.error("Erro ao gravar usuário!", e);// Passe a exception como parâmetro que o logger disponibiliza a stacktrace para você.
//            e.printStackTrace();  
        }  
    }  
    @Path("/login/restoreAll")  
    public void restoreAll() {  // Não precisa do retorno pois, na minha opinião, usar o result.include é mais legível.
        try {  
            logger.info("Listando!");
            result.include("propriedades", dao.restoreAll());// Teoricamente, você não precisa passar esse usuário  que você vai restaurar TODOS.
        } catch (Exception e) {  // Não use sempre um catch de Exception... O ideal é você tentar capturar as outras exceptions antes e,  no final, capturar a Exception. Assim você consegue tratar cada uma delas separadamente.
            logger.error("Erro ao restaurar os usuários!", e);
//            e.printStackTrace();  
        }  
    }     
}
cleisommais
Rafael Guerreiro:
Eu a mudaria um pouquinho:
@Resource  
public class LoginController {  
    private final Result result;  
    private final UsuarioDao dao;
    private final Logger logger = Logger.getLogger(this.getClass()); // assim fica mais fácil de copiar essa linha...

// Por que você passa o &lt;Usuario&gt; para um dao que, pelo nome,  pode ser de Usuário?

    public LoginController(Result result, UsuarioDao dao) {// Anote UsuarioDAO com @Component e deixe que o VRaptor entregue-o à vc.
        this.result = result;  
        this.dao = dao;
    }  
  
    @Path("/")  
    public void login() {  
        try {  
        } catch (Exception e) {  
            logger.error("Erro ao gravar usuário!", e);// Passe a exception como parâmetro que o logger disponibiliza a stacktrace para você.
//            e.printStackTrace();  
        }  
    }  
    @Path("/login/restoreAll")  
    public void restoreAll() {  // Não precisa do retorno pois, na minha opinião, usar o result.include é mais legível.
        try {  
            logger.info("Listando!");
            result.include("propriedades", dao.restoreAll());// Teoricamente, você não precisa passar esse usuário  que você vai restaurar TODOS.
        } catch (Exception e) {  // Não use sempre um catch de Exception... O ideal é você tentar capturar as outras exceptions antes e,  no final, capturar a Exception. Assim você consegue tratar cada uma delas separadamente.
            logger.error("Erro ao restaurar os usuários!", e);
//            e.printStackTrace();  
        }  
    }     
}

Cara valeu pelas dicas, com certeza vou alterar aqui.

Mas você não sabe nada do problema de não iterar no foreach?

Rafael_Guerreiro

Tenta alterar isso tudo e veja se o problema continua.

Ele não está criando as li? É isso?

cleisommais

Rafael Guerreiro:
Tenta alterar isso tudo e veja se o problema continua.

Ele não está criando as li? É isso?

Exato.

Rafael_Guerreiro

Ele dá algum erro?

Eu realmente não consigo encontrar problema nisso que você me passou…

Você consegue usar outras tags da taglib core?

Tente usar a <c:if> e veja se faz algum efeito.

cleisommais

Prezado Rafael,
Com muito custo resolvi.

O problema era a importação da tag lib.

Como era:

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

Como ficou:

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

Agradeço a sua ajuda, aquelas mudanças sugeridas eu apliquei no código, ficou mais elegante é funcional o código.

Rafael_Guerreiro

Nossa senhora, é um detalhe que passou despercebido por mim… :oops:

Mas fico feliz que funcionou!! :smiley:

Criado 15 de outubro de 2012
Ultima resposta 15 de out. de 2012
Respostas 9
Participantes 2