[RESOLVIDO] Problemas com action dentro de um dataTable

34 respostas
A

Olá galera, estou com um problema e acredito que alguém já tenha passado por isso.

Para inicio, minha arquitetura é a seguinte: JSF 2 + PrimeFaces 3

Tenho uma listagem de meus objetos em um p:dataTable, e dentro da tabela nas minha linhas tenho links que servirão para editar, deletar etc…

Consigo listar meus objetos normalmente, o problema está nos links. Não consigo invocar os métodos do managedBean quando meu escopo é de request.

segue minha tabela:

<p:dataTable id="tabelaRede" value="#{redeCredenciadaBean.redesCredenciada}" var="rede" style="width:450px" >

		<p:column headerText="Razao" >
			<h:outputText value="#{rede.razaoSocial}" />
		</p:column>

		<p:column headerText="CNPJ" >
			<h:outputText value="#{rede.cnpj}" >
					<f:converter converterId="cnpjConverter" />
			</h:outputText>
		</p:column>

		<p:column headerText="Acao" >
			<h:commandLink action="#{redeCredenciadaBean.carregarVisualizarRedeCredenciada}" >
				<h:graphicImage value="/images/lupa.gif" style="border:0" />
				<f:param id="codigo" name="codigo" value="#{rede.codigo}" />
			</h:commandLink>
		</p:column>

</p:dataTable>

Detalhe, quando o escopo é de Session, Application, View, consigo chamar meus métodos normalmente.
Só que não posso deixar todos meus escopos de Session.

Alguém pode me ajudar?

Agradeço a ajuda.

34 Respostas

C

Você pode deixar o seu bean em scope de @ViewScoped.

Outro ponto deve usar o process de um commandButton por exemplo <p:commandButton process="@this" actionListener="bean.actionListener"> <f:setPropertyActionListener value="#{entity}" target="#{bean.selectedEntity}" /> </p:commandButton>

A

Obrigrado pela resposta cllorente.

Meu problema de deixar como ViewScoped, é que preciso redirecionar meus dados para outra tela para edição, e quando saio da tela
meu ManagedBean morre, pois o escopo é de view… Alguma solução??

L

Lembre-se que sua tabela deve ser envolvida por um h:form.

<h:form>
      <p:datatable>
       ...
      </p:datatable>
</h:form>
A

Essa é minha tabela.

<h:form prependId="false">
		<p:panel header="Pesquisar Rede Credenciada">
				
		<h:panelGrid columns="3">
					
		      <h:outputText value="#{label['ipft.redecredenciada.razaosocial']}" />
		      <p:inputText value="#{usuarioBean.parametroPesquisa}"  size="50"/>
	
		     <p:commandButton value="#{label['ipft.pesquisar']}" ajax="false" actionListener="#{redeCredenciadaBean.pesquisarRedeCredenciada}" />
				<br/>
		</h:panelGrid>

		<p:dataTable id="tabelaRede" value="#{redeCredenciadaBean.redesCredenciada}" var="rede" style="width:450px" >

				<p:column headerText="#{label['ipft.redecredenciada.razaosocial']}" >
					<h:outputText value="#{rede.razaoSocial}" />
				</p:column>

				<p:column headerText="#{label['ipft.redecredenciada.cnpj']}" >
					<h:outputText value="#{rede.cnpj}" >
						<f:converter converterId="cnpjConverter" />
					</h:outputText>
				</p:column>

				<p:column headerText="#{label['ipft.acao']}" >
					<h:commandLink action="#{redeCredenciadaBean.carregarVisualizarRedeCredenciada}" >
							<h:graphicImage value="/images/lupa.gif" style="border:0" />
							<f:param id="codigo" name="codigo" value="#{rede.codigo}" />
					</h:commandLink>
				</p:column>
						  
		</p:dataTable>

	</p:panel>
</h:form>
A

Alguém ?

Obrigado!

H

Como está esse método? #{redeCredenciadaBean.carregarVisualizarRedeCredenciada}

Suas telas estão envolvidas por <h:head> e <h:body> ?

A

Só do <h:body>, pois utilizo facelets e a mesma não é um template…

public String carregarVisualizarRedeCredenciada() {
		System.out.println("teste");
}

Só um método simples para teste.

Se for com escopo de resquest nem consigo invocar o método, mas se for de view consigo normalmente.
O problema de não usar o de view é que preciso mandar os dados para outra tela.

Agradeço aajuda…

Vê se consegue quebrar meu galho :smiley:

C

Em vez de actionListner usa action, você está desligando o Ajax mesmo além de passar para outra página.

Depois de trocar para action verifica se o metodo está sendo executado.

A

Funciona também não, simplesmente dá um reload na página e não invoca o método…

C

Só um chute, muda de commandLink para p:commandButton

A

Também não funciona. Já tentei todo tipo de botão, link e nem sequer invoca…
Tá um aperreio só aqui… E preciso urgentemente resolver esse problema.

A

Alguém ?

B

Qual versão do Mojarra?

Tente assim:

<p:commandLink process=“idDoForm:idDaTabela:idDesteCommandLink”>

</p:commandLink>

A

Não utilizo Mojarra.

Também não funciona com o process.

OBS: o post construtor é chamado normalmente ao clicar no link da tabela;

Já li também que pode está parando em alguma fase do jsf, como poderia interceptar essa fase para verificação?

Agradeço

B

Não usa Mojarra? Como assim?

Mas faz assim:

Coloca um <p:messages id=msg/> e no commandLink manda dar update nele e veja se aparece alguma mensagem.

<p:messages id=msg/>
<p:commandLink update=msg ..../>

Acredito que esteja ocorrendo algum erro na validação do formulário.

Existe um componente de log do primefaces. <p:log />

A

Olha só, usei o p:log e me retorna isso ao clica no link

# Post Data:formRede=formRede&formRede%3Aj_idt26=&javax.faces.ViewState=H4sIAAAAAAAAAJ1VzW8bRRR%2FdmLiJi2kCeqHUERIq4jQdBcHyleoaENTusJpkQ0RhAMZ707tjcY7k5lZe0NoBAdAggNIwC0SSHAsJ%2F4CxA2pSFTiAhfggpAAIS5QLuXN%2BJPEwSojefRm9s17v%2FnNez9f%2FRUyQkk4uEZqxIl1yJwLRFWWiMgMffv5F4dWvx6A9HkYZpwE54mvufRgn65IqiqcBYl44gyYsb%2BexXkUfxkNo5e5rBZoQB9beykM9NzDsYTxF%2FM2AyNR2blUWqO%2Bnn%2F3q%2Bc%2FHFUzLA2QCHM0XoctGEAr1bbSiO2kz6uOiiPnMvGpsjOjWjmUOc%2BS8hLVFR4sJgIxqZBH0Bip%2FRhVwlGTNTGuO%2F3W84dHVt754fe09Rtv%2B3U8Pn79reIfK9cft%2FgQxxSXZYcI4ldor4BeVTDvBvmO5V65xyQ3V8jWHwD32KZEMp40U%2BSHJCALlESOoGo9DhWRhX9%2FvAKwk6%2BilmFUnv%2F0%2BvJPP09sPtXiK6VhogG7QQyt0Ug7Z32NYBaNLURSvwKbriBlqtwdIFwWKr0ru5NUdJVNnpnLzeZO5SaJDZZHTxpReXrqFq8ylSjDwkj97K2zcHvn%2Fss8DGxFHDAvi7cSOHbX2UPtqhns1E%2FbyphD7dXQloT7usnDGhM8MgQ%2B53mRiPXxZyQXVOqNp%2BmGahYVjNli6YK2GMXV7o8IK1MjLAzaPWXdFjhneN1rk%2FLVb7b%2F%2Fi0NqRXrF9NEpLYMqMMaDjDuE7ZsdotY32b3LkCcJ%2FbCeSnW%2FwXUBDiim3lqEgZryCN0hqHR%2BNxtJ4Pc8Jjry10GMZ3cC9NySOsFzvuiuo0Rpb0dNHmRpmUqx3786JM%2FX3vzEaTJa9EkYbTjdzGulqh84%2BoHEyPvf%2F92qx9OWCJnTGxDJFWtM1bW8nZv66%2BDq9v33%2FglDYMeZCsodT4PaB6GfB5HWm5oGLON55o8brPx8pA1yxjbyGSYQ%2FcakSGJtF0m4iYODemFAk5Ca6xRzD3dm6KiJppeQPGkskhqVL7w5Wen39u%2BtpSGdB72%2BUiLukiqrUTDCn0Ce0bDoQa0kLtFiulZ%2BDIpMTqP74jp7u37IsZAYb%2FZHMhuHjKoAWUMPW1DJ6497hIhWOgT0%2FsuvqNR66Lxm7evB7tEHxIsiePdALoiON0RelTCMH4PYis0Go6anj6Hd%2BPlAq1y5KfR3A92yrL334SxhppqcwTuPLapKYqW1RjZCGSEtSUiKWPcYfSxBKv%2FRx9PPTqby8310MfdadsiOL0HrP5KN95WOk1KlBFj9m3TAXyTmb2K4hzRpF%2BLZiWve1FAG%2FhnTc0gon8A1JLUfzIIAAA%3D&javax.faces.partial.ajax=true&javax.faces.source=formRede:tabelaRede:0:j_idt34&javax.faces.partial.execute=@all&formRede:tabelaRede:0:j_idt34=formRede:tabelaRede:0:j_idt34&codigo=20
# Response received succesfully.
# DOM is updated.
# Response completed.

Ve se dá pra enteder o erro e me explicar…

Obrigado pela ajuda.

A

Esqueci de mandar o link que estou invocando.

<p:column headerText="ACAO" >
		<p:commandLink action="#{redeCredenciadaBean.carregarVisualizarRedeCredenciada}" >
				<h:graphicImage value="/images/lupa.gif" style="border:0" />
				<f:param id="codigo" name="codigo" value="#{rede.codigo}" />
		</p:commandLink>
</p:column>
B

Coloca esse codigo ai… e me diz o que aparece nas messages.

<p:messages id=msg/>
<p:column headerText="ACAO" >
		<p:commandLink ajax="true" update="msg" action="#{redeCredenciadaBean.carregarVisualizarRedeCredenciada}" >
				<h:graphicImage value="/images/lupa.gif" style="border:0" />
				<f:param id="codigo" name="codigo" value="#{rede.codigo}" />
		</p:commandLink>
</p:column>
A

Com esse código aí, aparece esse log

# Initiating ajax request.
# Form to post formRede.
# URL to post /ipft/pages/redeCredenciada/listarRedeCredenciada.jsf.
# Post Data:formRede=formRede&formRede%3Aj_idt26=&javax.faces.ViewState=H4sIAAAAAAAAAJ1Vz28bRRR%2B3sTETVpIE9QfQhEhrSICzW4dSkGEijY0pSuctrIhgnAg492pvdF4ZzI7a28IjeAASHAACbhFAgmO5dS%2FoOKGVCQqcYEL9IKQWoR6KeVS3ox%2FkjhYZSSPZnffvPe97733%2BfItSItIwt4VUiV2rAJmnyVReYGI9MBPV7%2Fdt%2FxDH1hnYJBx4p8hnuLShV2qLGlU5sxPxAsnQa%2FdtQzuw%2FhLKxi%2ByGUlT3363Mqbga9mnokljL6RMxEYCUv2%2BeIK9dTsJ9%2B%2F9sVwNMUsgEToq%2FEqbEAfnlKtk4XYpj1esaM4tC8Sj0ZmZ1RFNmX2K6S0QFWZ%2B%2FOJQExRwEOor9Ru9CrhoI6aaNOtdqu5%2FUNLH%2F%2F6p2XsRlt2bYuv3vuwcHvp%2BvMGH%2BKY4LJkE0G8Mu3m0K0I5t4lP7Ps24%2Fp4DqFTO0pcA6tSyTjRb2FXkB8MkdJaAsarcZBRGT%2B3x8vAWzlq6BkEJZmv7m%2B%2BNvvY%2BsvNflKKRirw64TQ6s0VPYpTyGYeX0WIqldgnVHkBKNnC0gHBZEalt0OymrChs%2FOZM9kn06O06Msxxa0pDKExP3mcpEEmkWhmqn7p%2BFB9v5L%2FLANx2xR1cWsxK4tvfZ8VbX9Lf7p3VK60utp4ENCU90koc9JnioCXzVdUMRq8MXJBdUqrWX6VrUaCoYMc3SAW0%2BjCudHxFWukpY4LdmypjNcc4w3Wvj8p0fN%2F%2F%2Bw4LUkrGLaSJSGxrUfgV7GPcIW9RvC9jf%2Bu0jgDif3Ann%2BVj9F1Dt4IBqxKlK6K8ij9BemkZt86jZNHLNY7Ynd2nENL0TpsWA1vKc90T1gEmWIk3DbenJmXcbf%2B1d3jx696YF%2FS5kyihHHvdpDgY8HodKrikYMcPhaGqdxnDkIKMfY2x1HWEazatEBiRU5jER93ApsObyuAmlAAztUxoJiZS7pWBuqGiJypEbX359590PnsWCuc2CNREbu3NxpUjl%2B5c%2FHxv67JePmpM5reVisjtFBUUUPYviSWWBVKl8%2FbsrJz7dvLZggZWDXR6Cic6RSjOJwQhtfHNHwb562gF3ChRTY8FbpMjoLNYRwz3esyL6gMJ%2Br7EwpxykUQNK6HrSuE4cc90hQrDAI3r2HayjVuuCtps11YNtog8JtsThTgAdHuxOD106YRC%2F%2B7ERGgUH9Uyfxtx4KU8rHPmpD%2Fexdlt2%2F5vQp4GG2hyAhw%2BtK4qiZTRG1h1pYW2KSEofHtL6WITl%2F6OPx48eyWZnuujj9rAtEZzcAVZvpRttKZ0iRcqIPvYc0z6sydROTXGaKNJrRDOS19zQp3X8x3TPIKJ%2FAB8IlYsyCAAA&javax.faces.partial.ajax=true&javax.faces.source=formRede:tabelaRede:0:j_idt34&javax.faces.partial.execute=@all&javax.faces.partial.render=formRede:tabelaRede:0:msg&formRede:tabelaRede:0:j_idt34=formRede:tabelaRede:0:j_idt34&codigo=20
# Response received succesfully.
# DOM is updated.
# Response completed.

-
B

SEI, MAS NAO APARECE NEHUMA MENSAGEM NA página, EM VERMELHO?

H

Será que não está exibindo nada pq o id do componente não está entre chaves?

Ou não precisa? :roll:

A

coloquei sim as aspas e não aconteceu nada, nenhuma mensagem em vermelho.

antes que pergunte, está dentro de um form a tabela.

A

Mais alguma sugestão alguém?

Obrigado…

A

Cara se você puder, coloca o tomahawk que você pode usar o save state, aqui tive esse problema e só consegui resolver com ele…

A

Beleza Alberto…

Mas mesmo que eu se o tomahawk, depois de configurado, o que preciso fazer…

Agradeço…

A

Consegui resolver o problema utilizando o tomahawk, mas tenho uma pergunta…

coloquei o save state para salvar o status da minha tabela de dados, funciona legal, masss
quando o save state morre?

Ele segura os dados até quando?

A

Opa que bom… cara desculpa a demora… mas acredito que o estado do save state é maior que request e menor que session, acredito que ele deva “morrer” logo após a requisição, porém como se fosse dois requests, desculpa se estiver falando besteira mas acho que é isso…

A

Que nada cara, tomara que seja mesmo, pois vai ficar assim…
Valeu a ajuda aí cara, qualquer coisa estamos por ae…

A

Blz… só tem uma coisa, só deve estar funcionando porque se reparar a URL não altera a cada operação que você clica e se der um F5 ele vai refazer a última ação que você executou, porém, o que me disseram é que para resolver isso(troca da URL) basta dar um redirect, porém o save state para de funcionar.

Se você não estiver fazendo o redirect, poderia me dizer se a url não troca mesmo? e isso para o seu sistema não tem problema? se você acabar de criar um registro e na tela de view(ou lista ou qq outra) você der um F5 verifica se tentou inserir o mesmo registro? se fez isso como você vai tratar?

Obrigado e desculpa tanta pergunta rsss é que aqui temos esses problemas direto e estamos usando session para la e para cá, menos nas listagens que estão sob demanda…

[]'s
Alberto

A

Não, ele não muda a URL, fica sempre atrasado uma requisição…

E para nós isso não é problema, pois a nossa URL é fixa e não muda para o usuário final.

E o problema do F5 não temos, pois ao criar, editar um objeto é redirecionado para uma tela de visualização.

Se poder te ajudar, estou por aqui.

A

como você redireciona para tela de visualização ? é no faces config ou no handler?

pode me enviar o trecho para eu ver se fazemos assim?
no seu F5 não aconteceu a chamada da mesma requisição? eu coloco um breakpoint no método que chamou o salvar e para lá denovo…
nossa aqui acontece :frowning:

[]'s
Alberto

A

Utilizo JSF 2, e faço o redirecionamento normal

Lembrando que é outra tela. A tela de cadastro é outra.

T

Estou com o mesmo problema… ele nao executa o action do commandLink. O engracado q ele executa o target="_blank"

<h:column>
					<h:commandLink action="#{requisicaoBean.editarItem}" immediate="true"  target="_blank">
						<h:graphicImage library="imagens" name="editar16.png"  />
						<f:setPropertyActionListener target="#{requisicaoBean.codigoRequisicao}" value="#{req.codigoRequisicao}"/>
						<f:setPropertyActionListener target="#{requisicaoBean.destinoSalvarItem}" value="pages/vip/movimentacao_item"/>
					</h:commandLink>
				</h:column>

Vou colocar a pagina completa aqui:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="/templates/interna.xhtml">
	<ui:define name="titulo">
Requisições
</ui:define>
	<ui:define name="corpo">
		<h:form id="cadastro">
			<h:messages />
			
			<br/>
		    
		    	
				<h:dataTable value="#{requisicaoBean.reqMoviItem}" var="req" rules="rows" cellpadding="5" >  
                <f:facet name="caption">  
                    
                </f:facet>  
                <f:facet name="header">Lista de itens</f:facet>  
                  <f:facet name="footer">Final da listagem</f:facet>  
                 <h:column>  
                    <f:facet name="header">#R</f:facet>  
                     <h:outputText value="#{req.codigoRequisicao}" /> 
                </h:column>  
                <h:column>  
                    <f:facet name="header">Item</f:facet>  
                    #{req.nomeItem}
                </h:column>  
                <h:column>  
                    <f:facet name="header">Qntd Solicitada</f:facet>  
                 #{req.quantidadeSolicitada}
                </h:column>  
               <h:column>  
                    <f:facet name="header">Qntd Atendida</f:facet>  
                   #{req.quantidadeAtendida}
               </h:column>
               <h:column>
					<h:commandLink action="#{requisicaoBean.editarItem}" immediate="true"  target="_blank">
						<h:graphicImage library="imagens" name="editar16.png"  />
						<f:setPropertyActionListener target="#{requisicaoBean.codigoRequisicao}" value="#{req.codigoRequisicao}"/>
						<f:setPropertyActionListener target="#{requisicaoBean.destinoSalvarItem}" value="pages/vip/movimentacao_item"/>
					</h:commandLink>
				</h:column>
            </h:dataTable>
         
            		<br/>
            			<br/>
				
           			 <h:outputText value="Status:"/>  
        				<h:selectOneMenu value ="#{requisicaoBean.status}">
 						<f:selectItem itemLabel="Selecione" itemValue=""/>  
 						<f:selectItems 
 								value="#{requisicaoBean.listarNomeStatus}"
 								var ="listarNomesStatus"
								itemValue="#{listarNomesStatus}"
								itemLabel="#{listarNomesStatus}"/>
						</h:selectOneMenu> 
						
							<h:commandButton action="#{requisicaoBean.salvar}" value="Atualizar" />
							
        </h:form>  
    </ui:define>  
</ui:composition>  
</html>
A

Tiago, tenta fazer assim:

Usa o Tomahawk, que irá funcionar.

xmlns:t="http://myfaces.apache.org/tomahawk"
<t:saveState value="#{requisicaoBean.reqMoviItem}"/>
Criado 23 de janeiro de 2012
Ultima resposta 23 de abr. de 2013
Respostas 34
Participantes 7