JSF - Componente Table - Exibir na célula valor vindo de um método

11 respostas
venomtotal

Bom, pessoal, to usando o netbeans 6.1 e a duvida é um detalhe do componente table.

Simplificando a duvida.

Tenho uma tabela “Func” do mysql com os campos
matricula
Nome

idCargo //é o id de outra tabela: “Cargo”

Acesso a tabela usando o padrao DAO e tenho uma classe que me retorna um arraylist dos registros da tabela “Func”

Através deste ArrayList, fiz um dataprovider para preencher a tabela

Tá tudo funcionando bem, porém o problema é a exibicao dos dados:

01 |Joao |1
02 |Jose |1
03 |Maria |1

Eu queria que exibisse o nome do cargo

01 |Joao |Aux Adm
02 |Jose |Aux Adm
03 |Maria |Secretaria

Resumindo a duvida:
Criei um metodo String getCargo(int idCargo) que tretorna o nome do cargo do banco de dados, mas como utilizar este metodo no componente Table?
Já cliquei com o botão direito no componente, cliquei na opção Layout, criei uma nova coluna, e tentei digitar metodo no campo “Value Expression” sem sucesso…

Agradeço qualquer ajuda.

11 Respostas

RaulCarlin

Faz o seguinte, crie um método que nao receba nada como parâmetro, que retorne somente o nome do cargo baseado no int que já existe neste Bean, assim, no seu value você coloca a EL apontando pra esse método…

venomtotal

Não entendi a ultima parte: “no seu value você coloca a EL apontando pra esse método…”

Supondo que criei o metodo String getCargo()

Como deveria chanálo através o campo “Value Expression” ?

RaulCarlin

EL = Expression Langague

EL = #{seuBean.metodo}

Ficaria no seu código value="#{seuBean.getCargo}"

Via IDE não sei…

gigicantador
Se você tem
public class Cargo{
Integer id;
String nome;
}

public class Funcionario{
Integer id;
String nome;
Cargo cargo;
}

Acesse na dataTable com

funcionario.cargo.nome

venomtotal

vou tentar e depois posto no que deu

venomtotal

Ae povo, peço ajuda novamente, pois ja fiquei mais de meia hora tentando de todas as maneiras sem sucesso :frowning:

O que eu fiz:

-Criei um novo projeto Visual JSF chamado “testando”

-No unico pacote que tem, criei um bean chanado Pessoa

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

package testando;

/**
 *
 * @author caninha
 */
public class Pessoa {
    
    private String nome = "Teste";
    
    Pessoa(){
        
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

}
-Na Page1.jsp, arrastei um componente Table

-Botao direito, escolhi “Table Layout”

-Em uma coluna testei este Value Expression:

#{Pessoa.nome}

-E na outra neste

#{Pessoa.getNome}

executei o projeto, e a tabela apareceu com as colunas vazias

o que pode estar errado?

gigicantador

Você usou com itens?

p.ex

<h:dataTable var="item" value="#PessoaBB.colecaoPessoas">		
			<h:column>
				<f:facet name="header"><h:outputText value="nome"/></f:facet>
				<h:outputText value="#{item.nome}"></h:outputText>
			</h:column>
		</h:dataTable>
venomtotal
gigicantador:
Você usou com itens?

p.ex

<h:dataTable var="item" value="#PessoaBB.colecaoPessoas">		
			<h:column>
				<f:facet name="header"><h:outputText value="nome"/></f:facet>
				<h:outputText value="#{item.nome}"></h:outputText>
			</h:column>
		</h:dataTable>
nao nao usei... tava tentando resolver tudo visualmente sem editar o codigo jsp. Vou fazer uma tentativa e mais tarde eu posto, mas to estranhando... estamos falando do mesmo componente, pois no seu codigo aparece datatable e no meu:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 
    Document   : Page1
    Created on : 25/06/2008, 00:24:36
    Author     : caninha
-->
<jsp:root version="2.1" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:webuijsf="http://www.sun.com/webui/webuijsf">
    <jsp:directive.page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"/>
    <f:view>
        <webuijsf:page id="page1">
            <webuijsf:html id="html1">
                <webuijsf:head id="head1">
                    <webuijsf:link id="link1" url="/resources/stylesheet.css"/>
                </webuijsf:head>
                <webuijsf:body id="body1" style="-rave-layout: grid">
                    <webuijsf:form id="form1">
                        <webuijsf:table augmentTitle="false" id="table1" style="position: absolute; left: 360px; top: 144px" title="Table" width="300">
                            <webuijsf:tableRowGroup id="tableRowGroup1" rows="10" sourceData="#{Page1.defaultTableDataProvider}" sourceVar="currentRow">
                                <webuijsf:tableColumn headerText="column1" id="tableColumn4">
                                    <webuijsf:staticText id="staticText4" text="#{Pessoa.nome}"/>
                                </webuijsf:tableColumn>
                                <webuijsf:tableColumn headerText="column2" id="tableColumn2">
                                    <webuijsf:staticText id="staticText2" text="#{Pessoa.getNome}"/>
                                </webuijsf:tableColumn>
                                <webuijsf:tableColumn headerText="column3" id="tableColumn3" sort="column3">
                                    <webuijsf:staticText id="staticText3" text="#{currentRow.value['column3']}"/>
                                </webuijsf:tableColumn>
                            </webuijsf:tableRowGroup>
                        </webuijsf:table>
                    </webuijsf:form>
                </webuijsf:body>
            </webuijsf:html>
        </webuijsf:page>
    </f:view>
</jsp:root>
gigicantador

Não, não estamos falando da mesma coisa.:wink:
Eu estou falando do uso da JSF da sun, e você esta usando a biblioteca do visual web pages do netbeans (que eu não conheço, para falar a verdade)
Mas vendo o seu código posso dar pitacos.

<webuijsf:tableRowGroup id="tableRowGroup1" rows="10" sourceData="#{Page1.defaultTableDataProvider}" sourceVar="currentRow"> <webuijsf:tableColumn headerText="column1" id="tableColumn4"> <webuijsf:staticText id="staticText4" text="#{Pessoa.nome}"/> </webuijsf:tableColumn>

  • sourceData="#{Page1.defaultTableDataProvider} é a sua coleção de objetos Pessoa
  • sourceVar=“currentRow” é a sua variável que vai iterar com os objetos da coleção
    Então para exibir o nome da pessoa #{currentRow.nome}

Só verifica direitinho no código da página o que é Page1.defaultTableDataProvider

venomtotal

gigi, obrigado mesmo pela paciencia, mas ja tentei no data table da sun tambem sem sucesso :cry:

Vou tentar resolver de outra maneira, criando um outro dataprovider.

Mas gostaria de uma ultima informacao, tem como preencher uma coluna, utilizando um metodo que recebe parametros?

Exemplificando, Tenho um datatable com 03 colunas, onde a terceira coluna seria a soma das 02 primeiras.

O valor da terceira coluna, viria de um metodo estatico de uma classe, ex:

Class Matematica
public static String soma(String num1, String num 2){

//o codigo converte as string em inteiros, soma e retorna o valor;

}

Se possivel, com seria a chamada deste metodo no Value Expression, passando os parametros?

gigicantador
HUm, se os valores têm que aparecer nas lisnhas das tabelas significa que estão diretamente ligados com as Entities listadas. Eu faria algo do tipo:
public class ItensPedido{
		private Integer id;
		private Produto produto;
		private Integer quantidade;

		@Transient
		private Double total;

		/// gets e sets

		public Double getTotal(){
			this.total= quantidade * produto.getValorUnitario();
			return this.total;
		}
	}

Dessa forma consigo jogar em uma tabela de Itens de um Pedido:
Produto|Valor Unitario|Quantidade|Total

<h:dataTable var="item" value="#{pedidoBB.pedido.colItensPedido}">
	<h:column>
		<h:outputText value="#{item.produto.nome}" />
	</h:column>
	<h:column>
		<h:outputText value="#{item.produto.valorUnitario}" />
	</h:column>
	<h:column>
		<h:outputText value="#{item.quantidade}" />
	</h:column>
	<h:column>
		<h:outputText value="#{item.total}" />
	</h:column>
</h:dataTable>

Isso ajuda? :wink:

Criado 21 de junho de 2008
Ultima resposta 26 de jun. de 2008
Respostas 11
Participantes 3