Dúvida Vraptor3 populando objetos na view

14 respostas
rafaelob

Pessoal,

Sei que o Vraptor utiliza a convenção pelo nome do parâmetro para popular um objeto na view, e que se os atributos dele tiver getters e setters eu poderia simplesmente utilizar:

“parametro.atributo” .

Minha dúvida é a seguinte, tenho um objeto que vai ter uma lista de outros objetos.

Eu tenho uma classe Solicitação e nela eu tenho uma lista de “ContatosTecnicos”. Dentro da view de criação de uma solicitação eu poderia criar 1 ou mais ContatosTecnicos e teria que adicionar na Solicitacao, está ai minha dúvida.

Como eu poderia fazer isso? Se eu usar “solicitacao.contatos” eu chamaria um set, que receberia uma lista, né? Mas eu tou criando ContatosTecnicos dinamicamente… enfim, tou meio parado nisso, sem saber como resolver para ir adicionando em solicitacao esses contatosTecnicos que vou criando na mesma view.

Obrigado

14 Respostas

Lucas_Cavalcanti

para listas vc tem que usar indices:

solicitacao.contatos[0].nome=Joao
solicitacao.contatos[0].telefone=12345
solicitacao.contatos[1].nome=Jose
...
rafaelob

Entendi,

Então eu teria que ter uma variável “índice” na minha view, que ia guardar a quantidade de itens que eu já inseri, para colocá-los corretamente na lista, certo?

Lucas_Cavalcanti

isso, algo assim.

se vc está criando o form com um c:forEach vc pode usar a propriedade varStatus=“s” e usar ${s.index} como index

rafaelob

Bem, acho que não expliquei direito.

Eu vou ter um formulário, e nesse formulário eu vou ter um botão(Adiciona Contato técnico) que irá abrir um popup com um formulário para preenchimento dos dados do contato técnico, certo? e quando eu clicar em “ok” nesse formulário, eu queria que esse contato técnico fosse adicionado a lista de contatos de solicitação…

Não sei como eu poderia fazer isso dinamicamente, cada vez que eu ir adicionando um contato, ele adicionar na solicitação. Isso antes de submeter o form de solicitação.

ATt,

Lucas_Cavalcanti

você pode usar uma variável javascript para controlar esse índice

rafaelob

Bem,

Cheguei nessa tela do meu sistema e tou meio “parado”, não tenho muita experiência em desenvolvimento web, na verdade esse é o primeiro sistema que desenvolvo sozinho e por isso optei por utilizar o Vraptor, que têm se mostrado excelente.

Bem, como sou iniciante no assunto, gostaria de compartilhar com vocês que têm mais experiência e podem me ajudar, dando um direcionamento por que caminho devo ir.

O problema, como eu citei acima é que eu tenho uma tela no meu sistema é que um cadastrado de uma Solicitação de apoio a um evento.

Nessa tela de solicitação, vou ter os dados dela que vou usar a convenção do vraptor para preenchê-la

solicitacao.descricao
solicitacao.tipo


Porém, em uma solicitação eu tenho um ou mais agendamentos, logo em solicitação eu tenho solicitacao.agendamentos que é uma lista de agendamentos,ok?

É aí que estou perdido…

Eu estou pensando em criar um botão (adiciona agendamento) que irá abrir um popup modal, usando ajax, para que ele adicione as informações daquele agendamento. Minha dúvida é realmente como eu vou popular esses agendamentos, eu sei que o vraptor popula pelo índice (solicitacao.agendamentos[i] ) porém, isso me deixou confuso, no popup quando eu confirmar eu vou dar um submit e ir pra aplicação? como eu vou fazer com que ao adicionar um agendamento esteja disponível naquela tela, para quando eu submeter o formulário completo o vraptor possa preencher os parâmetros corretamente e colocar meus agendamentos que realizei? o vraptor pega pelos “name” dos atributos, certo? então para que ele pegasse todos agendamentos eu teria que ter todos os agendamentos na tela: solicitacao.agendamentos[0].data = xxxxx , solicitacao.agendamentos[1].data = xxxx??

Como podem ver, estou bastante confuso!

Bem, acho que eu consegui explicar a minha dúvida direito.

Antes de mais nada, já queria agradecer ao Lucas que sempre responde as dúvidas =)

Att,

Lucas_Cavalcanti

você pode no resultado desse popup adicionar um input (que pode ser hidden) com o nome solicitacao.agendamentos[].data e o valor correto…

daí os dados só são mandados quando você submete o formulário.

rafaelob

Hummm,

Se eu tiver uma div para exibir os agendamentos, eu poderia adicionar esse input nessa div usando ajax, pelo que eu entendi, e colocar um botão para remover esse agendamento também, Jquery me dá forma de fazer isso, certo?

O controle do índice seria uma variável javascript, que eu incrementaria toda vez que desse submit e decrementaria na hora que eu removesse?

Lucas_Cavalcanti

sim, dá pra fazer isso bem fácil com JQuery…
mas vc deve adicionar o input em um form, não em uma div

rafaelob

Então, pensando aqui poderia ser uma div dentro do form? essa div será dos agendamentos e é nela que eu vou inserindo as informações dos agendamentos à medida que vou inserindo… O Jquery precisa saber o id de onde ele vai inserir, certo? se eu passar o id só do form ele vai inserir os inputs no final?

Eu vi que posso utilizar index diferentes, não precisa ser na ordem, então nem preciso me preocupar na hora da exclusão.

Lucas_Cavalcanti

pode passar o id do form sim

rafaelob

Lucas,

Finalmente cheguei nessa tela, consegui fazer com JQuery para adicionar dentro de um form, uma tabela, com as linhas contendo os inputs. Utilizando o name nos inputs de acordo com a convenção do VRaptor: “soliciataoVideoconferencia.agendamentos[0].dataAgendamento” , certo? Só que não tá vindo populado o objeto:

Ele tá como um Set, não sei se a convenção do Vraptor é só para List<>

private Set<Agendamento> agendamentos = new HashSet<Agendamento>(0);

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="solicitacao")
    public Set<Agendamento> getAgendamentos() {
        return this.agendamentos;
    }
    
    public void setAgendamentos(Set agendamentos) {
         this.agendamentos = agendamentos;
    }


  //Input gerado dinamicamente pelo meu popup, insere numa div dentro do form


   <div class="ui-widget" id="agendamentos-contain">
        <h1>Agendamentos:</h1>

        <table class="ui-widget ui-widget-content" id="agendamentos">
            <thead>
                <tr class="ui-widget-header ">
                    <th>Data</th>
                    <th>Horario Inicio</th>
                    <th>Horario Fim</th>			
                    <th>Teste</th>
                    <th>Remover</th>
                </tr>

            </thead>
            <tbody>
            <tr id="agendamento0"><td> <input type="text" value="11/08/2011" readonly="readonly" size="10" name="solicitacaoVideoconferencia.agendamentos[0].dataAgendamento"> </td><td> <input type="text" value="22:22" readonly="readonly" size="5" name="solicitacaoVideoconferencia.agendamentos[0].horarioInicio"> </td><td> <input type="text" value="23:33" readonly="readonly" size="5" name="solicitacaoVideoconferencia.agendamentos[0].horarioFim"> </td><td><input type="checkbox" readonly="readonly" size="3" name="solicitacaoVideoconferencia.agendamentos[0].isTeste"> </td><td><input type="button" class="removeButton" onclick="removeAgendamento('agendamento0')" value="Remover"></td> </tr></tbody>
        </table>
    </div>

Quando eu submeto o form, ele pega todos os outros campos, mas não preenche esse Set.

Lucas_Cavalcanti

o VRaptor não consegue popular sets =(

principalmente pq não dá pra fazer set.get(0) pra populá-lo…

existe uma issue pra isso já cadastrada, mas ainda não foi implementada… se trocar pra list funciona

rafaelob

Mudei para List<> e funcionou, o Vraptor não trabalha com Set. Seria uma boa para novas versões.

Abraços!

Criado 19 de maio de 2011
Ultima resposta 11 de ago. de 2011
Respostas 14
Participantes 2