[RESOLVIDO]JSF + Datable + CheckBox

Bom tarde Galera.

Meu objetivo é ter uma tabela onde a primeira coluna é um checkbox.

E partir daí salvar no meu banco de dados apenas as linhas selecionadas.

Esta tabela é montada a partir de uma tabela do banco.

Eu consigo montar a tabela com o checkbox e as outras colunas.

Estou tendo problema em como vou salvar as linhas marcadas no checkbox.

Não preciso salvar a cada momento que é selecionado, o objetivo é selecionar todos e depois mandar salvar.

Agradeço a ajuda de todos.

Meu código da página está assim:

[code] <t:dataTable id=“lstParticipantes” var=“lstParticipantes” value="#{cadParticipanteBean.consulta}" styleClass=“tabela_cadastro” headerClass=“cabecalho” width=“780px”>

                 <t:column width="10%">
                    <center>
                       <f:facet name="header">
                          <h:outputText value="Selecionar"/>
                       </f:facet>
                       <h:selectBooleanCheckbox id="parti" value="#{lstParticipantes.selecionado}"/>
                    </center>
                 </t:column>

                 <t:column width="5%">
                    <center>
                       <f:facet name="header">
                          <h:outputText value="Código"/>
                       </f:facet>
                       <h:outputText value="#{lstParticipantes.idUsuario}"/>
                    </center>
                 </t:column>

                 <t:column width="30%">
                    <center>
                       <f:facet name="header">
                          <h:outputText value="Nome Completo"/>
                       </f:facet>
                    </center>
                    <h:outputText value="#{lstParticipantes.nomeCompleto}"/>
                 </t:column>

                 <t:column width="25%">
                    <center>
                       <f:facet name="header">
                          <h:outputText value="Cargo"/>
                       </f:facet>
                    </center>
                    <h:outputText value="#{lstParticipantes.dscCargo}"/>
                 </t:column>                     

                 <t:column width="25%">
                    <center>
                       <f:facet name="header">
                          <h:outputText value="E-mail"/>
                       </f:facet>
                    </center>
                    <h:outputText value="#{lstParticipantes.email}"/>
                 </t:column>

              </t:dataTable>[/code]

Como você está fazendo o acesso aos dados? Hibernate?

Já fiz muito isso e de várias formas.
Aparentemente pelo que você quer já está praticamente pronto, basta agora após clicar em algum botão submit, fazer um “for” na lista da tabela e verificar se o objeto foi selecionado, vci criou essa propriedade “lstParticipantes.selecionado”, basta chamar o lstParticipantes.isSelecionado() e verificar se true ou false.

Não estou usando Hibernate.
Via JDBC.

O meu método consulta retorna o List, só que este list é uma atributo da minha classe Bean.

Quando vou fazer o “for” este list está nulo.

Como vou fazer para “linkar” com o datatable, visto que depois de renderizado ele se torna uma tabela comum em HTML.

Obrigado pela ajuda.

Entendi o que você fez.

Você poderia fazer o seguinte, em vez de ligar a tabela no método consulta como está agora, ligar a tabela ao atributo list do seu bean, aí antes de carregar a tabela, no link que clicou pra ir pra essa tabela, ou seja como for, primeiro você chama o método consultar, e seta o resultado na propriedade list do seu bean, ou seja, quando a tabela for lá buscar já vai ter resultados.

Ou uma maneira não muito legal, você coloca o consulta dentro do método get da sua list, algo assim:


public List<MeuTipo> getLista(){
    lista = consulta():
    return lista;
}

Foram exemplo simples só para vc entender a coisa…

Quando eu fiz, eu preferi fazer tudo na mão e ter um controle maior, minha tabela era montada via código… colunas, labels… o binding era tudo no código, no html só ficava uma linha pra fazer o binding, mas vai da necessidade.

[]'s Hewerton Crisóstomo

Eu tenho que fazer um binding do datatable com o list do meu bean???

Desculpe se algumas dúvidas são óbvias demais… pq sou novato em JSF.

Pq tente fazer um bindinga da tabela com o meu List e deu erro.

[quote=w1l14n]Eu tenho que fazer um binding do datatable com o list do meu bean???

Desculpe se algumas dúvidas são óbvias demais… pq sou novato em JSF.

Pq tente fazer um bindinga da tabela com o meu List e deu erro.[/quote]

Você pode fazer assim:

<t:dataTable id="lstParticipantes" var="lstParticipantes" value="#{cadParticipanteBean.lista}"

No seu atributo “lista” no bean cadParticipanteBean coloque get/set…

Como eu disse acima, se você não colocar o retorno dos valores no get (preferível nunca colocar no get), você precisar fazer um set nesse atributo antes da lista ir buscar, senão ela busca e não tem nada e a lista vai ficar em branco.

Só lembrando esse seu “lista” é um atributo do tipo ListDataModel pra você ligar no value.

Só uma dúvida.

Devo trabalhar com Bean do tipo request ou session?

[quote=w1l14n]Só uma dúvida.

Devo trabalhar com Bean do tipo request ou session?[/quote]

Aí depende da necessidade, mas evite ao máximo usar session, use apenas quando necessário e não por comodidade. As session pesa a aplicação.

Olha só, imagine que tenha um bean com atributo usuário que você precisa de fato estar na sessão, mas nesse bean você tem também lista, objetos do seu negócio, e mais atributos… se você colocar esse bean na sessão, tudo, tudo que está nele vai junto, as listas, objetos de negócio e tudo mais, sendo que você só precisava do atributo usuário.

O que você pode fazer nesse caso, você pode criar um bean UsuarioBean, e nele você coloca o atributo usuário que realmente precisa na sessão, e coloca este bean como session.

E cria outro bean, o qual tem as listas, objetos de negócios e etc, e coloque como scope request, e dentro deste bean você coloca uma propriedade sendo o seu UsuarioBean, e atribua ele no faces como atributo.

Concluindo, você tem um bean de sessão dentro de um bean de request, dessa forma você resolve seu problema e não coloca “lixo” na sessão, evitando assim uma perda de performance e que fácil, fácil vira uma bola de neve.

Demonstrando a idéia acima, em vez disso:

 // scope session
 public class MeuBeanController{
       private Usuario usuario;
       private List lista;
       private Object objetoQualquer;
       private Pessoa pessoa;
       private GUJ guj;
       private Qualquer qualquer; 
}

faça isso:

//scope session
public class UsuarioBean{
      // get/set
      private Usuario usuario; 
}

e // scope request public class MeuBeanController{ // coloque seu bean de session como atributo do bean de request private UsuarioBean usuarioBean; private List lista; private Object objetoQualquer; private Pessoa pessoa; private GUJ guj; private Qualquer qualquer; }

E depois colocar no faces o UsuarioBean como propriedade do MeuBeanController.

[]'s Hewerton Crisóstomo

Javabuntu valeu ajuda.

Funcionou direitinho aqui.