Problema ao mostrar valor do bean atualizado

8 respostas
renatakemi

Olá,

Estou com um problema que acredito que seja simples para resolver, mas não estou conseguindo solucioná-lo.
Tenho uma página que mostra um dataTable e no topo da pagina dois campos que eu coloco uma data de inicio e uma de fim para filtrar a minha pesquisa.
Quando eu coloco as datas e mando filtrar, lá na minha lógica ele monta a minha lista, limitando ela com 200 registros, e atualiza a data de inicio com a data do meu ultimo registro da lista.
Até aqui ok!
O que acontece é que na minha pagina ele mostra minha tabela certinha, mas no campo da data de inicio ele nao atualizou a data, ele só atualiza quando eu dou um refresh na pagina.

segue meu código:

view:

<?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"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:p="http://primefaces.prime.com.tr/ui">
      
	<head>      
		
	</head>

	<body>	
		<h:form id="formCon">
			<!-- Tabela de Conexões -->
			<p:panel style="width:98%;margin:8px;" id="conexoes">
				<f:facet name="header">
					<h:panelGrid columns="9" id="filtro">
						<h:outputText value="Tabela de Conexão"/>
						<div style="width:200px"/>
		           		<h:outputText value="Data Inicio: " />
		           		<p:calendar value="#{calendarioBean.data_inicio}"  pattern="dd/MM/yyyy" id="inicio"/>
		           		<div style="width:20px"/>
		           		<h:outputText value="Data Fim: " />
		           		<p:calendar value="#{calendarioBean.data_fim}" pattern="dd/MM/yyyy"/>
		           		<div style="width:20px"/>
		           		<h:commandButton value="Ok" onclick="submit()">
		           		</h:commandButton>
		           	</h:panelGrid>
	            </f:facet>
	            
	            <p:dataTable id="tableHistCon" style="text-align:center;" update="inicio" paginatorPosition="top" errorMessage="Ocorreu erro." emptyMessage="Nenhum registro foi encontrado." rows="12" value="#{historicoConexaoBean.listHistCon_Aux}" var="lista" dynamic="false or true"  paginator="true">

	                <p:column filterBy="#{lista.equipamento.nome}">
			            <f:facet name="header">
		            		<h:outputText value="Equipamento" />
			            </f:facet>
			            <h:outputText value="#{lista.equipamento.nome}" />
	                </p:column>
	                
	                <p:column filterBy="#{lista.dataInicio}">
			            <f:facet name="header">
		            		<h:outputText value="Data Início" />
			            </f:facet>
		 				<h:outputText value="#{lista.dataInicio}"/>
	                </p:column>
	                	                
	                <p:column filterBy="#{lista.dataFim}">
			            <f:facet name="header">
		            		<h:outputText value="Data Fim" />
			            </f:facet>
		 				<h:outputText value="#{lista.dataFim}"/>
	                </p:column>	                
	                	                
	                <p:column filterBy="#{lista.tempoConectado}">
			            <f:facet name="header">
		            		<h:outputText value="Tempo Conectado" />
			            </f:facet>
		 				<h:outputText value="#{lista.tempoConectado}"/>
	                </p:column>
	                
	                <p:column filterBy="#{lista.tempoIndisponível}">
			            <f:facet name="header">
		            		<h:outputText value="Tempo Indisponível" />
			            </f:facet>
			            <h:outputText value="#{lista.tempoIndisponível}" />
	                </p:column>
				</p:dataTable>
			
			</p:panel>	
		</h:form>
	</body>
</html>

bean:

public class HistoricoConexaoBean {

	private List<HistoricoCon_Auxiliar> listHistCon_Aux = new ArrayList<HistoricoCon_Auxiliar>();

	// Declaracao dos Beans para acesso ao banco de dados
	private HistConBean historicoConBean = new HistConBean();
	private EquipamentoBean equipBean = new EquipamentoBean();
	private GraficoConexaoBean graficoConBean = new GraficoConexaoBean();
	private CalendarioBean calBean = new CalendarioBean();
	
	// Criação dos Lists
	private List<HistoricoCon> historico;
	private List<HistoricoCon> _historico;
	private int qtdRegistros=200;
	
	public int getQtdRegistros() {
		return qtdRegistros;
	}

	public void setQtdRegistros(int qtdRegistros) {
		this.qtdRegistros = qtdRegistros;
	}

	// objetos de uso generico
	Equipamento equip;
	HistoricoCon_Auxiliar histCon_Aux;
	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
	SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy");
    
	public void buscaHistorico()
	{
		equip = new Equipamento();
		equipBean.setIdEquipamento(GuardaContaDetalhes.getId_equip());
		equip = equipBean.findById();
		
		historico = new ArrayList<HistoricoCon>();
		historicoConBean = new HistConBean();
		historicoConBean.setEquipamento(equip);
				
		listHistCon_Aux = new ArrayList<HistoricoCon_Auxiliar>();
		i=0;
		
		for(HistoricoCon h:historico)
		{
			if(i==qtdRegistros)
			{
				try 
				{
                                        // Aqui eu atualizo o meu bean com o novo valor
					calBean.setData_inicio(sdfData.parse(h.getDataHoraDesconexao()));
				} 
				catch (Exception e) 
				{
					break;
				}
			}
				
	                i++;

			// Aqui vai o código que monta a minha lista
		}
	}
	
	public void setlistHistCon_Aux(List<HistoricoCon_Auxiliar> list) {
		listHistCon_Aux=list;
	}
	
	public List<HistoricoCon_Auxiliar> getlistHistCon_Aux() {
		listHistCon_Aux = new ArrayList<HistoricoCon_Auxiliar>();
		buscaHistorico();
		return listHistCon_Aux;
	}	
}

Não sei se consegui ser muito clara mas espero que possam me ajudar!

Vlw!

8 Respostas

renatakemi

Alguém tem algum sugestão?
Já procurei aqui no fórum e não achei nada que solucionasse meu problema!

Ygor

Boa tarde Renata;

Experimenta mudar essa linha de código:

<h:commandButton value="Ok" onclick="submit()">

Para

<p:commandButton value="Ok" update="formCon">

O upDate faz a atualização do Id informado através de Ajax; Ja tive problemas com o primefaces quando eu fazia o envio de um formulário atráves de Js (form.submit()) e nunca descobri o por que;

Outra coisa que tu poderia utilizar é o próprio <f:ajax>

<h:commandButton value="Ok">
<f:ajax event="click" execute="@form" render="@form"/>
</h:commandButton>

Creio que seja apenas isso

renatakemi

Oi Ygor!

Muito brigada por responder!
Então, eu tentei utilizar <p:commandButton value=“Ok” update=“formCon”> mas continuou tendo o mesmo comportamento.
Já a segunda opção não chegou nem a rodar, acredito que seja porque eu estou utilizando jsf 1.2.

Tentei usar

<a4j:support event=“oncomplete” reRender=“formCon”/>

com todas as possibilidades de events e ids dos meu componentes.

Não sei qual outra alternativa posso usar. :frowning:

Ygor

Boa tarde Renata;

Como está o código do CalendárioBean? Tu ja debugou para ver até a onde as informações estão indo?
Dei uma olhada melhor no seu código e está me parecendo problema de comunicações entre os beans.
Tu ja tentou acessar direto a propriedade calBean do historicoBean ao invez de criar uma nova instancia de CalendárioBean?
E os escopos dos beans estão setados como?

renatakemi

oi Ygor,

Então, to empacada aqui.
Eu coloquei um system.out para imprimir o meu atributo data_inicio depois que ele passa pela minha logica, e ele realmente está mudando o valor, acredito que só na minha pagina que nao está alterando…
Voce sabe se exixte algum meio de assim que carregar minha tabela, ou a página, ele atualizar meu componente?

Obrigada!!! :wink:

Ygor

Olá Renata;

É a coluna Data_Inicio que não está sendo atualizada né?
E eu pensando que era os <p:calendar/> hahahaha.

Eu te aconselharia a dar uma reestruturada no código do seu MB.
O buscaHistorico(); está sendo chamando em um método Getter. E se tu colocar um println verá que métodos getters são chamandos várias vezes seja no ciclo de vida do JSF ou dentro do próprio escopo do PrimeFaces. O que pode significar uma grande perda de perfomance.
Então tu poderia fazer algo mais ou menos assim;

/*----VIEW:----*/

<h:commandButton value="Ok" onclick="submit()">  

/*PARA*/

<p:commandButton value="Ok" action="#{historicoConexaoBean.buscaHistorico}" update="formCon">

/*----BEAN:----*/

public void buscaHistorico()     {   
        equip = new Equipamento();   
        equipBean.setIdEquipamento(GuardaContaDetalhes.getId_equip());   
        equip = equipBean.findById();  
        /*Resto do código*/
} 
public List<HistoricoCon_Auxiliar> getlistHistCon_Aux() {   
        listHistCon_Aux = new ArrayList<HistoricoCon_Auxiliar>();   
        buscaHistorico();   
        return listHistCon_Aux;   
}

/*PARA*/

public void buscaHistorico()    {   
        listHistCon_Aux = new ArrayList<HistoricoCon_Auxiliar>();
        equip = new Equipamento();   
        equipBean.setIdEquipamento(GuardaContaDetalhes.getId_equip());   
        equip = equipBean.findById();  
        /*Resto do código*/
} 
public List<HistoricoCon_Auxiliar> getlistHistCon_Aux() { 
        return listHistCon_Aux;   
}

Essa mudança ira fazer com que ao clicar no bottão ‘OK’ seja enviado o formulário em seguida, executa o método buscaHistorico(); Após a conclusão faz uma requisição ajax para atualizar o formCon
Creio que isso será suficiente para solucionar o seu problema, mas se mesmo assim ainda não resolver, aconselharia a dar uma revisada nessa lógica por trás dos MB pois pelo que me parece, isso é conflito de chamada de método, algum método sendo chamado antes do outro ou coisa do tipo

renatakemi

Oi Ygor!

obrigada por estar me dando esta ajuda!

Voce estava certo, é o p:calendar que não está atualizando, desculpa se eu nao fui muito clara.
Como vc disse, o método é chamado varias vezes, e eu coloquei um system.out para mostrar se o meu atributo data_inicio foi alterado, e ele foi, e é chamado 4 vezes se eu não me engano.

Ainda estou vendo aqui alguma forma de eu atualizar o meu campo p:calendar.
Não sei se pode ser algum comportamento do prime ou a minha logica mesmo.

Ygor

Que estranho, ja tentou atualizar a versão do Prime?

Aqui eu fiz uma utilização semelhante de <p:calendar> para teste e funcionou perfeitamente, mas estou utilizando jsf 2.0 e primefaces 2.0.1; Talvez seja do proprio comportando do prime, mas acho estranho. Uma reestruturada no código talvez contorne esse problema.

Criado 1 de setembro de 2010
Ultima resposta 6 de set. de 2010
Respostas 8
Participantes 2