Limpar formulario Primefaces

7 respostas
Diego.G.A

Olá pessoa,

estou com o seguinte problema, ao clicar no botão de limpar o formulario o mesmo chama meu método,
e dentro dele faço um new para os objetos que quero limpar,
porém o mesmo não zera o meu objeto, porque na resposta do primefaces ele trás o formulario para atualizar mas o input continua com o valor.

página xhtml:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.prime.com.tr/ui"
	template="/template/layoutManager.xhtml">

	<ui:define name="title">
		<h:outputText value="#{messages['administrador.title.label']}" />
	</ui:define>

	<ui:define name="body">
		<p:messages id="messages" />
		<h:form id="formManagerAdministrador">
			<h:inputHidden
				value="#{administradorBean.administrador.idAdministrador}" />
			<p:panel header="#{messages['administrador.panelManter.label']}">
				<h:panelGrid columns="4">
					<h:outputLabel value="#{messages['administrador.nome.label']}" />
					<p:inputText id="nome" size="40"
						value="#{administradorBean.administrador.nome}"
						label="#{messages['administrador.nome.label']}" required="true" />

					<h:outputLabel for="email"
						value="#{messages['administrador.email.label']}" />
					<p:inputText id="email" size="40"
						value="#{administradorBean.administrador.email}"
						label="#{messages['administrador.email.label']}" required="true" />

					<h:outputLabel for="login" value="#{messages['login.login.label']}" />
					<p:inputText id="login" value="#{administradorBean.login.login}"
						label="#{messages['login.login.label']}" required="true" />

					<h:outputLabel for="senha" value="#{messages['login.senha.label']}" />
					<p:password id="senha" value="#{administradorBean.login.senha}"
						promptLabel="#{messages['org.primefaces.password.feedback.promptLabel']}"
						weakLabel="#{messages['org.primefaces.password.feedback.weak']}"
						goodLabel="#{messages['org.primefaces.password.feedback.good']}"
						strongLabel="#{messages['org.primefaces.password.feedback.strong']}"
						label="#{messages['login.senha.label']}" />

					<h:outputLabel value="#{messages['estado.descricao.label']}" />
					<h:selectOneMenu id="estado" required="true"
						value="#{cidadeBean.estado}"
						label="#{messages['estado.descricao.label']}">
						<f:selectItem itemValue="0"
							itemLabel="#{messages['estado.noneSelected.label']}" />
						<f:selectItems value="#{estadoBean.estados}" var="estado"
							itemLabel="#{estado.descricao}"
							itemValue="#{estado.idEstado}" />
						<p:ajax update="cidade, messages"
							listener="#{cidadeBean.loadCidadesByEstado}" />
					</h:selectOneMenu>

					<h:outputLabel value="#{messages['cidade.descricao.label']}" />
					<h:selectOneMenu id="cidade" required="true"
						value="#{administradorBean.administrador.cidade.idCidade}"
						label="#{messages['cidade.descricao.label']}">
						<f:selectItem itemValue="0"
							itemLabel="#{messages['cidade.noneSelected.label']}" />
						<f:selectItems value="#{cidadeBean.cidades}" var="cidade"
							itemLabel="#{cidade.descricao}"
							itemValue="#{cidade.idCidade}" />
					</h:selectOneMenu>
					
					<p:commandButton value="#{messages['button.salvar']}"
						actionListener="#{administradorBean.salvar}"
						update="formManagerAdministrador, messages" />
					<p:commandButton value="#{messages['button.cancelar']}"
						action="#{administradorBean.novo}"
						immediate="true"
						update="formManagerAdministrador, messages" />
				</h:panelGrid>
			</p:panel>
		</h:form>
	</ui:define>

</ui:composition>
class java:
package br.com.site.beans;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.web.context.WebApplicationContext;

import br.com.site.entity.Administrador;
import br.com.site.entity.Estado;
import br.com.site.entity.Login;

@Service
@Scope(WebApplicationContext.SCOPE_REQUEST)
public class AdministradorBean {

	private Administrador administrador = new Administrador();
	
	private Login login = new Login();
	
	public void salvar() {
		novo();
	}
	
	public void novo() {
		administrador = new Administrador();
		login = new Login();
	}

	public Administrador getAdministrador() {
		return administrador;
	}

	public void setAdministrador(Administrador administrador) {
		this.administrador = administrador;
	}

	public Login getLogin() {
		return login;
	}

	public void setLogin(Login login) {
		this.login = login;
	}
	
}

alguém sabe como resolver este problema?

7 Respostas

Gustavo_Sperandio

Cara aparentemente esta tudo em ordem, mas faz o seguinte, tira o atributo immediate do commandButton, acredito que se você fizer isso ele já não vai mais chamar o método, se isso acontecer vai no método e coloca ele pra dar um retorno de uma String vazia mesmo, e tenta de novo

Diego.G.A

cara não funcionou porque:
se eu tirar o immediate ele valida o form
e com o immediate ele envia mas ocorre o problema
ja coloque pra retorna uma String
e mudei pra ajax=“false”

e nada

Diego_Adriano

Diego, não sei se é bem o que vc quer … Mas limpo meus formulários dessa forma:

<p:commandButton value="Limpar" ajax="true" immediate="true" type="reset"/>
Diego.G.A

Valeu Diego

E

Quando eu enviava um formulário e houvesse erro no preenchimento, por exemplo, os dados ficavam no form mesmo com um reset e instanciando o objeto novamente.

Então uso o seguinte:

UIForm form = (UIForm) context.getViewRoot().findComponent("nomeform");
        cleanSubmittedValues(form);


    private void cleanSubmittedValues(UIComponent component) {
        if (component instanceof EditableValueHolder) {
            EditableValueHolder evh = (EditableValueHolder) component;
            evh.setSubmittedValue(null);
            evh.setValue(null);
            evh.setLocalValueSet(false);
            evh.setValid(true);
        }
        if (component.getChildCount() > 0) {
            for (UIComponent child : component.getChildren()) {
                cleanSubmittedValues(child);
            }
        }
    }

Talvez ajude

colombelli

Ressuscitando o tópico.
Precisei dessa solução, vou colocar a forma que eu utilizei para resolver o meu problema.

Page:

<p:commandButton value="Salvar" action="#{pessoaController.salvar}" update="@form" />

Java code:

public void salvar() {
    pessoaService.save(product);
    pessoa= new Pessoa();
}
onerbbreno

Ótima solução colombelli, resolveu meus problemas

Criado 24 de março de 2011
Ultima resposta 26 de ago. de 2014
Respostas 7
Participantes 6