JSF: Como fazer para alterar o valor do textfield?

6 respostas
ssousuke

Ola a todos, estou fazendo um teste aqui usando JSF 1.2 e estou tentando fazer uma coisa simples mas não consigo resolver de forma alguma…

eu tenho um formulario e gostaria de alterar o valor de um combo e conforme o valor deste combo, fosse alterado o valor de um textfield do mesmo formulario…
o codigo do jsp é:

<h:form id="form">
	
	<h:messages showDetail="true" showSummary="false"  />
	<BR> Nome: <h:inputText id="nome" value="#{pessoaMB.nome}" required="true" />
	<BR> <h:selectOneMenu id="combo" valueChangeListener="#{pessoaMB.comboAlterado}" onchange="submit()" immediate="true">
			<f:selectItem itemLabel="" itemValue="escolha"/>
			<f:selectItem itemLabel="Jose" itemValue="Jose"/>
			<f:selectItem itemLabel="Fatima" itemValue="Fatima"/>
			<f:selectItem itemLabel="Roberta" itemValue="Roberta"/>
	</h:selectOneMenu>
	<BR>
	<BR> <h:commandButton action="#{pessoaMB.ok}" value="ok" />
	
</h:form>

e o codigo do managed bean é:

public void comboAlterado(ValueChangeEvent e) {
	this.nome = ((HtmlSelectOneMenu) e.getComponent()).getValue().toString();
	FacesContext.getCurrentInstance().renderResponse();
}

porém alterando o atributo ‘nome’ da classe, quando volta para o jsp o valor não é alterado (permanece o mesmo)…
tb tentei da seguinte maneira

public void comboAlterado(ValueChangeEvent e) {
	
    String valorDoCombo = ((HtmlSelectOneMenu) e.getComponent()).getValue().toString();
	
    HtmlInputText textNome = (HtmlInputText) FacesContext.getCurrentInstance().getViewRoot().findComponent("form.nome");
    textNome.setValue(valorDoCombo);

    FacesContext.getCurrentInstance().renderResponse();
}

mas tb não funcionou… Simplesmente o valor não é alterado…

Estou usando java 6, tomcat 6, JSF 1.2
Tentei usar tanto a implementação “RI” (mojarra-1.2_09) quanto a “myfaces” (myfaces-1.2.4) e continua não funcionando… portanto creio q seja burrice minha mesmo! rs

oh… e agora quem poderá me defender??? hauahu

valeu ai pela ajuda pessoal!
abraços

6 Respostas

javax.skol

Eu faria isso usando Ajax4JSF

toda vez que o envento for alterado ele renderiza o componente “nome”

ssousuke

Opa!!!!

então kara... tentei uma coisa parecida usando RichFaces (q pra variar tb estou aprendendo.. rsrs) e não funcionou!!!! (só pra variar um pouco!! hauahu)

tentei o seguinte

<h:form id="form">

		<rich:panel header="Simple Echo">

			<rich:messages showDetail="true" />
			
			<h:inputText size="50" value="#{richMB.text}" id="tf" required="true" immediate="true">
				<f:validateLength minimum="3" />
			</h:inputText>
			<BR>
 			<a4j:commandButton value="Teste" reRender="tf" action="#{richMB.duplicar}" immediate="true"/>
		</rich:panel>
</h:form>

e no manged bean

public String duplicar() {
	
	System.out.println("RichMB.duplicar()");
	
	text += " " + text;
	
	HtmlInputText tf = (HtmlInputText) FacesContext.getCurrentInstance().getViewRoot().findComponent("form:tf");
	tf.setValue(tf.getValue() + " " + tf.getValue());
	
	//FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().put("form:tf", "caramba");
	
	return null;
    }

acontece o mesmo erro... Quando eu não coloco valor algum no textfield ele aparece o erro de validação e não atualiza o text.. porém quando eu coloco um conteudo no textfield ai tudo funciona perfeitamente (fazendo ajax e tudo mais...)

por que será q não estou conseguindo resolver isso??? já estou a uns "bons" dias nisso hein!!!! :twisted: ahuah

valeu ai a ajuda!!!

Rodrigo_Rocha_de_Mor

Vei, se eu fosse vc, dava uma procurada no Google sobre o Ciclo de Vida de JSFe a ordem em que as coisas acontecem…
Aí vc vai entender por que ele está reclamando do campo obrigatório vazio quando vc executa a action…

[]'s

ssousuke

Vei, se eu fosse vc, dava uma procurada no Google sobre o Ciclo de Vida de JSFe a ordem em que as coisas acontecem…
Aí vc vai entender por que ele está reclamando do campo obrigatório vazio quando vc executa a action…

rs… depois vc tenta rodar esse exemplo no seu PC!!! não funciona!!! hauhau

eu já to manjando o ciclo de vida… adicionei um listener pra mostrar cada fase…
os logs impressos foram

Before RESTORE_VIEW
After RESTORE_VIEW
Before APPLY_REQUEST_VALUES
RichMB.duplicar()
After APPLY_REQUEST_VALUES
Before RENDER_RESPONSE
After RENDER_RESPONSE

repare que não passou pela etapa de validação… mas mesmo assim não funciona…
mas vamos lá… uma hora eu tenho q conseguir!! haha

falow ai!!!
valeu pela ajuda

urubatan

tenta alterar o valor do binding e não diretamente do text field, é para isto que serve value binding.

ssousuke

OLa!!

Mesmo colocando o campo nome como binding o problema continua acontecendo... pois o textfield "nome" só é alterado quando não existe erro de validação...

O codigo agora ficou desta maneira:

JSP
<h:form id="form">

	<h:messages showDetail="true" showSummary="false" />

	Nome: <h:inputText id="nome" required="true" binding="#{pessoaMB.nome}"	label="Nome" immediate="true" />

	<h:selectOneMenu valueChangeListener="#{pessoaMB.comboAlterado}" onchange="submit()" immediate="true">
		<f:selectItem itemValue="Felipe" itemLabel="Felipe" />
		<f:selectItem itemValue="Raquel" itemLabel="Raquel" />
		<f:selectItem itemValue="Jose" itemLabel="Jose" />
	</h:selectOneMenu>
	<BR>
	<BR>
	<h:commandButton action="ok" value="Ok" />
</h:form>

e o MB assim:

HtmlInputText nome;

public void comboAlterado(ValueChangeEvent e) {
	nome.setValue(e.getNewValue());
	FacesContext.getCurrentInstance().renderResponse();
}

Agradeço a ajuda e atenção de todos!!
abraços

Criado 31 de agosto de 2008
Ultima resposta 8 de set. de 2008
Respostas 6
Participantes 4