Pegar o valor de uma coluna do dataTable

Olá Pessoal,

Estou com uma dúvida na utilização do dataTable. Tenho uma consulta que retorna seues valores no datatable, as linhas que ela retorna são links para quando eu clicar caregar os dados no formulário de cadastro, porém não estou conseguindo pegar o valor da coluna que fica o id para preencher os campos e meu formulário aparecer carregar, como poderia fazer isto?
resumindo preciso pegar o valor de uma coluna, execuar uma consulta e preencher um fórmulário?

Agradeço desde já a ajuda de todos.

Estou com este mesmo problema pegar o valor de inputext em dataTable.

Você está se referindo a uma tag do JavaServer Faces, não é?

Por que se for, prepare-se que a solução é cascuda!

Primeiro, faça um binding no dataTable, ou seja, faça com que o componente seja gerenciável através de um ManagedBean. Assim:

<h:dataTable binding="#{tableData.component}" value="#{tableData.names}" var="name">
...
</h:dataTable>

Essa propriedade ‘component’ será definida no seu managed bean assim:

import javax.faces.component.*;

public class TableData {

    private UIData component = null;
    // outros atributos

    public UIData getComponent() {
        return component;
    }

    public void setComponent(UIData component) {
        this.component = component;
    }

    // outros métodos
}

Agora, quando renderizar o dataTable, o Faces vai olhar a propriedade component pra ver se retorna algum componente, na primeira vez retorna null, então ele vai criar um UIData (na verdade um filho deste) e setar na propriedade component. Se o managed bean for de sessão, nas próximas vezes, como o get não retorna null, será usado este mesmo componente sem criar um novo.

Bom, com o managed bean tendo acesso ao componente, basta pegar o valor do cabeçalho da coluna lembrando que: os filhos de UIData são UIColumn, e cada UIColumn pode ter um header representado por UIOutput. Veja como eu pego os nomes de coluna abaixo:

    public String getColumnNames() {
        // pego os filhos do componente dataTable, são todos UIColumn,
        // mas o método retorna UIComponent
        List<UIComponent> children = component.getChildren();
        StringBuilder buffer = new StringBuilder();
        
        // itero sobre a lista de componentes, filhos de tableData
        for (UIComponent child : children) {
            // cast para UIColumn
            UIColumn column = (UIColumn) child;
            
            // pego o header do column, e converto para UIOutput
            UIOutput outputHeader = (UIOutput) column.getHeader();
            
            // chamo o getvalue() do outputHeader para obter seu valor
            buffer.append(outputHeader.getValue()).append(',');
        }
        return buffer.toString();
    }

Era isso a sua dúvida?

No meu caso com inputtext resolveria??
Vou testar.

Leonardo,

Para ser sincero não consegui entender direito! mas olha só o que já fiz:

Abaixo segue meu dataTable:

                        <h:dataTable id="grdPerfil" value="#{objTabela.perfis}" var="objPerfil">                                 
                            <h:column>                                       
                                <f:facet name="header">
                                   <h:outputText value="Código"/>
                                </f:facet>
                                                                        
                                <h:outputLink value="frmCadPerfil.faces">
                                   <h:outputText value="#{objPerfil.perCodigo}"/>                                                                               
                                </h:outputLink>                                                                          
                            </h:column>                                                                
                            <h:column>
                                <f:facet name="header">
                                   <h:outputText value="Descrição"/>
                                </f:facet>                                    
                                <h:outputLink value="frmCadPerfil.faces">
                                   <h:outputText value="#{objPerfil.perNome}"/>
                                </h:outputLink>
                            </h:column>                                                                              
                            <h:column>
                                <f:facet name="header">
                                   <h:outputText value="Alterar"/>
                                </f:facet>                                    
                                <h:commandButton value="Alterar" action="#{objPerfil.retornaPerfil}">                                    
                                    <f:param name="codigo" value="#{objPerfil.perCodigo}"/>                                       
                                </h:commandButton>
                            </h:column>                                
                        </h:dataTable>

E em seguida segue a classe que utilizo para preencher o dataTable:

public class GOtabela {

private int vCodigo;

public GOtabela() {
}

public int getCodigo() {
    return vCodigo;
}

public void setCodigo(int vCodigo) {
    this.vCodigo = vCodigo;
}



public VOperfil[] getPerfis(){
    
   BOperfil objPerfil = new BOperfil(); 
   GOconexao objConexao = new GOconexao();
   ResultSet rsPerfil;
   VOperfil vPerfis[];
   int i = 0;       
   try{
       rsPerfil = objPerfil.conPerfil(vCodigo);
       vPerfis = new VOperfil[objConexao.getNumeroLinhas(rsPerfil)];
       rsPerfil.beforeFirst();
       while(rsPerfil.next()){
             vPerfis[i] = new VOperfil(rsPerfil.getInt("PerCodigo"), rsPerfil.getString("PerNome"));
             //vPerfis[i] = new VOperfil{new VOperfil(rsPerfil.getInt("PerCodigo"),rsPerfil.getString("PerNome"))};
             i++;
       }              
       return vPerfis;
   }catch (Exception ex){
      return vPerfis = null;   
   }
}

Com esse dataTable já preenchdi, minhas linhas são um link, que ao clicar ele deverá carregar a tela de cadastro com os dados! o que não estou conseguindo é pegar o id desta tabela, que aparece nesta tabela e fazer a consulta na outra tela para o formulário aparecer preenchdi…

Ah só uma última coisa que esqueci, tentei pelo link, mas se vcs perceberem tem um botão alterar na última coluna, se conseguir fazer funcionar por este também é válido.

Vixi! Então é mais fácil do que pensei! Você havia falado em uma solução pra pegar a coluna, mas na realidade você quer pegar a LINHA!
Bom, primeiro esquece o que eu falei antes.
Segundo, troque o retorno de um array simples para um DataModel do pacote javax.faces.model, ficando assim:

public DataModel getPerfis() {
    // seu código
}

DataModel é uma classe base, você usa uma de suas classes filhas. Uma das implementações interessantes para o seu caso é ResultSetDataModel que encapsula um ResultSet de java.sql, ficando mais ou menos assim:

private DataModel model;

public DataModel getPerfis() {
    ResultSet rsPerfil =  // obtenha o ResultSet da maneira que você quiser
    model = new ResultSetDataModel(rsPerfil);

    return model;
}

Bom, e daí? Qual a diferença em utilizar o DataModel? A diferença é que o DataModel guarda o valor da linha que o usuário selecionou! Então você pode criar uma ação (no mesmo Managed Bean em que está o model) para exibir os dados individuais, por exemplo:

private VOperfil currentPerfil = null;

public String exibirPerfil() {
    if (model == null) {
        return "no data";
    }
    currentPerfil = (VOperfil) model.getRowData();
    return "exibir";
}

Aí, na nova tela onde exibe os dados (configurado em faces-config.xml para o resultado da ação “exibir”), basta você pegar a propriedade currentPerfil desse mesmo ManagedBean.

Certo?

Ah sim! Não é outputLink que você usa, é commandLink. Funciona igualzinho ao commandButton, basta trocar o nome e deixa as propriedades das tags como está.

Leonardo,

Consegui preencher meu dataTable com o DataModel, exelente, economizei pelo menos umas 10 linhas de código. Show de bola.

Porém estou com uma dúvida no último item, vou chamar onde este “exibir dados” ?

pois a nova página, é um formulário e preciso, preencher cada dado no campo correto.

Leonardo,

Para ficar mais fácil segue o código que criei, retirei a classe GO tabela, e agora tenho apenas a classe VOperfil:

public class VOperfil {
private int vPerCodigo;
private String vPerNome;
private DataModel vModel;

public VOperfil() {
}    
public VOperfil(int pPerCodigo, String pPerNome) {
    this.vPerCodigo = pPerCodigo;
    this.vPerNome   = pPerNome;
}

public void setPerCodigo(int vPerCodigo) {
    this.vPerCodigo = vPerCodigo;
}

public int getPerCodigo() {
    return vPerCodigo;
}

public String getPerNome() {
    return vPerNome;
}

public void setPerNome(String vPerNome) {
    this.vPerNome = vPerNome;
}

public DataModel getPerfis(){        
   BOperfil objPerfil = new BOperfil(); 
   ResultSet rsPerfil;     
   try{
       rsPerfil = objPerfil.conPerfil(vPerCodigo);
       vModel = new ResultSetDataModel(rsPerfil);
       return vModel;
   }catch (Exception ex){
      return vModel = null;   
   }
}

public String retornaPerfil(){
    if(vModel != null){
       VOperfil objPerfil;
       try{
          objPerfil = (VOperfil) vModel.getRowData();
          return "carregar";           
       }catch(Exception ex){
          return "recarregar";               
       }
    }
    else{
       return "recarregar";               
    }            
}    

public String inserirPerfil(){
    
    BOperfil objPerfil = new BOperfil();
    if(objPerfil.setPerfil(vPerCodigo,
                           vPerNome)){
        return "sucesso";
    }
    else
    {
        return "erro";            
    }
}    

}

Abaixo segue a tela de consulta que criei, note que colokei o commandLink apenas na primeira coluna para realizar o teste, e nesta tela quando clico na linha link, ocorre o seguinte erro javax.faces.el.MethodNotFoundException: retornaPerfil: javax.faces.model.ResultSetDataModel$ResultSetMap.retornaPerfil().

abaixo a tela:

<%@page contentType=“text/html”%>
<%@page pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f” %>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h” %>

Consulta Perfil

Consulta Perfil

 
Código/Descrição: Novo
</body>

E abaixo segue a tela que preciso carregar:

<%@page contentType=“text/html”%>
<%@page pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f” %>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h” %>

Perfil

Perfil

 
Código:
Perfil:
</body>

Leonardo,

Acho que não posso fazer, o método retorna perfil e getsPerfis nesta classe correto?

devo criar uma nova classe e criar esses métodos nessa nova classe né?