Dúvida JSF - Inserir Dados

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.

[code]
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f” %>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h” %>
<f:view>


Cadastro de Setor

    <h:form>
       Setor: <h:inputText value="#{setor.nome}"/>
       <h:commandButton value="Cadastrar" action="cadastrar" />
    </h:form>   
</body>

</f:view>

[/code]

Desde já agradeço.

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

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.

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.

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.

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

[code]public void cadastrar(Setor setor)
{

    new ControleSetor().cadastrar(setor);
}[/code]

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.

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

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

[code]
/Setor/cadSetor.jsp

cadastrar
/Setor/listaSetor.jsp

setor entidade.Setor session [/code]

Form

[code]
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f” %>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h” %>
<f:view>


Login

    <h:form>
       Setor: <h:inputText value="#{setor.nome}"/>
       <h:commandButton value="Cadastrar"  action="#{setor.cadastrar}" />
    </h:form>   
</body>

</f:view>

[/code]

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.

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

[code]public String cadastrar()
{

    new ControleSetor().cadastrar(setor);
    return "sucesso";
}[/code]

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

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"; }

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)

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.

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

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 flamencoask@hotmail.com …valeu d+

Gustavo