Jsf: Limpar campos fomulários sem interferencia do validator

26 respostas
E

Galera,

Quando clico em Limpar, ele faz as validações dos campos obrigatórios como se fosse um botão de envio. Utilizo um validator próprio.

Utilizei algumas sugestões de colegas do forum como colocar h:commandNutton dentro de um <h:form> separado e adicionar a propriedade immediate=“true”. Com isso de fato ele não faz a validação, mas também não limpa os campos.

Obrigado

26 Respostas

E

Galera segue o meu código:


Na Pagina Jsp:

<h:commandButton
   value="#{Message['msg.consultar']}"
   action="#{cnsTrnFinFormBean.performConsultar}" /> 

<h:commandButton
   value="#{Message['msg.limpar']}" 
   actionListener="#{cnsTrnFinFormBean.limpar}"
/>

beacking bean:

public String limpar(ActionEvent e)
   {
      campo1 = null;
      campo2 = null;
      dataFinal = new Date();
      dataInicial = new Date();
      

      return null;
   }
E

Põe o atributo immediate=true no botão, acredito que resolva

E

O colega, obrigado, mas já tentei, ele não limpa quando coloco esse atributo…

E

Pessoal, já tentei também colocar os botão limpar dentro de outro <h:form> porém não acontece nada ao clica-lo.

Alguém mais pode me ajudar ?

H

Tenta colocar um link para essa pagina (a mesma pagina, como um reload). Eu já fiz assim…mas acho q o bean não pode ser de sessao.

[]´s

E

humberto.lima:
Tenta colocar um link para essa pagina (a mesma pagina, como um reload). Eu já fiz assim…mas acho q o bean não pode ser de sessao.

[]´s

Como assim um link, aonde eu colocaria esse link ?

H

efcjunior:

Como assim um link, aonde eu colocaria esse link ?

Por exemplo vc esta na pagina form.xhtml, vc cria um link <h:commandLink url=‘form.jsf’> Limpar </h:commandLink>

algo assim…

S

Amigo eu não entendi bem a sua pergunta mas você quer um botão Limpar? Um reset Html? por que se for isso já que é só pra limpar os campos mesmo põe um html dentro do formulário mesmo, ele limpa os campos sem problema.
Ou vocÊ quer alguma alteração no Backing bean? tipo resetar todas as propriedades dele? E se é isso o imediate=“true” deveria resolver.

E

s3v3r1n0:
Amigo eu não entendi bem a sua pergunta mas você quer um botão Limpar? Um reset Html? por que se for isso já que é só pra limpar os campos mesmo põe um html dentro do formulário mesmo, ele limpa os campos sem problema.
Ou vocÊ quer alguma alteração no Backing bean? tipo resetar todas as propriedades dele? E se é isso o imediate=“true” deveria resolver.

o cara valeu mesmo, mas é o seguinte, eu preciso de utilizar este botão limpar para resetar o beacking bean. Já utilizei o immediate, mas não limpa…

S

Vou tentar achar a resposta aqui cara vamos ver.

E

Ok…Ainda continuo com o mesmo…

E

Pessoal, me ajudem por gentileza !!! Preciso resolver urgentemente este problema. Jà esgotei as minhas pesquisas no google, meu último recurso são vocês.

Agradeço !

R

Se o problema é somente limpar os campos do managed bean eu sempre me utilizo de uma command button como:

&lt;h:commandButton value="limpar" action="#{mbean.limpar}" immediate="true" /&gt;

E no managed bean eu simplesmente limpo os campos necessários:

public String limpar() { this.nome = ""; this.listaDeRegistros = null; return null; }

Mas se por algum motivo isso não estiver funcionando com você, -o que eu acharia estranho-, então talvez isso te ajude,
http://wiki.apache.org/myfaces/ClearInputComponents

Abraços e boa sorte.

E

rponte, agradeço pela tua contribuição…

Eu encontrei neste post http://www.javafree.org/javabb/viewtopic.jbb?t=862576 um problema similar em que foi resolvido pelo colega utilizando virtual form…

Entendi mais ou menos, alguém poderia me dá um exemplo a respeito de virtual form

E

Galera, eu coloquei a propriedade immediate e ela ignorou as validações porém os campos não estão limpando.

<h:commandButton
					value="#{Message['msg.consultar']}"
					action="#{cnsTrnFinFormBean.performConsultar}" /> 
				<h:commandButton
					value="#{Message['msg.limpar']}" 
					actionListener="#{cnsTrnFinFormBean.limpar}"
					immediate="true"
					/>
E

Tenta tbm um type=“submit”

L
  • o padrao já nao e submit???
    Cara ultima vez que fiz isso so consegui acessando os componentes de input no meo bean.
E
  • o padrao já nao e submit???
    Cara ultima vez que fiz isso so consegui acessando os componentes de input no meo bean.

Como eu posso fazer esse acesso destes componentes, pode me dá um exemplo ?

E

já usei o submit e reset, também não funcionou…

M

uow :lol: fiz igual o exemplo do rponte colocou e funcionou … com um manage bean limpar campos … dai coloquei os campos que precisavam ser limpos … dai coloquei o método em uma classa abstrata e coloquei para todas as minhas classes das entidades do DAO para herdarem … e soh coloquei os campos que deveriam ser limpos em cada uma …

V

Bom dia, alguém encontrou a solução para este problema? Estou com um problema similar: http://www.guj.com.br/posts/list/93554.java#500836

Que acabei criando dois forms na mesma página, me pareceu gambiarra, mas resolveu o problema, só não queria colocar em produção desta forma.

ps.: Nossa! Quando postei não tinha visto que você já havia resolvido, acabei vendo as mensagens anteriores e no desespero que estou coloquei a minha também.
De qualquer forma, do jeito que você fez não me atende pois tenho meus campos que são validados, mas…já existe outro tópico para isso.

Obrigado.

R

rponte:
Se o problema é somente limpar os campos do managed bean eu sempre me utilizo de uma command button como:

&lt;h:commandButton value="limpar" action="#{mbean.limpar}" immediate="true" /&gt;

E no managed bean eu simplesmente limpo os campos necessários:

public String limpar() { this.nome = ""; this.listaDeRegistros = null; return null; }

Mas se por algum motivo isso não estiver funcionando com você, -o que eu acharia estranho-, então talvez isso te ajude,
http://wiki.apache.org/myfaces/ClearInputComponents

Abraços e boa sorte.

Rafael e se no caso eu tivesse que resetar um formulário muito grande acima de 100 componentes, não posso setar vazio("") nos campos(isso prejudicaria muito quando for gerar um xml, pois iria com vazio, isso não pode),
e dar new não é muito viável pois são várias classes isso prejudicaria certo ? (PS. li em alguns blog de desenvolvedores)
preciso fazer com que os campos sejam como quando inicia a aplicação,
tem alguma sugestão ?

E

Tenho um problema semelhante que acontece quando ficam dados no validator. Se eu abrir e fechar o dialog eles reaparecem. Até eu não achar uma solução definitiva e simples estou usando document.forms[‘nomedoform’].reset(); em alguns oncomplete do meu código. Talvez ajude no seu caso.

R

Olá,

Algumas vezes simplesmente limpar os dados do managed bean e repintar o formulário não é suficiente para limpar os valores dos componentes, principalmente depois de algum erro de validação/conversão.

Sendo, sempre ao submeter um formulário para que o mesmo seja limpo você precisa limpar os dados no managed bean e também limpar os dados “sujos” da árvore de componentes. Limpar os dados do managed bean é bem simples, mas para limpar a árvore de componentes vocês podem se utilizar desse método: https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/util/FacesUtils.java#L58

Um método que limpa um formulário seria semelhante a este,

<aside class="onebox githubblob">
  <header class="source">
      <a href="https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/controller/ProdutoBean.java#L78" target="_blank">github.com</a>
  </header>
  <article class="onebox-body">
    <h4><a href="https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/controller/ProdutoBean.java#L78" target="_blank">rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/controller/ProdutoBean.java#L78</a></h4>
<pre class="onebox"><code class="lang-java"><ol class="start lines" start="68" style="counter-reset: li-counter 67 ;">
<li>		produtoService.atualiza(produto);</li>
<li>		facesUtils.adicionaMensagemDeInformacao("Produto alterado com sucesso!");</li>
<li>		lista();</li>
<li>	}</li>
<li>	</li>
<li>	public void volta() {</li>
<li>		limpa();</li>
<li>		setState(ESTADO_DE_PESQUISA);</li>
<li>	}</li>
<li>
</li>
<li class="selected">	private void limpa() {</li>
<li>		produto = new Produto();</li>
<li>		facesUtils.cleanSubmittedValues(form);</li>
<li>	}</li>
<li>	</li>
<li>	public boolean isPesquisando() {</li>
<li>		return ESTADO_DE_PESQUISA.equals(state);</li>
<li>	}</li>
<li>	public boolean isEditando() {</li>
<li>		return ESTADO_DE_EDICAO.equals(state);</li>
<li>	}</li>
</ol>

Estou com um post em draft sobre o assunto, mas me falta tempo e um pouco de coragem para finaliza-lo :frowning:

Um abraço.

A
&lt;h:commandButton type="reset" value="Limpar" /&gt;
R

rponte:
Olá,

Algumas vezes simplesmente limpar os dados do managed bean e repintar o formulário não é suficiente para limpar os valores dos componentes, principalmente depois de algum erro de validação/conversão.

Sendo, sempre ao submeter um formulário para que o mesmo seja limpo você precisa limpar os dados no managed bean e também limpar os dados “sujos” da árvore de componentes. Limpar os dados do managed bean é bem simples, mas para limpar a árvore de componentes vocês podem se utilizar desse método: https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/util/FacesUtils.java#L58

Um método que limpa um formulário seria semelhante a este,

<aside class="onebox githubblob">
  <header class="source">
      <a href="https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/controller/ProdutoBean.java#L78" target="_blank">github.com</a>
  </header>
  <article class="onebox-body">
    <h4><a href="https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/controller/ProdutoBean.java#L78" target="_blank">rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/controller/ProdutoBean.java#L78</a></h4>
<pre class="onebox"><code class="lang-java"><ol class="start lines" start="68" style="counter-reset: li-counter 67 ;">
<li>		produtoService.atualiza(produto);</li>
<li>		facesUtils.adicionaMensagemDeInformacao("Produto alterado com sucesso!");</li>
<li>		lista();</li>
<li>	}</li>
<li>	</li>
<li>	public void volta() {</li>
<li>		limpa();</li>
<li>		setState(ESTADO_DE_PESQUISA);</li>
<li>	}</li>
<li>
</li>
<li class="selected">	private void limpa() {</li>
<li>		produto = new Produto();</li>
<li>		facesUtils.cleanSubmittedValues(form);</li>
<li>	}</li>
<li>	</li>
<li>	public boolean isPesquisando() {</li>
<li>		return ESTADO_DE_PESQUISA.equals(state);</li>
<li>	}</li>
<li>	public boolean isEditando() {</li>
<li>		return ESTADO_DE_EDICAO.equals(state);</li>
<li>	}</li>
</ol>

Estou com um post em draft sobre o assunto, mas me falta tempo e um pouco de coragem para finaliza-lo :frowning:

Um abraço.

valeuu Rafael, funcionou aqui, ficou umas coisas para trás aqui mas resolvemos…
Fico no aguardo do seus post, são muitos bons e referência para quem está aprendendo…

Criado 12 de maio de 2008
Ultima resposta 21 de jan. de 2011
Respostas 26
Participantes 11
Alura POO: o que é programação orientada a objetos? Aprenda os conceitos básicos da programação orientada a objetos, como classes, objetos, herança, encapsulamento e polimorfismo, com exemplos.
Casa do Codigo JavaScript Assertivo: Testes e qualidade de codigo em... Por Gabriel Ramos — Casa do Codigo
Fiap Pos-Tech: Front-end Engineering Pós-Graduação para desenvolver habilidades avançadas em tecnologias front-end, com foco em...