Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

dúvida var

Quando criamos a variável dentro do dataTable abaixo seria para facilitar para não escrever por exemplo na tag outPutText #{livroBean.autoresDoLivro.nome} ao invés disso é escrito somente #{autor.nome}, é essa a interpretação?


<h:dataTable value="#{livroBean.autoresDoLivro}" var="autor">
                        <h:column>
                            <h:outputText value="#{autor.nome}" />
                        </h:column>
                    </h:dataTable>
5 respostas

Olá Lorran,

para entender o que o h:dataTable está fazendo podemos ver os tipos de dados com o quais ele está recebendo no value. Quando chamamos o comando #{livroBean.autoresDoLivro} dentro do value, no fundo estamos chamando o método getAutoresDoLivro() do LivroBean, cujo retorno é do tipo List<Autor>, ou seja, o value recebe uma lista com vários autores.

Se você tentar chamar #{livroBean.autoresDoLivro.nome}, no fundo você tentará chamar o método getNome() a partir desta List<Autor>, mas é a lista que tem o método getNome()? Quem que tem esse método? Note que no seu h:dataTable você passa como value justamente a lista de autores e declara um var de autor. Depois dentro do h:dataTable, você faz #{autor.nome}, então qual seria o tipo desta variável autor que tem o método getNome()? No fundo o que o dataTable está colocando no var a partir da lista que você passa no value dele?

Olá Lucas,

A primeira parte do seu parágrafo eu entendi, porém na segunda parte fiquei um pouco confuso.Não entendi.

Obrigado desde já.

Se você tentar fazer um #{livroBean.autoresDoLivro.nome} será a mesma coisa que fazer o seguinte código Java:

    List<Autor> autores = livroBean.getAutoresDoLivro();
    String nomeDeUmAutor = autores.getNome();

Se você tentar escrever este código notará que ele não compila. Isto ocorre porque eu estou tentando chamar o método getNome() a partir da lista de autores, mas não é a interface List que possui este método. Ele foi definido na sua classe Autor, ou seja, cada autor individualmente tem o seu getNome(). Que estrutura lógica você teria que usar para pegar o nome de cada autor que está dentro desta lista? No fundo é isto que o h:dataTable estará fazendo.

solução!

Lorran, o h:datatable recebe uma Collection (List, ArrayList) no atributo value e imprime uma linha para cada objeto da Collection (cada linha terá um dos objetos da lista passada). Para poder exibir cada um dos atributos do objeto dessa linha, existe o atributo var. Assim, em cada linha você pode acessar o objeto através da expression language #{[nome_dado_no_atributo_var].[propriedade_do_objeto]}. Dessa forma, pegando seu exemplo:

<h:dataTable value="#{livroBean.autoresDoLivro}" var="autor">
    <h:column>
        <h:outputText value="#{autor.nome}" />
    </h:column>
</h:dataTable>

Em cada linha, você poderá acessar o objeto da linha usando expression language. Assim, você pode acessar o nome do autor com:

#{autor.nome}

Pode acessar o id dele com:

#{autor.nome}

E por aí vai.

Em síntese, é a forma de você conseguir acessar os atributos de cada objeto, em cada linha, passado por Collection.

Espero ter ajudado.

Abraço.

Muito Obrigado senhores, consegui compreender agora.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software