2
respostas

Expression Language

Na expression language do "selectItems" o managed bean "livroBean" chama o método autores(#{livroBean.autores}), mas não existe nenhum "método autores" na classe "LivroBean", existe somente o método "getAutores()". Onde esta este método autores da expression languade do selectItems? Qual o fluxo que esta sendo executado para que "autores" do "selectItems" seja populado com a Lista de autores?

<f:selectItems value="#{livroBean.autores}" var="autor" ...

2 respostas

Ola Wellington !

É isso mesmo:

<f:selectItems value="#{livroBean.autores}" var="autor"

Quando vc faz isso acima, vc esta falando para o JSF: "JSF, por favor cara, vai no meu ManageBean, tem uma lista de autores no getAutores() e itera nela para montar um selectItems"

O JSF vai fazer isso para voce e perceba essa parte: var="autor" atraves esse "autor" vc terá acesso a cada AUTOR de fato (cada instancia de autor) que estiver presente nessa lita de autores.

Ajudei ?

Abraço e bons estudos !

Olá Wellington Antonio,

O que está ocorrendo na verdade é um comportamento próprio da Expression Language, como você comentou, e não é específico do JSF. Segundo a especificação da Expression Language, os atributos de um Bean são sempre acessados através de métodos acessores (Getters & Setters) e nunca diretamente. Basicamente, quando um atributo pode ser lido, o mesmo possuirá um "get" e, quando pode ser escrito, um "set".

No exemplo da questão, quando você utiliza o comando #{livroBean.autores}, por trás dos panos, a EL está acessando o atributo autores através do método getAutores() que, por sua vez, retorna uma Collection (ex.: List) que pode ser iterada no componente selectItems do JSF.

É importante salientar que não é necessário existir um atributo no Bean para existir um método acessor, por exemplo:

public class SomaBean {

    Integer a = 1;
    Integer b = 2;

    public Integer getTotal() {
        return a + b;
    }

}

Na EL:

<h:outputText value="#{somaBean.a}" />        // Erro
<h:outputText value="#{somaBean.total}" />    // Funciona

=)