VRaptor 3 - Ajuda com dados na View[Iniciante]

Galera estou iniciando no Vraptor, e desculpe se for ignorancia, mas tenho uma dúvida na questão da view, vou exemplificar…

Eu tenho um Controller chamado loja:

@Resource
public class LojaController {
    private final DaoFactory controller;
    private Result result;

    public LojaController(DaoFactory controller, Result result) {
        this.controller = controller;
        this.result = result;
    }
    

    public Collection<Cd> list(){
        return this.controller.getCdDao().listAll();
    }

    public void inicio(){

    }

}

Quando eu chamo a view por …/loja/inicio a Lista de Cds não deveria ficar disponível para o Jsp? Porem o For each n mostra nada…

<ul>
    <c:forEach var="cd"  items="${cdList}" >
       <li> ${cd.titulo}</li>
    </c:forEach></ul>

Alguem sabe aonde u estou pecando??
Agradeço ai pela atenção…
[]s!

Leonardo, quando você tem uma lista ele exporta isso como xxxList, sendo xxx o tipo de objeto em camel-case. No seu caso seria cdList.

Abraços

a lista tá vindo com elementos? o nome da variável está certo… deveria funcionar

Lucas, como eu ando desatento há alguns dias, viu só? Eu juro que não ví o cdList, hehehe.

Leonardo, uma coisa que você pode fazer para testar se vem ou não registros é alterar seu código para trazer os cds em hard-coded, assim você consegue indentificar se há mesmo erro ou sua lista está vindo vazia da DAO.

Altere disso

Para isso

[code]Cd cd0 = new Cd();
cd0.setTitulo(“Meu primeiro CD”);

Cd cd1 = new Cd();
cd1.setTitulo(“Meu segundo CD”);

return Arrays.asList(cd0, cd1);[/code]

Fala rapazeada, fiz como o amigo garcia-jj falou, e n deu em nada. A view continua vazia :(…

Abraços!

Testando aqui, eu fiz o seguinte:

[code]public Collection list(){
//return this.controller.getCdDao().listAll();
Cd cd0 = new Cd();
cd0.setTitulo(“Meu Primeiro Cd”);
Cd cd1 = new Cd();
cd1.setTitulo(“Meu SEgundo Cd”);
return Arrays.asList(cd0,cd1);

}


public void inicio(){
    result.include("cdList",list());
}

[/code]

Chamei o método list como parametro do include… e assim funciona, mas acredito não ser o jeito correto né? E eu n faço a minima ideia de onde está o erro.

Qual a versão exata do vraptor você está usando? 3.0.1, 3.0.2…

Usar os dados como retorno do método ou via include são ambos corretos. Não deveria haver diferença entre ambos.

Abraços

Estou usando o 3.0.2

Intendi que não faz a diferença, mas eu pus o include dentro do método inicia. é correto isso? Ao que me pareceu lendo a documentação é que fazendo um método com retorno, qd a view fosse inicializada o objeto ficaria disponivel pra ela, eu estou usando essa gambiarra q fiz.

[]s!
Leonardo Gloria

troca de Collection pra List (não deveria fazer diferença =( )
pode ser tb que o nosso algoritmo de gerar nomes esteja com problema… vou verificar…

é, parece que o VRaptor ta pegando so List para isso da nomenclatura automatica.

troca:

public Collection list(){
}

para

public List list(){ }

e veja o que acontece. Aproveita e liga o debug mode que ele deve dizer claramente com qual nome ele esta expondo o objeto!

Fala Galera, troquei o nome como voces pediram…

de Collection pra List… não funfou… na hora de chamar o cdList na view não retorna nada.
Ainda n consegui debugar legal no Netbeans pra ver com qual nome ele tah sendo passado, ou não… Hoje a tarde vou sentar pr dar uma analizada…

Agradeço a todo o pessoal do Vraptor pela atenção.
E parabens, temos um ótimo framework!

[]s!
Leonardo Gloria

Leonardo, mantenha-nos informado de como andam as coisas. Mesmo alterando para list usa aquele hard-coded que te passei, assim você consegue ver se o erro é no JSP ou é da DAO.

Abraços

Eu tbm estou comecando, mas pelo que entendi do framework pra acessar a lista de cds voce teria que acessar a url …/loja/list. Por isso que qdo vc inclui o parametro chamando o metodo list() do metodo inicio() funciona.

Fala galera, Desculpa a demora em responder e/ou dar notícias fim de período na facul foi tenso.

[quote]
Eu tbm estou comecando, mas pelo que entendi do framework pra acessar a lista de cds voce teria que acessar a url …/loja/list. Por isso que qdo vc inclui o parametro chamando o metodo list() do metodo inicio() funciona. [/quote]

Pois é, essa é minha dúvida, tem como eu acessar essa List sem acessar a url /list…
Ao acessar a url ‘/loja/inicio’ ele vai executar o método inicio() e fazer o redirecionamento pra inicio.jsp… Implicitamente ele executa o método list, disponibilizando a lista para a view? Ou é como o amigo citou?

A forma correta é como o YvGa falou… juro que nem notei que poderia ser esse o erro. Creio que o correto do seu código é isso abaixo. Se você chamar /meu-contexto/loja/list irá chamar a lista.

[code]@Resource
public class LojaController {
private final DaoFactory controller;
private Result result;

public LojaController(DaoFactory controller, Result result) {
    this.controller = controller;
    this.result = result;
}


public Collection<Cd> list(){
    return this.controller.getCdDao().listAll();
}

}[/code]

você pode tentar colocar um include da lista dentro do seu inicio.jsp… mas cuidado pq pode vir a página completa, e quebrar o layout da sua classe:

inicio.jsp

<....>
<jsp:include page="../loja/list"/>
<...>

ou algo do tipo

o que vc quer fazer é colocar a lista dentro do inicio.jsp?

vai ter algo além da lista?

Leonardo como é o seu arquivo Dao?
O método de listar tudo.

[quote]Leonardo como é o seu arquivo Dao?
O método de listar tudo. [/quote]

O código do meu Dao:

public class Dao<T> {

    private final Session session;
    private final Class classe;

    public Dao(Session session, Class classe) {
        this.session = session;
        this.classe = classe;
    }

    public void adiciona(T u) {
        this.session.save(u);
    }

    public void remove(T u) {
        this.session.delete(u);
    }

    public void edita(T u) {
        this.session.merge(u);
    }

    public List<T> listAll() {
        return this.session.createCriteria(this.classe).list();
    }

    public T buscaPeloId(Long id) {
        return (T) this.session.load(this.classe, id);
    }

    protected  Session getSession() {
        return this.session;
    }


}

[quote]o que vc quer fazer é colocar a lista dentro do inicio.jsp?
vai ter algo além da lista? [/quote]

Bom,nessa minha pagina vai ter uma div e dentro dela eu vo exibir o conteúdo da List.

Obrigado pela atenção!
[]s!
Leonardo Gloria!

Cara…eu to fazendo a apostila da caelum acho que vc tbm esta …

Esta parte eu já consegui fazer…

Para seu controller, adeque aos seus metodos

@Path("/cd/lista") public List&lt;Cd&gt; lista () { return this.dao.getCdDao().listaTudo(); }

meu Listar.jsp:


&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;

&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %&gt;

&lt;html&gt;
	&lt;head&gt;
		&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
		&lt;title&gt;Listando Cd&lt;/title&gt;
                 &lt;link rel="stylesheet" type="text/css" href="/css/style.css"/&gt;
	&lt;/head&gt;
	&lt;body&gt;
            &lt;%@ include file="../menu.jsp" %&gt;
		
		&lt;table&gt;
			&lt;thead&gt;
				&lt;tr&gt;
					&lt;th&gt;Id&lt;/th&gt;
					&lt;th&gt;Titulo&lt;/th&gt;
                                        &lt;th&gt;Artista&lt;/th&gt;
                                        &lt;th&gt;Genero&lt;/th&gt;
                                        &lt;th&gt;Ação&lt;/th&gt;
				&lt;/tr&gt;
			&lt;/thead&gt;
			&lt;tbody&gt;
				&lt;c:forEach items="${cdList}" var="cd"&gt;
					&lt;tr&gt;
						&lt;td&gt;${cd.id}&lt;/td&gt;
						&lt;td&gt;${cd.titulo}&lt;/td&gt;
						&lt;td&gt;${cd.artista}&lt;/td&gt;
                                                &lt;td&gt;${cd.genero}&lt;/td&gt;
						&lt;td&gt;
						    <a >editar</a>
&lt;/display:column&gt;
	 &lt;form action="/cd/${cd.id}" method="post" &gt;
                                                        &lt;input name='cd.id' value='${cd.id}' type='hidden'/&gt;
                                                        &lt;button type="submit" name="_method" value="PUT"&gt;Alterar cliente ${cd.id}&lt;/button&gt;
                                                    &lt;/form&gt;
						&lt;/td&gt;
						&lt;td&gt;
                                                    &lt;form action="/cd/${cd.id}" method="post" &gt;
                                                        &lt;input name='cd.id' value='${cd.id}' type='hidden'/&gt;
                                                        &lt;button type="submit" name="_method" value="DELETE"&gt;remover cliente ${cd.id}&lt;/button&gt;
                                                    &lt;/form&gt;
          
						&lt;/td&gt;
					&lt;/tr&gt;
				&lt;/c:forEach&gt;
			&lt;/tbody&gt;
		&lt;/table&gt;
	&lt;/body&gt;
&lt;/html&gt;

Coleque todas as tags de heads, html, quando eu estava usando sem estava com erro… =)

E aproveitando se alguem souber me ajudar…

Eu tenho a classe

CdController e MusicaController

Dentro de Musica tenho que popular um select com os CDs cadastrados…

public void formulario () {
        result.include("cdList", this.dao.getCdDao().listaTudo());
    }

No JSP:

<select name=“musica.cd.id”>
<c:forEach items="${cdList}" var=“cd”>
<option value="${cd.id}">${cd.titulo}</option>
</c:forEach>
</select>

Obs.: Se eu pegar o codigo do JSP jogar dentro da pagina de Listar do CdController funciona mais na pasta MusicaController não.

att