[RESOLVIDO]Como passar um Componente por parâmetro no JSF?

Galera, eu preciso chamar esse método para limpar a árvore de componentes, como poderia fazer ?

public static void cleanSubmittedValues(UIComponent component){
Uma pessoa me disse pra utilizar o <f:attribute /> mas sinceramente não tenho ideia de como fazer …

<p:commandButton value="Limpar" update="cadastroCliente,growl" action="#{clienteBean.cleanSubmittedValues}" image="ui-icon ui-icon-trash" immediate="true" ajax="false" process="@none"> <f:attribute name=""/> </p:commandButton>

Você poderia passar o id do componente.

Caso seu objetivo seja limpar os dados do formulário, dê uma olhada no primefaces-extensions, eles já tem um componente para isso, onde se passa o id do componente:

http://fractalsoft.net/primeext-showcase-mojarra/sections/resetEditableValues/usageFormElements.jsf

Certo, eu preciso limpar vários inputs dentro de um form, eu deveria passar o id do form ? seria isso ?
Esse primeextensio é possivel usar com o primefaces ?

O extensions é um projeto a parte, mas eles tem apoio da equipe do primafaces.

Legal, então é o mesmo esquema, baixar o Jar registrar e usar ?
Eu procurei no site lá e não tem download do Jar, sabe se é isso mesmo ?

Cara, eu baixei o War do projeto e peguei o Jar, porém ele não me deixa registrar o Jar no ClassPath, seria algo relacionado a versão do Prime ? Pois uso a 3.0.1, teria algo haver ? Já que no projeto estão usando o 3.2

Tenta aqui: http://code.google.com/p/primefaces-extensions/downloads/list

Lembrando que essa solução deles é para os casos de update ajax, onde ocorrem erro de validação, e o formulário não atualiza. Isso está detalhado pelo pelo Rafael Pontes: http://www.rponte.com.br/2011/06/07/limpando-a-arvore-de-componentes/

Talvez tenha alguma diferença para versões do primefaces.

Esse link do Rafael P. li bastante ontem, por isso não entendi como passar um Componente como parâmetro …
Mas enfim … olha só o problema que estou tendo ao tentar add o Jar ao ClassPath :

Could not write file: C:\Documents and Settings\FISCAL\workspace\Contabilidade\.classpath. C:\Documents and Settings\FISCAL\workspace\Contabilidade\.classpath (Acesso negado)

Se entendi você tem componentes no formulário e quer limpar os valores preenchidos na action desse botão certo?

Se você tem na sua tela um binding como esse…

<h:inputText value="#{clienteBean.pessoa.nome}" />

Na action do botão basta construir um objeto pessoa novamente para que os valores default sejam atribuídos, então os campos serão limpos.

<p:commandButton value="Limpar" update="cadastroCliente,growl" action="#{clienteBean.cleanSubmittedValues}" image="ui-icon ui-icon-trash" immediate="true" ajax="false"          
</p:commandButton>    

class ClienteBean {
     public String cleanSubmittedValues() {
           setPessoa(null);
           return null; //para permanecer na mesma página;
     }

     public Pessoa getPessoa() {
            if(pessoa == null) {
                    pessoa = new Pessoa();
            }
            return pessoa;
     }
}

Na verdade eu crio outro objeto qdo chamo o botão Limpar, mas o form não é limpo, então no site do R.Pontes fui um posto sobre Limpar árvore de componentes, porém não sei como implementar isso no meu projeto.

[code]<h:form prependId=“true” id=“cadastroCliente” >
<h:panelGrid style=“text-align:center; align:center;width:100%;” columns=“1”>
<p:growl />
<p:column>
<p:commandButton value=“Anterior” ajax=“false” update=“cadastroCliente” actionListener="#{clienteBean.buscaA}" image=“ui-icon-arrowthick-1-w”/>
<p:commandButton value=“Próximo” ajax=“false” update=“cadastroCliente” actionListener="#{clienteBean.buscaP}" image=“ui-icon-arrowthick-1-e”/>
<p:commandButton value=“Salvar” ajax=“false” update=“cadastroCliente” actionListener="#{clienteBean.adiciona}" image=“ui-icon ui-icon-disk”
rendered="#{empty clienteBean.cliente.id}"/>
<p:commandButton value=“Atualiza” ajax=“false” update=“cadastroCliente,tblclientes,growl” actionListener="#{clienteBean.atualiza}" image=“ui-icon ui-icon-refresh”
rendered="#{not empty clienteBean.cliente.id}"/>
<p:commandButton value=“Limpar” update=“cadastroCliente,growl” action="#{clienteBean.cleanSubmittedValues}" image=“ui-icon ui-icon-trash”
immediate=“true” ajax=“false” process="@none">
<f:attribute name=""/>
</p:commandButton>
<p:commandButton value=“Listar” icon=“ui-icon-search” ajax=“true” immediate=“true” oncomplete=“janelaClientes.show()”/>
</p:column>
<p:separator/>
</h:panelGrid>

					<h:panelGrid columns="2" columnClasses="colunaEsquerda,colunaDireita">
									<h:outputText value="ID :" for="cliente-id"/>
									<p:inputText 
												id="cliente-id"
												value="#{clienteBean.cliente.id}"
												size="5">
										<p:ajax event="blur" update="cadastroCliente" listener="#{clienteBean.busca}" />
									</p:inputText>
									
									<h:outputText value="Nome :" for="cliente-nome"/>
									<p:inputText 
												id="cliente-nome"
												required="true"
												value="#{clienteBean.cliente.nome}"
												size="25"
												onkeyup="this.value = this.value.toUpperCase();">
									</p:inputText>[/code]

Preciso chamar esse método:

[code]public static void cleanSubmittedValues(UIComponent component){

    if (component instanceof EditableValueHolder) {
        EditableValueHolder evh = (EditableValueHolder) component;
        evh.setSubmittedValue(null);
        evh.setValue(null);
        evh.setLocalValueSet(false);
        evh.setValid(true);
    }
    // Dependendo de como se implementa um Composite Component, ele retorna ZERO
    // na busca por filhos. Nesse caso devemos iterar sobre os componentes que o 
    // compõe de forma diferente.
    if(UIComponent.isCompositeComponent(component)) {
        Iterator i = component.getFacetsAndChildren();
        while(i.hasNext()) {
            UIComponent comp = (UIComponent) i.next();

            //TODO: isolar em um método?
            if (comp.getChildCount() > 0) {
                for (UIComponent child : comp.getChildren()) {
                    cleanSubmittedValues(child);
                }
            }
        }
    }[/code]

Eu tive o mesmo problema tempos atras com jsf 1.2, resolvi da seguinte forma:

HXTML:


	<h:form id=form1" binding="#{bean.form}">
							
		<a4j:commandButton value="Voltar" immediate="true" type="button"
									action="#{bean.actionListar}" tabindex="6"
									oncomplete="#{rich:component('modal1')}.hide();return false;" />
				
	</h:form>

BEAN:


private UIForm form = new UIForm();

	public void actionListar(){
		limparCampos();
		if(form !=null) Util.cleanSubmittedValues(form);
	}

Explicando:
Tenho o form como binding, e quando clico no botão voltar eu limpo o objeto e chamo o .cleanSubmittedValues para limpar a árvore de componentes!

Espero que seja resolva o teu problema

Estanho, atribuir os valores default era para resolver o problema, mas acredito que seja em função da presença do atributo immediate=“true” no seu botão.

No link do rponte explica que em certas ocasiões, não resolve apenas limpar o objeto, tem que limpar a arvore de componentes!

http://www.rponte.com.br/2011/06/07/limpando-a-arvore-de-componentes/

o immediate = true é apenaspara realizar a ação do botão sem fazer nenhuma outra validação

Blz, desconfiei do immediate=“true” apenas por ele agir diretamente na fase PROCESS VALIDATE do clico de vida do JSF.
Dessa forma pode inibir os valores que serão processados no RESTORE VIEW.
Acho que vale a pena testar sem o atributo só por desencargo de consciência. hehe

No meu caso eu precisava do immediate, por que caso o usuário clicasse no voltar e tivesse algum campo com required=true sem dado ele não ia voltar!

Galera, mais uma vez com a ajuda de vcs consegui resolver mais um problema, bem acabei que não precisei limpar a Árvore, então basicamente ficou apenas assim:

<p:commandButton value="Limpar" update="cadastroCliente,growl" action="#{clienteBean.limparForm}" image="ui-icon ui-icon-trash" immediate="true" process="@this"> <pe:resetEditableValues for="cadastroCliente"/>//ESSE CARA </p:commandButton>

Resumindo a minha solução foi o [quote]resetEditableValues[/quote] … vlw