Você está aqui: JSF - Java Server Faces ::: JSF HTML Tags ::: e

Como preencher um controle <h:selectOneMenu> com informações de uma tabela do banco de dados

Quantidade de visualizações: 13131 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":

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:

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:

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:

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:

<?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

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 20 usuários muito felizes estudando em nosso site.