Powered by Max Banner Ads 
Home > JSF > selectOneMenu JSF com BD

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.

    Related Posts with Thumbnails
    1. Hebert R. Freitas
      July 20th, 2010 at 07:05 | #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. July 20th, 2010 at 18:44 | #2

      Post muito legal Camilo, parabens

    3. camilolopes
      July 21st, 2010 at 07:15 | #3

      opa! pessoal! eu que agradeço a voces pelo feedback, obrigado mesmo.

    4. Kelson
      July 31st, 2010 at 07:18 | #4

      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

    5. camilolopes
      July 31st, 2010 at 09:31 | #5

      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, :D

    6. Ricardo
      January 21st, 2011 at 17:40 | #6

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

    7. Java(Eng. Taylor)
      January 3rd, 2012 at 20:42 | #7

      Muito Obrigado!
      reemcontrei este tutorial, ele me ajudou muito em 2011 –vlw mesmo!