Pegar Dado Selecionado DataTable Primefaces

14 respostas
R

Pessoal,

já tenho 2 dias tentando resolver isso e não consigo, quero criar uma opção onde se faz uma busca dos alunos, seleciona o desejado e depois eu insiro ele em uma tabela. Mas eu já fiz diversas pesquisas e alterações e nunca consigo obter o objeto que foi selecionado, seguem os meus códigos, quem puder me dar uma luz vou agradecer muito.

package aprender.bean;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
/**
 *
 * @author raniere.sousa
 */
@ManagedBean
@RequestScoped
public class AlunoBean {
    private String matricula;
    private String nome;
    private String turma;
    private String sede;
    private String foto;
    private String auto;    /** Creates a new instance of AlunoBean */

    public AlunoBean()
    {
    }

    public AlunoBean(String wmatricula,String wnome,String wturma,String wsede,String wfoto,String wauto)
    {
        this.matricula = wmatricula;
        this.nome = wnome;
        this.turma = wturma;
        this.sede = wsede;
        this.foto = wfoto;
        this.auto = wauto;
    }

    /**
     * @return the matricula
     */
    public String getMatricula() {
        return matricula;
    }

    /**
     * @param matricula the matricula to set
     */
    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the turma
     */
    public String getTurma() {
        return turma;
    }

    /**
     * @param turma the turma to set
     */
    public void setTurma(String turma) {
        this.turma = turma;
    }

    /**
     * @return the sede
     */
    public String getSede() {
        return sede;
    }

    /**
     * @param sede the sede to set
     */
    public void setSede(String sede) {
        this.sede = sede;
    }

    /**
     * @return the foto
     */
    public String getFoto() {
        return foto;
    }

    /**
     * @param foto the foto to set
     */
    public void setFoto(String foto) {
        this.foto = foto;
    }

    /**
     * @return the auto
     */
    public String getAuto() {
        return auto;
    }

    /**
     * @param auto the auto to set
     */
    public void setAuto(String auto) {
        this.auto = auto;
    }


}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package aprender.bean;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import java.util.ArrayList;
import aprender.bean.AlunoBean;
import java.sql.*;
import aprender.util.AcessoBanco;
import javax.faces.context.FacesContext;
import javax.faces.application.FacesMessage;


/**
 *
 * @author raniere.sousa
 */
@ManagedBean
@RequestScoped
public class PesquisaAluno {
    private ArrayList ListadeAlunos = new ArrayList<AlunoBean>();
    private ArrayList ListadeAlunosSel = new ArrayList<AlunoBean>();
    private AlunoBean alunoaux;
    private AlunoBean alunosel;
    private AcessoBanco acesso;
    private String nomebuscar;
    private boolean mostratabela = false;
    /** Creates a new instance of PesquisaAluno */
    public PesquisaAluno() {

    }

    public void BuscaAlunos() {
        try
            {
                ListadeAlunos.clear();
                acesso = new AcessoBanco();
                ResultSet rs = acesso.Executar("SELECT * FROM VW_ALUNOS_PESQUISA WHERE NOME LIKE '%"+nomebuscar+"%'");
                while (rs.next())
                {
                    setAlunoaux(new AlunoBean(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6)));
                    ListadeAlunos.add(getAlunoaux());
                }
                this.setMostratabela(true);
            }
            catch (Exception e)
            {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro de conexão ao Banco", e.toString()));
            }

    }

    /**
     * @return the ListadeAlunos
     */
    public ArrayList getListadeAlunos() {
        return ListadeAlunos;
    }

    /**
     * @return the nomebuscar
     */
    public String getNomebuscar() {
        return nomebuscar;
    }

    /**
     * @param nomebuscar the nomebuscar to set
     */
    public void setNomebuscar(String nomebuscar) {
        this.nomebuscar = nomebuscar;
    }

    /**
     * @return the mostratabela
     */
    public boolean isMostratabela() {
        return mostratabela;
    }

    /**
     * @param mostratabela the mostratabela to set
     */
    public void setMostratabela(boolean mostratabela) {
        this.mostratabela = mostratabela;
    }

    /**
     * @return the ListadeAlunosSel
     */
    public ArrayList getListadeAlunosSel() {
        return ListadeAlunosSel;
    }

    public void AdicionaAlunoSel()
    {
        ListadeAlunosSel.add(getAlunosel());
        alunoaux = new AlunoBean("0000","Raniere","0","0","0","0");
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro de conexão ao Banco", "teste"+ListadeAlunosSel.size()+alunoaux.getNome()));
    }

    /**
     * @return the alunoaux
     */
    public AlunoBean getAlunoaux() {
        return alunoaux;
    }

    /**
     * @param alunoaux the alunoaux to set
     */
    public void setAlunoaux(AlunoBean alunoaux) {
        this.alunoaux = alunoaux;
    }

    /**
     * @return the alunosel
     */
    public AlunoBean getAlunosel() {
        return alunosel;
    }

    /**
     * @param alunosel the alunosel to set
     */
    public void setAlunosel(AlunoBean alunosel) {
        this.alunosel = alunosel;
    }
}
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        Hello from Facelets
        <h:form id="form" >
                        <h:panelGrid columns="4" style="margin-bottom:10px; font-size:12px ">
                            <h:outputLabel for="editbusca" value="Nome:" style=" font-weight: bold" />
                            <p:inputText id="editbusca" value="#{pesquisaAluno.nomebuscar}" />
                            <p:commandButton value="Buscar" update="tabalunos" action="#{pesquisaAluno.BuscaAlunos}" />

                        <p:ajaxStatus style="width:16px;height:16px;">
                            <f:facet name="start">
                                <h:graphicImage value="ajaxloader.gif" />
                            </f:facet>
                            <f:facet name="complete">
                                <h:outputText value="" />
                            </f:facet>
                        </p:ajaxStatus>

                        </h:panelGrid>
                        <h:panelGrid id="tabalunos">
                            <p:messages id="msgs" showDetail="true"/>

                            <p:dataTable id="tablepesq" var="alunoBean" value="#{pesquisaAluno.listadeAlunos}" selection="#{pesquisaAluno.alunosel}" selectionMode="single"
                                         style="font-size:10px " rendered="#{pesquisaAluno.mostratabela}" paginator="true" rows="10"   >
                                <p:column>
                                    <f:facet name="header" >
                                        Matrícula
                                    </f:facet>
                                    <h:outputText value="#{alunoBean.matricula}" />
                                </p:column>

                                <p:column>
                                    <f:facet name="header">
                                        Nome
                                    </f:facet>
                                    <h:outputText value="#{alunoBean.nome}" />
                                </p:column>

                                <p:column>
                                    <f:facet name="header">
                                        Série
                                    </f:facet>
                                    <h:outputText value="#{alunoBean.turma}" />
                                </p:column>
                                <p:column>
                                    <f:facet name="header">
                                        Sede
                                    </f:facet>
                                    <h:outputText value="#{alunoBean.sede}" />
                                </p:column>
                                <p:column>
                                    <f:facet name="header">
                                        Possui Foto
                                    </f:facet>
                                    <h:outputText value="#{alunoBean.foto}" />
                                </p:column>
                                <p:column>
                                    <f:facet name="header">
                                        Autorizado
                                    </f:facet>
                                    <h:outputText value="#{alunoBean.auto}" />
                                </p:column>

                            </p:dataTable>

                        </h:panelGrid>
                        <p:commandButton value="Submit" update=":display" action="#{pesquisaAluno.AdicionaAlunoSel}" oncomplete="dlg.hide();"/>
                        <p:commandButton value="Testar" update="form:pnteste" oncomplete="DialogoRan.show()" >
                        </p:commandButton>

                        <p:dialog header="Testando cara" widgetVar="DialogoRan">
                        <h:panelGrid id="pnteste" >
                            <p:messages id="msgtst" showDetail="true"/>
                            <h:outputText value="Nome do Aluno" />
                            <h:outputText value="#{pesquisaAluno.alunosel.nome}" />
                        </h:panelGrid>
                        </p:dialog>
                    </h:form>

    </h:body>
</html>

Não sei o que acontece mas o Ajax da paginação também não funciona.

Grato pela ajuda.

14 Respostas

E

Como você deseja recuperar o objeto selecionado, na hora em que clicar em algum lugar?

R

Na verdade, nesse momento eu estava fazendo um teste, de quando clicar no botão “Testar”, ele exibir o nome do aluno selecionado no dialog. Mas só exieb o título que coloquei no dialog, o nome do aluno fica em branco.

E

Faça o seguinte, dentro do p:dataTable coloque um link que, ao clicar, é setado um objeto através da tag f:setPropertyActionListener. Se não entender, vou te dar um exemplo aqui:

&lt;a4j:commandLink ajaxSingle="true" value="#{alunoBean.nome}" oncomplete="modalAluno.show();" reRender="modalAluno"&gt;
    &lt;f:setPropertyActionListener value="#{alunoBean}" target="#{pesquisaAluno.alunoaux}"/&gt;
&lt;/a4j:commandLink&gt;

Vai ficar mais ou menos desse jeito a passagem do aluno para a classe.
Por favor, responda se deu certo depois.

R

esdmorais,

eu nunca usei o a4j, como declaro ele no meu xhtml? Eu tentei fazer isso:
xmlns:a4j=“https://ajax4jsf.dev.java.net/ajax

mas o netbeans fica informando que não reconhece.

Valeu pela ajuda!

E

ranieriviana:
esdmorais,

eu nunca usei o a4j, como declaro ele no meu xhtml? Eu tentei fazer isso:
xmlns:a4j=“https://ajax4jsf.dev.java.net/ajax

mas o netbeans fica informando que não reconhece.

Valeu pela ajuda!

É desse jeito mesmo, mas você precisa ter os jars do RichFaces também!
Você pode baixar ele aqui: http://www.jboss.org/richfaces
É de graça, a única coisa que você paga para ter (e se quiser) é a documentação, se não me engano custa + ou - US$ 2

P

esdmorais:
Faça o seguinte, dentro do p:dataTable coloque um link que, ao clicar, é setado um objeto através da tag f:setPropertyActionListener. Se não entender, vou te dar um exemplo aqui:

&lt;a4j:commandLink ajaxSingle="true" value="#{alunoBean.nome}" oncomplete="modalAluno.show();" reRender="modalAluno"&gt;
    &lt;f:setPropertyActionListener value="#{alunoBean}" target="#{pesquisaAluno.alunoaux}"/&gt;
&lt;/a4j:commandLink&gt;

isso é igual usar o

&lt;p:commandLink value="#{alunoBean.nome}" oncomplete="modalAluno.show()" update="modalAluno"/&gt;
E

Pode ser também!
Eu não uso muito as coisas do PrimeFaces porque elas costumam sempre dar algum problema em outro componente aqui =/

P

o que vc quer fazer é isso aqui neh ?

http://www.primefaces.org/showcase/ui/datatableRowSelectionSingle.jsf

R

Exatamente isso! Meu netbeans aqui deu pau por isso ainda não testei a sugestão de vcs. Mas eu vi uma difierença, não sei se é isso, mas no exemplo do primefaces a classe car não é bean e é serializable, será que isso influencia?

P

é um bean seralizado, eu uso em todos os meu beans ou seja:

@ManagedBean  
@RequestScoped  
public class PesquisaAluno implements java.io.Serializable {  
}

O problema pode ser o scopo tenta usar o ViewScoped antes de tudo

R

Polverini,

cara desculpe a ignorância, mas como eu uso o ViewScoped? Onde eu devo colocar?

Valeu pela ajuda.

P

Coloca no bean, assim:

@ManagedBean    
@ViewScoped   // <-Aqui muda
public class PesquisaAluno implements java.io.Serializable {    
}

Pesquise sobre o ciclo de vida do jsf para mais informações de escopo

R

Polverini,

cara, SHOOOOOOOWWWWWWWWW!!!

Funcionou! Conseguiu exibir!

Man não tenho palavras para agradecer, valeu mesmo pela força!

E Obrigadão a esdmorais também que teve a boa vontade de ajudar, valeu pela força!!!

Abraço.

G

Galera, vou aproveitar para tirar uma dúvida, Sou iniciante no JSF com prime faces…

Tenho uma tabela e gostaria de ter um botao nesta tabela que quando o usuario clicar neste botão ele seta um cliente no meu bean… só isso!

<p:dataTable id="tbCliente" var="cli" value="#{ordemServicoBean.listaCliente}" emptyMessage="Nenhum registro encontrado." paginator="true" rows="10"> <f:facet name="header" > Clientes </f:facet> <p:column headerText="Nome"> <h:outputText value="#{cli.nome}" /> </p:column> <p:column style="width:30px; text-align: center"> <h:commandLink title="Selecionar" actionListener="#{ordemServicoBean.selecionaCliente(cli)}" oncomplete="dlgBuscaCliente.hide()" update=":formPrincipal:campoFiltro"> <p:graphicImage value="tema/icons/ok.png" /> </h:commandLink> </p:column>

Se coloco o Bean dessa tela como ViewScoped funciona que é uma beleza! Mas queria trabalhar com @RequestScoped e ai é o problema!
Se o bean ta request parece que eu perco a referencia dos “objetos” da tabela"…
Quando coloco como request ele mata a arvore de componentes que estao na tela? é isso? já li bastante sobre os escopos mas não sei se entendi bem essa nova maneira de pensar!

Criado 14 de junho de 2011
Ultima resposta 18 de jun. de 2012
Respostas 14
Participantes 4