É possível editar os dados de uma Collection no JSF?[Resolvido]

Pessoal, bom dia!

Gostaria de saber se alguém já fez isso que eu desejo:

1-Apresentar uma coleção de VOs com a tag <h:dataTable>;
2-Permitir que as propriedades desse VO sejam modificadas;
3-Persistir no BD essas alterações;

Muito Obrigado.

O meu dilema consiste no seguinte, tenho uma coleção de VOs na memória, se eu conseguir alterar as propriedades dos VOs que eu quiser, persistir no BD é o de menos…

Mas como eu consigo fazer isso?

Estou estudando uma outra alternativa para isso:

Vou ter que mandar uma requisição ajax de campos do tipo text dentro da tag <h:dataTable>, ou seja, terei que mostar uma lista com n usuários, em seguida vou abrir para a edição do admin, assim que ele clicar em salvar, os campos pertinentes ao usuário alterado devem ser submitados com as devidas alterações.

Nessa segunda hipótese, alguém já tem experiência?

Para a minha alternativa funcionar, eu preciso que as <tr> geradas pela <h:dataTable> recebam um id.

Tentei acrescentar um id a tag <h:column> mas não funcionou (pelo menos ao exibir o código-fonte da página não havia nenhum id nas <tr> )…

Como resolvo isso?

Olá,

O que você precisa fazer é bem simples: exibindo os valores em um InputText (dentro da célula da DataTable) o Faces se encarregará de fazer update no bean no momento do submit.

Me desculpe, mas no meu caso isso não ocorre, estou utilizando ajax4jsf, será que há interferência?

[quote=gomesrod]Olá,

O que você precisa fazer é bem simples: exibindo os valores em um InputText (dentro da célula da DataTable) o Faces se encarregará de fazer update no bean no momento do submit.[/quote]

No meu caso, como faço para que o framework do ajax4jsf interaja com o JSF de modo que as informações da lista sejam atualizadas com as entradas dos campos <t:inputText>, acho que esse é o X da questão?!?!?!?!?

bom, primeiro você tem que saber que os VOs não são objetos de inserior no banco de dados

ou seja, provavelmente você CRIA os VOs após você carregar as entidades do banco de dados certo?

a primeira ccoisa que você tem que fazer é algo do tipo, converter um VO em Entidade (por alguma action sei lá) e após isso dar um merge/update no banco de dados

por exemplo, você tem uma classe (Pessoa.java) com uma PORRADA DE dados, mas como você só quer alterar o nome e o sobrenome dela, então colocarias no teu VOs 3 propriedades: ID da pessoa, nome e sobrenome (certo?)

no teu backing bean:

[code]private List pessoasVO = new ArrayList();

public String carregarListaPessoa() {
List pessoas = pessoaDAO.carregarPessoas();
for( Pessoa pessoa : pessoas ) {
PessoaVO pessoaVO = new PessoaVO( pessoa.getID(), pessoa.getNome(), pessoa.getSobrenome() );
pessoasVO.add( pessoaVO );
}
return “success”;
}
// Getters e Setters
[/code]

daí na página

<h:dataTable var="vo" value="#{meuBean.pessoasVO}"> <h:column> <f:facet name="header"> <h:outputText value="ID" /> </f:facet> <h:outputText value="#{vo.id}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Nome" /> </f:facet> <h:intputText value="#{vo.id}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Sobrenome" /> </f:facet> <h:outputText value="#{vo.sobrenome}" /> </h:column> </h:dataTable>

agora não preciso mais continuar, senão vai ficar muito mamão com açúcar rsrs

minhas dicas:

  • criar um botão que chama uma action no backing bean
  • de acordo com cada Pessoa, carregue ela pelo ID que tem no VO, altere as propriedades nome e sobrenome e, com essa entidade carregada, façac um update

simples assim :slight_smile:

Fiz praticamente tudo o que você falou, mas o que realmente não consigo fazer, é no submit assíncrono do form, refletir o que foi digitado no backing bean.

Veja o modo como estou fazendo:

//esse componente é atualizado por uma chamada assícrona
&lt;t:dataTable width="100%" value="#{controleUsuarioBean.listUsuario}" var="users" forceId="true" id="listaUsuarios" styleClass="tbl_cont2" headerClass="tr1"&gt;
       //Ao exibir o código-fonte, esse id não é mostrado
	&lt;t:column id="perfilColumn"&gt;
		&lt;f:facet name="header"&gt;
			&lt;h:outputText value="Perfil" /&gt;
		&lt;/f:facet&gt;
		&lt;h:inputText id="cdPerfil" value="#{users.cdPerfil}" maxlength="1" readonly="true" style="width: 15px;" styleClass="input_usuario" title="Para editar, clique aqui." onclick="activeObject(this)" /&gt;
	&lt;/t:column&gt;
       &lt;t:column id="saveColumn"&gt;
	    &lt;f:facet name="header"&gt;
		&lt;h:outputText value="Salvar" /&gt;
	    &lt;/f:facet&gt;
	   &lt;h:graphicImage value="#{customMsg.save_image}" style="cursor: pointer;" title="Salvar Alterações"&gt;
		&lt;a4j:support ignoreDupResponses="true" immediate="false" action="#{controleUsuarioBean.salvar}" event="onclick" onsubmit="getValuesOfTable();"&gt;
		&lt;/a4j:support&gt;
	   &lt;/h:graphicImage&gt;
         &lt;/t:column&gt;
&lt;/t:dataTable&gt;

Ainda estou preso nesse ponto… :frowning: