selectOneMenu JSF com BD

olá Pessoal,

Hoje vou mostrar como criar preencher um selectOneMenu com dados vindo do Banco de Dados. Há várias formas de fazer isso, no blog o rponte você vai ver alguns posts bem interessante sobre o assunto. Vou mostrar abaixo como deixar seu selectOneMenu dinâmico pegando os dados do BD.

Tive como referência o livro do autor Edson Gonçalves em seu livro Dominando JSF.

lets go…

Posts Recomendados

Note: Para o exemplo a seguir usei o Hibernate puro para persistência e o TomCat 6 como servidor.

Preparando o ambiente:

  1. crie seu projeto JSF e sua página jsp ou xhtml

Aqui vamos usar xhtml, mas nada impede de usar .jsp o código JSF não vai mudar se vc criou um dos dois arquivos acima.

  1. Não esqueça de criar uma tabela no seu banco de dados. Aqui chamamos ela de cargo

Desenvolvendo

  1. Na sua classe DAO, crie um método que vai retornar todos cargos cadastrados:

    //retorna todos os cargos cadastrados
    	public List listaCargo(){
    		Query query = getSession().createQuery("from Cargo");
    		Listlista = query.list(); 
    
    		return lista;
    	}
  2. Na ControllerCargo você deve ter o método e a variável abaixo.

    public class ControllerCargo {
    	private Cargo cargo;
    	private Map cargoitem=null;
    	private ListDataModel model; 
    
    	public ControllerCargo() {
    		cargo = new Cargo();
    	}
    //outros codes foram omitidos, pois não tem importância para o objetivo do post
    
    //será armazenado no selectOneMenu
    	public Map getCargos(){
    	CargoDAO cargodao = new CargoDAO();
    	cargoitem = new LinkedHashMap();
    	for(Iterator iter =cargodao.listaCargo().iterator();iter.hasNext();){
    	Cargo c = (Cargo) iter.next();
    	 //armazenando os cargos encontrados no bd em um map
    		cargoitem.put(c.getFuncao(), c.getFuncao());
    	}
    	return cargoitem;}
  3. Essa aqui é nossa classe cargo:

    public class Cargo {
    	private int id;
    	private String funcao;
    	private String area;
    //gets/sets omitidos
  4. criamos uma página em xhtml (poderia ser em JSP) que tem o selectOneMenu carregado com os cargos que estao na tabela no BD, veja como ficou o code:
<input jsfc=”h:selectOneMenu” value=”#{controllerUser.usuario.funcao}” >
<f:selectItems value=”#{controllerCargo.cargos}” />
</input>

<input jsfc=”h:selectOneMenu” value=”#{controllerUser.usuario.funcao}” >

<f:selectItems value=”#{controllerCargo.cargos}” />

</input>


    Erro comum

    1. um erro comum é não prestar atencao no S que temos entre selectItems e seletecItem, se vc deixar no singular, terá problemas ao executar a página. Afinal de contas você informou que vai receber uma coleção de dados.

    Teste

    Veja abaixo o exemplo do selectOneMenu pegando informações que vem do BD. temos um formulário e logo a seguir um select do banco de dados.

    selectonebdjsf

    Vou ficando por aqui pessoal e até a proxima, espero que tenham gostado, o objetivo aqui foi apresentar um ponto bem especifico, por isso não coloquei todo o código para não perder o foco. Até porque nada mudou nas outras classes.

    Abracos, see you next post.

    12 comentários em “selectOneMenu JSF com BD”

    1. Excelente artigo, estive trabalhando com jsf e a biblioteca de componentes richfaces recentemente para o meu projeto final da faculdade, várias vezes me deparei com este problema, depois de algumas pesquisas percebi que realmente existem várias formas de fazer como você mesmo citou.

      No mais gostaria de parabenizá-lo por seu trabalho no blog, acompanho o feed dele a algum tempo e sempre estou lendo os posts porque sei que o contéudo é de qualidade.

    2. Olá camilo, eu estou tendo problema com algo relacionado…

      eu preencho normalmente um compo porém quando este primeiro for preenchido, auitomaticamente um segundo combo é preenchido.. ( usei o rerender no primeiro combo ) porem quando vou gravar no banco os dados dos 2 combos, eles cao como nulos sendo que foram preenchidos na interface… se pudesse me ajudar eu ficaria muito agradecido.

      e aproveitando quero lhe dar os parabéns pois seu blog java é o unico que eu realmente leio e me chamou a atenlçao… parabens

      1. olá Kelson,
        pelo que eu entendi do seu problema o que pode está acontecendo é que o seu controller não está pegando os dados preenchido e passando para as variaveis do bean, veja se usou o managebean correto, se os valores nao estao sendo reinciando em algum momento. Eu ja passei por algo parecido e o meu problema estava no controller com a pagina jsf, onde as informacoes nao estavam relacionadas. Lembre-se que o que será persistindo é um objeto pelo ORM que contem as info do bean que nada mais é a nossa table.

        pow obrigado pelo elogio ao blog! fico feliz que ele tenha chamado atenção.. hehe
        abracos, 😀

    3. muito bom mesmo cara!! Valeu!!! sou iniciante em JSF e este post me ajudou muito.
      Parabéns.
      abraços,

    4. Camilo,
      Excelente exemplo, deve ser de grande utilidade para todos.

      Mas como eu acessaria o ID do cargo para Armazenar no BD do formulario do Usuário ?

      Alguma coisa parecida com isso:
      var=”tipo” itemValue=”#{tipo.codigo}”/>
      Para que a variável indicada no SelecOneMenu receba o tipo.codigo e nao o nome:
      value=”#{controllerUser.usuario.id}” >

      Terias alguma idéia para isso ???

      1. olá Claudio,

        O relacionamento entre Usuario e Cargo que fará vc ter o ID do cargo na tabela do Usuário. Pense olhando para relacionamento e não para formularios. Uma vez que o relacionamento está correto para o deseja, é so adaptar no front-end. Nesse exemplo eu não entrei no relacionamento das entidades, até pq elas não estão relacionadas.
        Para receber o código do usuário seria algo assim como vc falou.

    5. Só para esclarecer a dúvida anterior:
      Quiz dizer mostrar a FUNCAO como no exemplo, mas retornar o ID da função para o bean.ID e poder gravar apenas o ID da funcao na tabela de usuarios ???

      1. Claudio,

        Sim, pode ter. depende de como está o relacionamento, entre as entidades. Você pode ter o id do cargo na tabela usuário, mas também, vc pode ter o id do usuário na tabela do cargo. Há regras de negocio que dizem que um usuário não pode ter mais de um cargo, porém um cargo pode ter mais de 1 usuário.

    Deixe um comentário para camilolopes Cancelar resposta

    O seu endereço de e-mail não será publicado.