Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

INSERINDO DADOS A PARTIR DE UM COMBOBOX NO JSF

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name = "userData", eager = true)
@SessionScoped
public class UserData implements Serializable {
   private static final long serialVersionUID = 1L;
   public String data = "1";

   public String getData() {
      return data;
   }

   public void setData(String data) {
      this.data = data;
   }
}
<?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:f = "http://java.sun.com/jsf/core"     
   xmlns:h = "http://java.sun.com/jsf/html"> 

   <head> 
      <title>JSF Tutorial!</title> 
   </head> 

   <h:body> 
      <h2>h::selectOneMenu example</h2> 
      <hr /> 

      <h:form> 
         <h3>Combo Box</h3>  
         <h:selectOneMenu value = "#{userData.data}"> 
            <f:selectItem itemValue = "1" itemLabel = "Item 1" /> 
            <f:selectItem itemValue = "2" itemLabel = "Item 2" /> 
            <f:selectItem itemValue = "3" itemLabel = "Item 3" /> 
            <f:selectItem itemValue = "4" itemLabel = "Item 4" /> 
            <f:selectItem itemValue = "5" itemLabel = "Item 5" />     
         </h:selectOneMenu>  
         <h:commandButton value = "Submit" action = "result" /> 
      </h:form>    

   </h:body> 
</html>

Só quero enviar o valor que o usuário pegou e cadastrar no banco o que é preciso?

obs. Minha dúvida é como pegar o valor adicionar a um objeto de uma determinada classe que está mapeada para entidade.

Ex. no input text isso é fácil de fazer porque o valor que o usuário digitar será armazenado no banco, mas no ItemValue não funciona...

7 respostas

Opa W.K, o que não funciona exatamente? Pergunto pq pelo seu código parece que você fez o binding corretamente. O que tá faltando é associar a action do botão com um método do seu managed bean. Se estiver com dúvida sobre isso, aconselho fazer os cursos de jsf aqui da plataforma.

Olá, tudo bem ?

Foram muitas dúvidas numa única questão, vou te ajudar uma de cada vez haha

Para realizar o cadastro no banco de dados, inicialmente você vai necessitar o objeto mapeado pela JPA, disponível no seu Bean, algo do gênero :


@ManagedBean(name = "userData", eager = true)
@SessionScoped
public class UserData implements Serializable {
   private static final long serialVersionUID = 1L;
   public String data = "1";

   @Inject
   public ObjetoMapeado obj;

   public ObjetoMapeado getObjetoMapeado() {
      return obj;
   }

   public void setObjetoMapeado(ObjetoMapeado obj) {
      this.obj = obj;
   }
}

Agora você já tem acesso a ele dentro do seu xhtml, podendo fazer algo parecido com isso :

<p:inputText value="#{userBean.obj.campo}/>

E quando você clicar no seu botão de salvar, você precisará apenas ter um DAO para fazer a persistência para você.

Outra coisa que você está esquecendo é de chamar a ação do seu botão :

<p:commandButton value="Salvar" action="#{userBean.salvar}"  />

Eventualmente é necessário ter um método para responder a essa chamada :

public void salvar() {
    // regra para salvar seus dados no banco
}

Espero ter ajudado.

Abraços

Vamos lá, olha na verdade essas alterações Matheus eu tinha feito, só não coloquei mas vou colocar todo o código. O que não consigo fazer é a associação da classe @Entity InserirCliente com o formulário.

veja todo o projeto abaixo:

package br.combo;

import javax.persistence.EntityManager;

public class DAO<T> {

    private final Class<T> classe;


    public DAO(Class<T> classe) {
        this.classe = classe;
    }

    public void cadastra(T t){
        //consegue a entity manager
        EntityManager manager = new JPAUtil().getEntityManager();

        manager.getTransaction().begin();

        manager.persist(t);

        //gravar de fato dos dados no banco
        manager.getTransaction().commit();

        //manager
        manager.close();
    }

}
package br.combo;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JPAUtil {

    private static EntityManagerFactory emf = Persistence
            .createEntityManagerFactory("teste-combox");

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void close(EntityManager em) {
        em.close();
    }
}
package br.combo;

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name = "userData", eager = true)
@SessionScoped
public class UserData implements Serializable {

    private static final long serialVersionUID = 1L;

    private InserirCliente cliente = new InserirCliente();

    public String data = "1";

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public void gravar() {
        System.out.println("Granvando ...");
        new DAO<>(InserirCliente.class).cadastra(this.cliente);
    }

    /**
     * @return the cliente
     */
    public InserirCliente getCliente() {
        return cliente;
    }

}
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.combo;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;

/**
 *
 * @author Wilde
 */
@Entity
public class InserirCliente implements Serializable {

    @Id
    private String opcao;

    /**
     * @return the opcao
     */
    public String getOpcao() {
        return opcao;
    }

    /**
     * @param opcao the opcao to set
     */
    public void setOpcao(String opcao) {
        this.opcao = opcao;
    }
}
<?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:f = "http://java.sun.com/jsf/core"     
      xmlns:h = "http://java.sun.com/jsf/html"> 

    <head> 
        <title>JSF Tutorial!</title> 
    </head> 

    <h:body> 
        <h2>h::selectOneMenu example</h2> 
        <hr /> 

        <h:form> 
            <h3>Combo Box</h3>  
            <h:selectOneMenu value = "#{userData.data}"> 
                <f:selectItem itemValue = "teste1" itemLabel = "Item 1" /> 
                <f:selectItem itemValue = "teste2" itemLabel = "Item 2" /> 
                <f:selectItem itemValue = "teste3" itemLabel = "Item 3" /> 

            </h:selectOneMenu>  
            <h:commandButton value = "Submit" action = "#{userData.gravar()}" /> 
        </h:form>    


    </h:body> 
</html>
solução!

O que você pode fazer é algo assim :

<?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:f = "http://java.sun.com/jsf/core"     
      xmlns:h = "http://java.sun.com/jsf/html"> 

    <head> 
        <title>JSF Tutorial!</title> 
    </head> 

    <h:body> 
        <h2>h::selectOneMenu example</h2> 
        <hr /> 

        <h:form> 
            <h3>Combo Box</h3>  
            <h:selectOneMenu value = "#{userData.cliente.opcao}"> 
                <f:selectItem itemValue = "teste1" itemLabel = "Item 1" /> 
                <f:selectItem itemValue = "teste2" itemLabel = "Item 2" /> 
                <f:selectItem itemValue = "teste3" itemLabel = "Item 3" /> 

            </h:selectOneMenu>  
            <h:commandButton value = "Submit" action = "#{userData.gravar()}" /> 
        </h:form>    


    </h:body> 
</html>

Imagino que seja isso que quer né ?

kkkkkkkkk, caracás deu certo, mas já tinha feito isto antes, e ele tava gerando um erro, algo do tipo não possível inserir valor null use converter não me lembro exatamente. mas foi ufa!!! Esse foi o método mais fácil para entender, vi outros mas utilizando collections e não entendi muito bem. Outro exemplo foi pegar o valor do banco, mas não seria muito prático criar uma tabela no banco para chamar na aplicação e depois inserir o valor. Como seria para um radiobutton ou um checkbox?

W.K,

Com RadioButton, seria praticamente igual, só altera a tag, nesse caso se não me engano se chama selectOneRadio.

Já no caso do checkbox, vou te passar um exemplo do Primefaces para você dar uma olhadinha, pode ser ?

https://www.primefaces.org/showcase/ui/input/checkboxMenu.xhtml

Espero ter ajudado

Abraços