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: 13301 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(). |
|
|
Veja mais Dicas e truques de JSF - Java Server Faces |
Dicas e truques de outras linguagens |
|
Java - Java para músicos - Como escrever um MIDI Player em Java (código bem simples e fácil de entender) |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |



