VRaptor 3 - Ajuda com dados na View[Iniciante]

28 respostas
Leonardo_Gloria

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!

28 Respostas

G

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

Lucas_Cavalcanti

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

G

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
return this.controller.getCdDao().listAll();
Para isso
Cd cd0 = new Cd();
cd0.setTitulo("Meu primeiro CD");

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

return Arrays.asList(cd0, cd1);
Leonardo_Gloria

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

Abraços!

Leonardo_Gloria

Testando aqui, eu fiz o seguinte:

public Collection<Cd> 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());
    }

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.

G

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

Leonardo_Gloria

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

Lucas_Cavalcanti

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…

Paulo_Silveira

é, 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!

Leonardo_Gloria

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

G

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

Y

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.

Leonardo_Gloria

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


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.

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?

G

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.

@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();
    }
}
Lucas_Cavalcanti

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

Lucas_Cavalcanti

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

vai ter algo além da lista?

N

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

Leonardo_Gloria

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

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


}

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

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!

N

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=“<a href="http://musica.cd.id">musica.cd.id</a>”>

<c:forEach items="${cdList}" var=“cd”>

<option value="${<a href="http://cd.id">cd.id</a>}">${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

juniorsatanas

nb-master ta fazendo a apostila baseado no material do Vraptor 2 é ?

N

cara eu to é me lascando lento apostila do Vraptor 2 e usando o Vraptor 3 =)

mais dei uma parada mechendo no cloud do google agora para meu site novo…

http://sitescriptseguro.appspot.com/home

tentei user o vraptor 3 no google só que ao usar o bando de dados deles está dando erros… =/

abraços…

juniorsatanas

nb-master o meu crud deu um pau doido, seguir toda a documentação e nada… estou enrolando em algo…
[email removido] manda teu codigo pra mim ver !

G

Nem me fala… a idéia de ter um banco vertical é um pouco estranho para quem a vida toda usou bancos relacionais. Estou pensando em como faço para gerar um dump do banco sem ser via aplicação.

juniorsatanas

Verdade !

juniorsatanas

Fazendo tudo certinho mesmo assim da erro ! o que será ?

classe--------------->Dao----------------->Controller--------------------JSP

http://localhost:8080/global/usuarios/adiciona

meu controller

@Path("/usuarios") //Adiciona usuarios
	@Post
          public void adiciona(Usuarios usuarios) {
          this.dao.adiciona(usuarios);
     }

meu formulario

&lt;%@ include file="../home/header.jsp" %&gt;

&lt;form action="&lt;c:url value="/usuarios/adiciona" /&gt;" name="registerForm" method="post"&gt;
              
	&lt;fieldset&gt;
		&lt;legend&gt;.:Cadastrar no Sistema :.&lt;/legend&gt;

		&lt;label for="usuarios.login"&gt;&lt;fmt:message key="login"/&gt;&lt;/label&gt;
                    &lt;input type="text" name="usuarios.login" value="${usuarios.login }"/&gt;

                    &lt;label for="usuarios.password"&gt;&lt;fmt:message key="password"/&gt;&lt;/label&gt;
		&lt;input type="password" name="usuarios.password" value="${usuarios.password }"/&gt;
		
                    &lt;button type="submit" id="usuarios.submit" value="Salvar"&gt;&lt;fmt:message key="send"/&gt;&lt;/button&gt;

	&lt;/fieldset&gt;
&lt;/form&gt;
&lt;%@ include file="../home/footer.jsp" %&gt;er.jsp" %&gt;

meu usuarioDao

@Component
public class UsuariosDao {
    private final Session session;
    public UsuariosDao(Session session) {
    this.session = session;
    }
        @Post
        public void adiciona(Usuarios usuarios) {
        session.save(usuarios);
    }

         
}
N

pelo que me lembro no UsuarioDao

nao precisa da anotação @POST

no controller usa assim

@Post

<a class="mention" href="/u/path">@Path</a>("/usuarios/adiciona") //Adiciona usuarios

public void adiciona(Usuarios usuarios) {

this.dao.adiciona(usuarios);

}
G

Junior, uma coisa que talvez você não entendeu é sobre os paths do vraptor.

Quando você anota seu controller com @Path aquele path exato é usado no URI. @Path("/usuarios) response apenas pelo URL /usuarios. Creio que seu erro era porque você estava tentando acessar como /usuarios/adiciona.

Caso você não anotar o controller o vraptor internamente usa o URI baseado no nome do controller em camel-case sem o sufixo Controller, concatenado com o nome do método. Ou seja, se seu controller é UsuariosController e tem um método chamado adicionar aí sim ele será usado como /usuarios/adicionar. Porém se você colocar a anotação @Path ela será substituída por esse padrão.

Lembrando também que se você colocar as anotações @Post ou @Get o método somente responderá por requisições desse tipo. Caso não houver @Post nem @Get ambas serão usadas.

Abraços

juniorsatanas

Garcia Bom Dia !

Obrigado, vou testar aqui para ver !

Criado 10 de dezembro de 2009
Ultima resposta 12 de jan. de 2010
Respostas 28
Participantes 7