<Resolvido>Mostrando lista de objetos na tela - VRaptor

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?

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>

[quote=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>[/quote]

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;
	}	
}

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, só 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 já 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, só no final, capturar a Exception. Assim você consegue tratar cada uma delas separadamente.
            logger.error("Erro ao restaurar os usuários!", e);
//            e.printStackTrace();  
        }  
    }     
} 

[quote=Rafael Guerreiro]Eu a mudaria um pouquinho:

[code]
@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 <Usuario> para um dao que, pelo nome, só 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 já 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, só no final, capturar a Exception. Assim você consegue tratar cada uma delas separadamente.
logger.error(“Erro ao restaurar os usuários!”, e);
// e.printStackTrace();
}
}
}
[/code][/quote]

Cara valeu pelas dicas, com certeza vou alterar aqui.

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

Tenta alterar isso tudo e veja se o problema continua.

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

[quote=Rafael Guerreiro]Tenta alterar isso tudo e veja se o problema continua.

Ele não está criando as li? É isso?[/quote]

Exato.

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.

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.

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

Mas fico feliz que funcionou!! :smiley: