| Você está aqui: 
                  JSF - Java Server Faces ::: 
                      JSF HTML Tags :::  | 
| Como preencher um controle <h:selectOneMenu> com informações de uma tabela do banco de dadosQuantidade de visualizações: 13184 vezes | 
| Em algumas ocasiões gostaríamos de preencher um controle <h:selectOneMenu> com informações de uma tabela do banco de dados. Isso é muito comum em formulários de cadastro, nos quais apresentamos uma lista de cidades ou categorias e o usuário deverá escolher uma entre as opções disponibilizadas. Para isso vamos começar criando uma tabela em um banco de dados. Aqui vou usar o MySQL, mas, você poderá usar qualquer banco, bastando alterar os parâmetros de conexão. Veja a instrução SQL CREATE TABLE que cria uma tabela chamada "categorias": ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- DROP TABLE IF EXISTS categorias; CREATE TABLE categorias( id int(10) unsigned NOT NULL auto_increment, nome varchar(45) NOT NULL, PRIMARY KEY(id) ); Por simplicidade esta tabela possui apenas os campos id (auto-incremento) e nome da categoria. Vamos passar para o JavaServer Faces agora. Abra o NetBeans, Eclipse ou sua IDE favorita, crie uma nova aplicação JSF e adicione a seguinte classe de conexão: Código para Conexao.java: ----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------
package banco;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Conexao{
  static String url = "jdbc:mysql://localhost/estudos";
  static String usuario = "root";
  static String senha = "osmar1234";
  static Connection conn = null;
  public static Connection getConexao(){
    if(conn != null){
      return conn;
    }
    else{
      try{
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        conn = DriverManager.getConnection(url, usuario, senha);
        return conn;
      }
      catch(SQLException ex){
        System.err.println("SQLException: " + ex.getMessage());
        System.err.println("SQLState: " + ex.getSQLState());
        System.err.println("VendorError: " + ex.getErrorCode());
        return null;
      }
      catch(Exception e){
        System.err.println("Problemas ao tentar conectar com o banco de dados: " 
          + e);
        return null;
      }
    }
  }
}
Faça as devidas alterações nesta classe de conexão e vamos criar um bean gerenciado JSF com o nome de Categoria, que representará cada uma das categorias obtidas a partir do banco de dados. Veja o código: Código para Categoria.java: ----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------
package entidades;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class Categoria implements Serializable {
    private int id; // id no banco de dados
    private String nome;
    // construtor padrão
    public Categoria() {
    }
    // construtor alternativo
    public Categoria(int id, String nome) {
        this.id = id;
        this.nome = nome;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
}
Agora precisamos de uma classe que servirá como ponte entre a entidade Categoria e sua correspondente tabela no banco de dados. Vamos chamá-la de CategoriaDAO e vamos criá-la como um bean gerenciado JSF. Veja o código: Código para CategoriaDAO.java: ----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------
package entidades;
import banco.Conexao;
import java.io.Serializable;
import java.sql.*;
import java.util.ArrayList;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class CategoriaDAO implements Serializable {
    public CategoriaDAO() {
    }
    // método que permite obter a lista de categorias no
    // banco de dados e retorná-la para exibição no controle
    // <h:selectOneMenu>
    public ArrayList<Categoria> getListaCategorias() {
        ArrayList<Categoria> listaCategorias = new ArrayList<Categoria>();
        // obtém a conexão com o banco de dados
        Connection conn = Conexao.getConexao();
        try {
            Statement stmt = conn.createStatement();
            String query = "SELECT * FROM categorias ORDER BY nome";
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()) {
                int id = rs.getInt("id");
                String nome = rs.getString("nome");
                Categoria c = new Categoria(id, nome);
                // vamos adicionar esta categoria à lista
                listaCategorias.add(c);
            }
        } catch (SQLException ex) {
            System.err.println("Erro ao obter dados: " + ex.toString());
        }
        
        return listaCategorias;
    }
}
Finalmente, eis o código para um página JSP ou Facelets contendo o controle <h:selectOneMenu> que exibirá todas as categorias da tabela do banco de dados: Código para index.xhtml: ----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Estudos JSF</title>
    </h:head>
    <h:body>
       <h4>Cadastro de Produtos</h4>
       <h:form>
          Categoria:<br />
          <h:selectOneMenu id="categoria" value="#{produto.categoria}">
             <f:selectItems value="#{categoriaDAO.listaCategorias}"
                var="item" itemLabel="#{item.nome}"
                itemValue="#{item.id}" />
          </h:selectOneMenu>
    
          <h:commandButton id="submit" value="Gravar Dados"
            action="#{produtosDAO.gravar}" />
       </h:form>
    </h:body>
</html>
Veja que fornecemos o valor "#{produto.categoria}" para a propriedade value do controle <h:selectOneMenu>, ou seja, o valor selecionado será atribuido e recuperado de uma propriedade categoria do tipo int ou long em um bean Produto. Em seguida fornecemos o valor "#{categoriaDAO.listaCategorias}" para a propriedade value do elemento <f:selectItems>. Isso já faz com que a tag tenha acesso a todos os itens do ArrayList de categorias. Ainda neste elemento nós usamos sua propriedade var para definir o nome pelo qual os itens poderão ser referenciados. Desta forma, itemLabel receberá o nome da categoria e itemValue receberá o id. Para que o exemplo funcione corretamente, crie um bean Produto contendo id, nome e categoria (declare categoria do tipo int). Crie também um bean produtosDAO contendo um método gravar(). | 
|  Link para compartilhar na Internet ou com seus amigos: | 
| Veja mais Dicas e truques de JSF - Java Server Faces | 
| Dicas e truques de outras linguagens | 
| Delphi - Como obter o número do registro atual em um TClientDataSet do Delphi usando a propriedade RecNo | 
| E-Books em PDF | ||||
| 
 | ||||
| 
 | ||||
| Linguagens Mais Populares | ||||
| 
			   1º lugar: Java | 


 
 




