29 de dezembro de 2010

JavaEE 5: SelectOneMenu (comboBox) em JSF 1.2

Na postagem de hoje iremos fazer um SelectOneMenu ou como a maioria conhece ComboBox em JSF 1.2, numa mesma página teremos um dinâmico onde a lista vem de um bean e um estático onde os itens são definidos diretamente no código fonte da página. Segue a imagem:


Segue o código fonte do ClienteBean:

import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;

public class ClienteBean {
 private List< SelectItem > selectItemsClientes;
 private int codigoClienteSelecionado;

 public List< SelectItem > getSelectItemsClientes() {
  selectItemsClientes = new ArrayList< SelectItem >();
  selectItemsClientes.add(new SelectItem(1, "Andii"));
  selectItemsClientes.add(new SelectItem(2, "João"));
  selectItemsClientes.add(new SelectItem(3, "Maria"));
  return selectItemsClientes;
 }

 public void setSelectItemsClientes(List< SelectItem > selectItemsClientes) {
  this.selectItemsClientes = selectItemsClientes;
 }

 public int getCodigoClienteSelecionado() {
  return codigoClienteSelecionado;
 }

 public void setCodigoClienteSelecionado(int codigoClienteSelecionado) {
  this.codigoClienteSelecionado = codigoClienteSelecionado;
 } 
}

Nesse bean, temos um int que corresponde ao valor selecionado no combo, e uma lista de SelectItem (veja que o SelectItem pertence ao pacote javax.faces, sendo do próprio JSF) com valores que eu setei diretamente no bean(claro que poderiam ser valores do banco), aí vem a pergunta: mas essa lista não poderia ser de objetos mesmo, tipo List< Cliente >? A resposta é sim! Poderia ser uma lista com o objeto Cliente mesmo, porém, iria dar um trabalho muito grande para pegar esse valor, tendo que criar converter e ainda podendo enfrentar problemas de conversão! Para entender melhor, leia isso!

OBS: Lembre-se de mapear o ClienteBean no faces-config.xml, nesse exemplo usei o escopo session mesmo.

Agora segue o código fonte da página jsp que tem os comboBox:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<html>
<f:view>
 <head>
  <title>Clientes</title>
 </head>
 <body>
  <h:panelGrid columns="1">
   <h:outputText value="SelectOneMenu com lista dinâmica" />
   <h:selectOneMenu value="#{clienteBean.codigoClienteSelecionado}">
    <f:selectItems value="#{clienteBean.selectItemsClientes}" />
   </h:selectOneMenu>
   
   <h:outputText value="SelectOneMenu com lista estática" />
   <h:selectOneMenu value="#{clienteBean.codigoClienteSelecionado}">
    <f:selectItem itemValue="1" itemLabel="Andii"/>
    <f:selectItem itemValue="2" itemLabel="João"/>
    <f:selectItem itemValue="3" itemLabel="Maria"/>
   </h:selectOneMenu>
  </h:panelGrid>
 </body>
</f:view>
</html>

Bom, para criar selectOneMenu dinâmico, usa-se o selectItems tendo como value a lista. Já para os casos estáticos, usa-se o selectItem setando o itemValue para o codigo do cliente(exemplo) e o itemLabel para o deverá aparecer na lista(exemplo: nome do cliente).

Aconselho dar uma olhada no link, tem vários outros componentes interessantes e úteis:  Mais componentes em JSF