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?