Dúvida JSF - Inserir Dados

14 respostas
eullerbd

Pessoal, estou iniciando nos estudos de JSF.

Tenho as seguintes classes

Entidade Setor que contem o campo nome e os respectivos getters e setters e tenho tb uma classe ControleSetor que acessa a minha Persistencia na qual listo o código abaixo.

Controle Setor

public class ControleSetor {
       
    public ControleSetor()  {        
    }
   
    public void cadastrar(Setor setor) {
         DAOGenerico.cadastrar(setor);
    }
    
}

Criei um formulário JSF e gostaria que ao clicar no botao cadastrar. O JSF enviasse os dados para o meu controle, inserido assim o registro no banco de dados. Como devo fazer o mapeamento do meu faces-config.xml? Alguem poderia me ajudar?Segue abaixo a minha página em JSF de cadastro.

<html>
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:view>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Cadastro de Setor</title>
    </head>
    <body>
       
        <h:form>
           Setor: <h:inputText value="#{setor.nome}"/>
           <h:commandButton value="Cadastrar" action="cadastrar" />
        </h:form>   
    </body>
</f:view>
</html>

Desde já agradeço.

14 Respostas

yorgan

Você deve criar um managed-bean para o seu objeto setor no faces-config.xml, algo parecido com isso:

<managed-bean>
        <managed-bean-name>setor</managed-bean-name>
        <managed-bean-class>seuPacote.Setor</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

Com isso ao invocar o método cadastrar, você vai estar enviado o seu objeto setor para o método.
Espero ter ajudado, abraços.
[]´s

eullerbd

Sim já fiz isto, O objeto está sendo iniciado com o dado do formulário.

<managed-bean> <managed-bean-name>setor</managed-bean-name> <managed-bean-class>entidade.Setor</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>

A minha duvida é como vou fazer para que quando o usuario clicar no botão Cadastrar

<h:commandButton value="Cadastrar" action="cadastrar" />

o objeto setor seja enviado ao meu Controle (ControleSetor) acionando a minha função cadastrar e inserindo os dados no banco de dados.

yorgan

Coloque um objeto setor dentro da sua classe ControleSetor, algo como:

Setor setor;
//Deve ter o getter e o setter
public Setor getSetor() {
         return setor;
}

public void setSetor(Setor setor) {
    this.setor = setor;
}
//Seu método cadastrar. 
public void cadastrar() {   
         DAOGenerico.cadastrar(getSetor);   
}

Não sei direito como o faces manda o objeto para cá, mas dessa maneira tem funcionado para mim.

anderson.bonavides

No seu Managed Bean criado vai ter que conter um método chamado cadastrar. Ele que será encarregado de realizar os procedimentos necessários para cadastrar. Como por exemplo chamar o método que cadastra do teu Controler.

eullerbd

Coloquei o método cadastrar no meu Bean setor da seguinte forma.

public void cadastrar(Setor setor)
    {  
        
        new ControleSetor().cadastrar(setor);
    }

e mudei também a acao do meu botao de submit chamando a funcao cadastrar, conforme mostrado abaixo

<h:commandButton value="Cadastrar"  action="#{setor.cadastrar}" />

Ifelizmente o erro persiste.

avax.servlet.ServletException: #{setor.cadastrar}: org.apache.jasper.el.JspMethodNotFoundException: /Setor/cadSetor.jsp(18,11) '#{setor.cadastrar}' Method not found: entidade.Setor[id=null].cadastrar()
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)

Se alguém souber, por favor me ajude, e agradeço pelas respostas acima.

anderson.bonavides

Poe teu managed Beam, teu faces-config.xml e teu form.

eullerbd

Bean Setor

@Entity
public class Setor implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String nome;
    
    public Setor()
    {
        
    }
    public void setId(Long id) {
        this.id = id;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public Long getId() {
        return id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Setor)) {
            return false;
        }
        Setor other = (Setor) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entidade.Setor[id=" + id + "]";
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
    
    public void cadastrar(Setor setor)
    {  
        System.out.println(setor.nome);
        new ControleSetor().cadastrar(setor);
    }

}

Faces Config

<navigation-rule>
        <from-view-id>/Setor/cadSetor.jsp</from-view-id>
        <navigation-case>
            <from-outcome>cadastrar</from-outcome>
            <to-view-id>/Setor/listaSetor.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
    
   <managed-bean>
    <managed-bean-name>setor</managed-bean-name>
    <managed-bean-class>entidade.Setor</managed-bean-class>
     <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

Form

<html>
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:view>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Login</title>
    </head>
    <body>
       
        <h:form>
           Setor: <h:inputText value="#{setor.nome}"/>
           <h:commandButton value="Cadastrar"  action="#{setor.cadastrar}" />
        </h:form>   
    </body>
</f:view>
</html>
L

Caro amigo o meto que vc chama tem que ser mais ou menos assim:

public String  create() {
		IDaoDias ldao = new DaoDias();
		ldao.salvar(dias);
		return "sucesso_incDias";
	}

ou vc tbm poderia utilizar assim: aqui vc chama o meto na pagina como actionListener="#{seuBean.seumetodo}"

public void salvar(ActionEvent event){
IDaoDias ldao = new DaoDias();
		ldao.salvar(dias);
}

Tente adaptar seu metodo e vai funcionar blz,espero que ajude t+ abraços.

eullerbd

bom, estou quase la..veja agora a minha implementação

Faces Config

<navigation-rule>
        <from-view-id>/Setor/cadSetor.jsp</from-view-id>
        <navigation-case>
            <from-outcome>sucesso</from-outcome>
            <to-view-id>/Setor/listaSetor.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>

Criei o metodo cadastrar em meu Managed Bean

public String cadastrar()
    {  
       
        new ControleSetor().cadastrar(setor);
        return "sucesso";
    }

Se eu comento a linha new ControleSetor().cadastrar(setor), ele faz todo fluxo de navegação corretamente, mas nao vai inserir o objeto ...
caso eu descomento ela...ele nao passa o objeto setor para a minha classe de controle, e da ExceptionInInitializerError .....estou sem entender, esta implementacao do JSF. Alguem poderia me ajudar mais uma vez?Obrigado

*OBS: Estou inicializando o objeto setor no construtor do Managed Bean

J

Uma das formas de recuperar o managed bean é assim:

FacesContext context = FacesContext.getCurrentInstance(); Setor setor = (Setor) context.getApplication().getExpressionFactory() .createValueExpression(context.getELContext(), "#{setor}", Setor.class) .getValue(context.getELContext());

Como você está chamando o método dentro do próprio bean setor você pode fazer assim:

public String cadastrar() { new ControleSetor().cadastrar(this); return "sucesso"; }

eullerbd

Tentei as duas formas e tenho o mesmo erro.

javax.servlet.ServletException: #{setor.cadastrar}: java.lang.ExceptionInInitializerError

javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
s3v3r1n0

Cara Aqui deu certinho dos dois modos. criando um método no próprio bean e cadastrando usando a referência this, e com outro objeto chamando FacesContext con…, seu erro deve estar em outro lugar.

eullerbd

Estou usando o JPA na minha camada de Persistencia. Vou fazer mais alguns testes e tentar ver o que está acontecendo, obrigado a todos.

G

Moçada é o seguinte…
É o seguinte tenho 3 tabelas ALUNO --MATRICULA – CURSO;

cadastrei o aluno e curso tranquilamente usando JSF + HIBERNATE…

MAS O seguinte …nO JSP matricula, tenho q pegar o id do aluno , e o id do curso…como eu faço isso usando JSF

podem me enviar para [email removido] …valeu d+

Gustavo

Criado 14 de maio de 2008
Ultima resposta 19 de jun. de 2009
Respostas 14
Participantes 7