2
respostas

JSF erros na combobox

Eu não estou bem certo e ja revirei a aula e exercícios mas não consegui entender todos as funções de todos os argumentos desses componentes. Vamos la pra ver se entendi:

<h:selectOneMenu value="#{livroBean.autorId}" id="autor">

Atributo value é para ligar a seleção do usuario a um campo, certo?

<f:selectItems value="#{livroBean.autores}" var="autor"
                    itemLabel="#{autor.nome}" itemValue="#{autor.id}"/>

O value do selectItems recebe uma lista do que será exibido na lista da combo, certo? O var é um tipo de apelido para referenciar cada item da lista? Isso confunde um pouco pq o id tambem tem o mesmo nome... Aí o itemLabel é o atributo que será mostrado? O itemValue recebendo o id do autor eu realmente não consegui entender.

2 respostas

Ainda, por que o "#{livroBean.autores}" que obtem os dados do metodo getAutores da classe LivroBean não chama o método pelo nome? Como o bean consegue saber o método onde buscar a lista de autores?

Oi Alex,

Realmente essa parte pode ficar confusa pois são muitos atributos :D

Mas vamos lá:

<h:selectOneMenu> => JSF desenhe uma combo-box na tela.

Mas onde ele vai guardar a opção que foi escolhida pelo usuário? No atributo value:

<h:selectOneMenu value="#{livroBean.autorId}">

Mas como eu passo para a combo-box as opções que serão exibidas para que o usuário escolha uma? na tag <f:selectItems>:

<h:selectOneMenu value="#{livroBean.autorId}">
    <f:selectItems>
</h:selectOneMenu>

E de onde o selectItems vai puxar as opções? na atributo value:

<h:selectOneMenu value="#{livroBean.autorId}">
    <f:selectItems value="#{livroBean.autores}">
</h:selectOneMenu>

Mas o LivroBean.getAutores() devolve um List<Autor>. como o JSF sabe qual atributo da classe Autor é para mostrar nas opções da combo-box ? pelo atributo itemLabel:

<h:selectOneMenu value="#{livroBean.autorId}">
    <f:selectItems value="#{livroBean.autores}" itemLabel="#{autor.nome}">
</h:selectOneMenu>

Mas e de onde veio essa variável autor utilizada no itemLabel? precisa declarar no atributo var:

<h:selectOneMenu value="#{livroBean.autorId}">
    <f:selectItems value="#{livroBean.autores}" var="autor" itemLabel="#{autor.nome}">
</h:selectOneMenu>

Ou seja, o que essa tag <f:selectItems> faz é tipo um loop for:

for(Autor autor : livroBean.getAutores()) {
    System.out.println(autor.getNome());
}

E agora o último detalhe: na tag <h:selectOneMenu> o value ficou: value="#{livroBean.autorId}", ou seja, dentre as opções que apareceram para o usuário, a opção que ele escolher será enviada para esse atributo autorId do managedBean.

Mas como o JSF sabe que é para enviar o Id do autor e não o nome ou outro atributo? pelo atributo itemValue do selectItems:

<h:selectOneMenu value="#{livroBean.autorId}">
    <f:selectItems value="#{livroBean.autores}" var="autor" itemLabel="#{autor.nome}" itemValue="#{autor.id}">
</h:selectOneMenu>

Ou seja, o autor.id do selectItems é que será enviado para o value do <h:selectOneMenu>.

Meio confuso mesmo né?

Mas deu para entender melhor agora?