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?