JSF 2.0 - h:commandButton funciona já o h:commandLink não

6 respostas
S

Bom dia pessoal.

Bom estou com o seguinte problema. Em uma página tenho um h:commandButton, que uando clico ele
salva o conteudo de um h:inputTextArea.

<h:inputTextarea id="code" value="#{definicaoMB.conteudoDaDefinicao}" />
<h:commandButton value="Atualizar definição"
	action="#{definicaoMB.salvar}" styleClass="link-contexto-menu">
</h:commandButton>
public String salvar() {

		System.out.println(conteudoDaDefinicao);

		con.setDefinition(new ByteArrayInputStream(conteudoDaDefinicao.getBytes()));

		return "definicao";

	}

Ate ai tudo funciona perfeitamente.

O problema é ue tenho que alterar o commandButton para um h:commandLink. E quando eu
faço a alteração ele executa o método salvar() sem que a variável conteudoDaDefinicao esteja atualizada.

Ou seja, ele esta salvando o valor inicial do h:inputTextArea ignorando as alterações que o usuário fez no texto.

<h:commandLink value="Atualizar Definição" action="#{definicaoMB.salvar}"
	styleClass="link-contexto-menu" ></h:commandLink>

Baicamente oque acontece é que com o commandButton primeiro ele atualiza o valor da variavel e depois
exeuta o método, e com o commandLink ele executa primeiro o método.

Alguem sabe me dizer porque que com o h:commandButton o valor da variavel é o novo e
com o h:commandLink não?

Segundo achei na documentação eles deverião funcionar igual, apenas com a diferênça visual.

Alguem sabe me dizer como resolver isto?

Grato,
Filipe Damiani.

6 Respostas

E

Experimente trocar para actionListerner e como paramentro do salvar (ActionEvent evento)

S

Já havia testado e apresenta o mesmo problema. :S

E

coloca sua view ai e faz o comentario aonde esta o botao

S

Segue.

contexto.xhtml

<!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:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:mj="http://mojarra.dev.java.net/mojarra_ext">
<h:head>

	<link type="text/css" rel="stylesheet"
		href="/infraestruturaWEB/css/style.css" />

	<ui:insert name="headers" />

</h:head>

<h:body>
	<h:form id="formContexto" styleClass="ctxform">

		<h:panelGroup id="menuDeContexto" styleClass="ctxhead"
			layout="block">
			<h:panelGroup id="caminhoDeContexto" styleClass="ctxpath"
				layout="block">
				<ui:insert name="caminhoDeContexto"></ui:insert>
			</h:panelGroup>
			<h:panelGroup id="menuContexto" styleClass="ctxmenu"
				layout="block">
				<ui:insert name="menuDeContexto"></ui:insert>
			</h:panelGroup>
		</h:panelGroup>

		<h:panelGroup id="contexto" styleClass="ctxbody" layout="block">
			<ui:insert name="contexto"></ui:insert>
		</h:panelGroup>

	</h:form>
</h:body>
</html>

definicao.xhtml

<!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:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:mj="http://mojarra.dev.java.net/mojarra_ext">
<ui:composition template="/WEB-INF/templates/contexto.xhtml">

	<ui:define name="menuDeContexto">
		<h:panelGrid columns="2">

			<h:commandLink id="jButtonMenuAtribuirDefinicao"
				value="#{messages.jButtonMenuAtribuirDefinicao}"
				action="atribuirDefinicao" styleClass="link-contexto-menu">
			</h:commandLink>

		</h:panelGrid>
	</ui:define>

	<ui:define name="caminhoDeContexto">
		<h:outputText value=">> #{definicaoMB.caminho}" styleClass="caminho"></h:outputText>
	</ui:define>

	<ui:define name="contexto">
		<h:panelGroup rendered="#{definicaoMB.renderizaConteudoDaDefinicao}">

			<h:inputTextarea id="code" value="#{definicaoMB.conteudoDaDefinicao}" />


			// Este é o commandButton que quero trocar para Link
			<h:commandButton value="Atualizar definição"
				action="#{definicaoMB.salvar}" styleClass="link-contexto-menu">
			</h:commandButton>


		</h:panelGroup>

		<h:panelGroup rendered="#{!definicaoMB.renderizaConteudoDaDefinicao}">
			<h:outputText value="#{messages.jLabelDefinicaoNaoAtribuida}"
				escape="false" />
		</h:panelGroup>

	</ui:define>

</ui:composition>
</html>
E

tenta mudar seu metodo salve para void e faz um redirect na mao

S

Tentei e não resolveu.

Acabei de descobrir que no FireFox funciona, só no IE (testei só no 8) que não funciona.

Tanto o commandButton, quanto o commandLink executão primeiro o Set da variável e depois o método salvar().
Porém no IE, quando o componente é o commandLink no Set da variável vem o valor inicial sem as alterações.
Acho que isto esta ocorrendo por causa de um javaScript que controla o h:inputTextArea.

Vou tentar alguma outra solução.

Obrigado pela ajuda de todos.
[]'s,
Filipe D.

Criado 12 de abril de 2011
Ultima resposta 12 de abr. de 2011
Respostas 6
Participantes 2