[RESOLVIDO]Apagar um formulario no PrimeFaces

[b]Bom dia a todos!

Estou iniciando em programação web com o Java EE.

Estou criando uma aplicação bem simples de cadastro de contatos para aprender mais sobre como se trabalhrar com Java.

Mas infelizmente não estou conseguindo realizar uma tarefa basica. Preciso apagar os campos de um formulario logo depois que persisto ele no banco no botão “Gravar”.

Andei pesquisando aqui no forum, ams esta um pouco confuso e não estou conseguindo fazer “funfar”.

Segue as classe abaixo com alguns comentarios:[/b]

[code]<?xml version='1.0' encoding='UTF-8' ?>

<h:head>
    <title>Cadastro de Clientes TCC Ciência da Computação</title>
</h:head>
<h:body>
    <h:graphicImage value="/imagens/unifil.gif" style="width: 250px; padding-bottom: 10px "></h:graphicImage>
    <h:form prependId="false">
        <p:panel id="painel" header="Cadastrar Novo Contato" style="margin-right: 870px">
            <p:messages />
            <h:panelGrid columns="2" >

                <h:outputText value="Nome:" />
                <p:inputText id="nome" size="25" value="#{controleCliente.nome}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>
                <p:message for="nome"/>  

                <h:outputText value="Endereço:" />
                <p:inputText id="endereco" size="25" value="#{controleCliente.endereco}" required="true" requiredMessage="Campo Obrigatório" ></p:inputText>

                <h:outputText value="Tel Residencial:" />
                <p:inputText id="telres" size="25" value="#{controleCliente.telRes}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>

                <h:outputText value="Tel Celular:" />
                <p:inputText id="tecel" size="25" value="#{controleCliente.telCel}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>

                <h:outputText value="E-mail:" />
                <p:inputText id="email" size="25" value="#{controleCliente.eMail}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>

            </h:panelGrid>

            <h:panelGrid columns="2">
                <p:commandButton value="Gravar" actionListener="#{controleCliente.gravarFormulario}" action="#{controleCliente.reinit()}"></p:commandButton> //Aqui esta o botão!!!
                <p:commandButton value="Limpar" type="reset"></p:commandButton>
            </h:panelGrid> [/code]

[code]
@ManagedBean
@RequestScoped
public class ControleCliente {

private String nome;
private String endereco;
private String telRes;
private String telCel;
private String eMail;

public String geteMail() {
    return eMail;
}

public void seteMail(String eMail) {
    this.eMail = eMail;
}

public String getEndereco() {
    return endereco;
}

public void setEndereco(String endereco) {
    this.endereco = endereco;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getTelCel() {
    return telCel;
}

public void setTelCel(String telCel) {
    this.telCel = telCel;
}

public String getTelRes() {
    return telRes;
}

public void setTelRes(String telRes) {
    this.telRes = telRes;
}

public String reinit() { //Metodo para zerar os campos!

    ControleCliente crtlcli = new ControleCliente();

    crtlcli = new ControleCliente();

    return null;
}

public void gravarFormulario() {

    Contato contato = new Contato();
    ContatoHelper grvcontato = new ContatoHelper();

    contato.setNome(nome);
    contato.setEndereco(endereco);
    contato.setTelres(telRes);
    contato.setTelcel(telCel);
    contato.setEmail(eMail);

    grvcontato.gravarContato(contato);
    



}

}[/code]

[b]Não sei o que esta faltando, caso falte algo é só me pedir!

Obrigado pela ajuda e atenção de todos.[/b]

cara,

crie um entidade para Cliente, com isso vc vai remover esse atributo do cliente e passar para essa entidade. depois disso, vc vai ter um atributo referente ao objeto Cliente no seu ManagedBean, ai toda vez que vc clicar no botão gravar, so dar new no objeto cliente e update no formulario.

t+

[b]alissonvla,

me desculpa, mas eu não entendi como eu devo proceder.

Eu estou usando o Hibernate e tenho uma classe de mapeamento e um bean com os mesmos getters e setters.

Desculpa a demora na resposta, mas eu estava atolado no serviço.

Obrigado pela atenção!!![/b]

cara,

vc vai ter que fazer o seguinte

<?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:p="http://primefaces.prime.com.tr/ui"  
      xmlns:h="http://java.sun.com/jsf/html"  
      xmlns:f="http://java.sun.com/jsf/core">  
  
    <h:head>  
        <title>Cadastro de Clientes TCC Ciência da Computação</title>  
    </h:head>  
    <h:body>  
        <h:graphicImage value="/imagens/unifil.gif" style="width: 250px; padding-bottom: 10px "></h:graphicImage>  
        <h:form prependId="false">  
            <p:panel id="painel" header="Cadastrar Novo Contato" style="margin-right: 870px">  
                <p:messages />  
                <h:panelGrid columns="2" >  
  
                    <h:outputText value="Nome:" />  
                    <p:inputText id="nome" size="25" value="#{controleCliente.contato.nome}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>  
                    <p:message for="nome"/>    
  
                    <h:outputText value="Endereço:" />  
                    <p:inputText id="endereco" size="25" value="#{controleCliente.contato.endereco}" required="true" requiredMessage="Campo Obrigatório" ></p:inputText>  
  
                    <h:outputText value="Tel Residencial:" />  
                    <p:inputText id="telres" size="25" value="#{controleCliente.contato.telRes}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>  
  
                    <h:outputText value="Tel Celular:" />  
                    <p:inputText id="tecel" size="25" value="#{controleCliente.contato.telCel}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>  
  
                    <h:outputText value="E-mail:" />  
                    <p:inputText id="email" size="25" value="#{controleCliente.contato.eMail}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>  
  
                </h:panelGrid>  
  
                <h:panelGrid columns="2">  
                    <p:commandButton value="Gravar" actionListener="#{controleCliente.gravarFormulario}" update="@form"/> //Aqui esta o botão!!!  
                    <p:commandButton value="Limpar" type="reset"></p:commandButton>  
                </h:panelGrid>
@ManagedBean  
@RequestScoped  
public class ControleCliente {  
  
    private Contato contato;  
  
    // esse metodo vc vai chamar para abrir sua pagina
	public String init(){
		contato = new Contato();
		return "contato.xhtml";
	}
  
    public void gravarFormulario() {  
        ContatoHelper grvcontato = new ContatoHelper();  
  
        grvcontato.gravarContato(contato);  
          
		contato = new Contato();  
    }  
	
	public Contato getContato(){
		return contato;
	}
	
	public void setContato(Contato contato){
		this.contato = contato;
	}
} 

t+

[b]Ok,

vou tentar aqui e já passo o feedback![/b]

[b]Cara fiz exatamente como vc fez acima e deu erro de exeção!

Ai eu deixei o meu metodo gravarContato() como estava antes e tambem nao funcionou!

Sera que nao existe alguma forma mais facil? [/b]

cara,

posta o log de erro completo.

t+

O erro:

31/10/2011 18:48:06 com.sun.faces.lifecycle.ProcessValidationsPhase execute AVISO: /index.xhtml @19,146 value="#{controleCliente.contato.nome}": Target Unreachable, 'contato' returned null javax.el.PropertyNotFoundException: /index.xhtml @19,146 value="#{controleCliente.contato.nome}": Target Unreachable, 'contato' returned null at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100) at org.primefaces.component.inputtext.InputTextRenderer.getConvertedValue(InputTextRenderer.java:113) at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030) at javax.faces.component.UIInput.validate(UIInput.java:960) at javax.faces.component.UIInput.executeValidate(UIInput.java:1233) at javax.faces.component.UIInput.processValidators(UIInput.java:698) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) at javax.faces.component.UIForm.processValidators(UIForm.java:253) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172) at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)

index.xhtml

[code]<?xml version='1.0' encoding='UTF-8' ?>

<h:head>
    <title>Cadastro de Clientes TCC Ciência da Computação</title>
</h:head>
<h:body>
    <h:graphicImage value="/imagens/unifil.gif" style="width: 250px; padding-bottom: 10px "></h:graphicImage>
    <h:form>
        <p:panel id="painel" header="Cadastrar Novo Contato" style="margin-right: 870px">
            <p:messages />
            <h:panelGrid columns="3" >

                <h:outputText value="Nome:" />
                <p:inputText id="nome" size="25" value="#{controleCliente.contato.nome}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>
                <p:message for="nome"/>  

                <h:outputText value="Endereço:" />
                <p:inputText id="endereco" size="25" value="#{controleCliente.contato.endereco}" required="true" requiredMessage="Campo Obrigatório" ></p:inputText>

                <h:outputText value="Tel Residencial:" />
                <p:inputText id="telres" size="25" value="#{controleCliente.contato.telres}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>

                <h:outputText value="Tel Celular:" />
                <p:inputText id="tecel" size="25" value="#{controleCliente.contato.telcel}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>

                <h:outputText value="E-mail:" />
                <p:inputText id="email" size="25" value="#{controleCliente.contato.email}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>

            </h:panelGrid>

            <h:panelGrid columns="2">
                <p:commandButton value="Gravar" actionListener="#{controleCliente.gravarFormulario}" update="@form"></p:commandButton>
                <p:commandButton value="Limpar" type="reset"></p:commandButton>
            </h:panelGrid> 

        </p:panel>
    </h:form>[/code]

O Bean:

[code]@ManagedBean
@RequestScoped
public class ControleCliente {

private String nome;
private String endereco;
private String telRes;
private String telCel;
private String eMail;
private Contato contato;

public String geteMail() {
    return eMail;
}

public void seteMail(String eMail) {
    this.eMail = eMail;
}

public String getEndereco() {
    return endereco;
}

public void setEndereco(String endereco) {
    this.endereco = endereco;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getTelCel() {
    return telCel;
}

public void setTelCel(String telCel) {
    this.telCel = telCel;
}

public String getTelRes() {
    return telRes;
}

public void setTelRes(String telRes) {
    this.telRes = telRes;
}

public String init() {

    Contato contato = new Contato();

    return "index.xhtml";
}

public void gravarFormulario() {
    ContatoHelper grvcontato = new ContatoHelper();

    grvcontato.gravarContato(contato);

    contato = new Contato();
}

public Contato getContato() {
    return contato;
}

public void setContato(Contato contato) {
    this.contato = contato;
}

}[/code]

Será que estou fazendo alguma confusão?

cara,

como eu te falei, ta vendo esse metodo init, antes de vc entrar nessa pagina, vc vai ter que chama-lo
esse erro ta ocorrendo pq a variavel contato ta null, nao foi inicializada.

t+

[b]alissonvla,

peço perdão por minha total ignorancia, mas onde eu devo chamar o metodo?

Obrigado por tudo ate agora.[/b]

como vc chama essa pagina?

posta o codigo

Eu chamo ela de controlecliente.

Ai no meu index.xhtml eu chamo ela por controlecliente.algumMetodo!

E isso?

cara,

crie um construtor para essa classe.

public class ControleCliente {  
...
public ControleCliente(){
this.contato = new Contato();
}
...

t+

alissonvla Funcionou cara!!!

Como que rolou essa magia negra, pois não entendi!

Muito obrigado!

cara,

1 - quando vc entrou na pagina, foi chamado o construtor do seu ManagedBean, que deu um new na variavel contato.
2 - qdo vc clicou na botao, ele pegou o variavel contato preechida, gravou, depois de gravar, dei um new novamente para limpar o formulario e na pagina o botao tem a opcao de update no form, que vai fazer isso com ajax.

t+

[b]Legal, entendi!

Vou tentar popular uma datatable agora!

Obrigado novamente! :slight_smile: [/b]