Atualizar página JSF + Primefaces

Galera, bom dia.

Hoje de madrugada esgotou todas minhas idéias para atualizar uma página jsf.

é o seguinte:

  • Quando carrego a primeira vez a página ele me carrega os dados certinhos;
  • na segunda vez para frente, os dados ficam os mesmos que foram gerados na primeira vez.

A questão é, como forçar o JSF identificar que é para ele processar a página novamente?

segue trechos dos códigos:

<h:body>
	<h:form id="formPrincipal">
		<p:menubar>
			<p:submenu label="Compras">
				<p:menuitem value="Produtos" url="compra.jsf"/>
				<p:menuitem value="Relatório de Compras" url="compraRelatorio.jsf" actionListener="#{compraRelatorioBean.carregarDados}" />
			</p:submenu>
			<p:submenu label="Manutenção">
				<p:menuitem value="Fornecedores" url="fornecedor.jsf"/>
				<p:menuitem value="Produtos" url="produto.jsf" />
				<p:menuitem value="Usuários" url="#" />
			</p:submenu>
		</p:menubar>
	</h:form>
	<br />
	<br />
	<br />
	<h:form prependId="false">
		<p:dataTable id="dataTable" var="compra"
			value="#{compraRelatorioBean.listaCompra}" paginator="true" rows="10"
			paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
			rowsPerPageTemplate="5,10,15" emptyMessage="Não há compras cadastradas.">
			<f:facet name="header">  
            Compras Efetuadas
        </f:facet>

			<p:column>
				<f:facet name="header">
					<h:outputText value="Código" />
				</f:facet>
				<h:outputText value="#{compra.compraCodigo}" />
			</p:column>
			<p:column>
				<f:facet name="header">
					<h:outputText value="Nota Fiscal " />
				</f:facet>
				<h:outputText value="#{compra.compraNotaFiscal}" />
			</p:column>
			<p:column>
				<f:facet name="header">
					<h:outputText value="Fornecedor" />
				</f:facet>
				<h:outputText value="#{compra.compraDataRecebimento}" />
			</p:column>
			<p:column>
				<f:facet name="header">
					<h:outputText value="Data Recebimento" />
				</f:facet>
				<h:outputText value="#{compra.compraDataRecebimento}" />
			</p:column>
		</p:dataTable>
	</h:form>
</h:body>

Bom dia, qual o escopo do teu ManagedBean?

Vc está utilizando ajax do Primefaces?

Se sim, você deu update no datatable?

Bom dia,

estou usando o session.

O que eu faço é registrar os dados em uma tela e redireciono para outra, a unica coisa que eu não consigo forçar a atualização da página.

[]´s

Nilson

[quote=nilsonmassarenti]Bom dia,

estou usando o session.

O que eu faço é registrar os dados em uma tela e redireciono para outra, a unica coisa que eu não consigo forçar a atualização da página.

[]´s

Nilson[/quote]E como vocÊ faz isso?

é o seguinte. Eu tenho uma página de cadastro de uma venda. Ele pode registrar quantos vendas quiser.

Depois que ele termina de fazer tudo o que quer, ele acessa a página (diferente do cadastro) que ve todas as compras registradas.

Como eu disse, quando a página nunca foi carregada, ele carrega todos os dados, mas se em algum momento foi carregada, todos os dados anteriores ficam em “CACHE” e não são carregado novas atualizações.

Para sintetizar é realizado uma compra, o cara clica no menu bar e é redirecionado para o relatório das compras.

[quote=nilsonmassarenti]é o seguinte. Eu tenho uma página de cadastro de uma venda. Ele pode registrar quantos vendas quiser.

Depois que ele termina de fazer tudo o que quer, ele acessa a página (diferente do cadastro) que ve todas as compras registradas.

Como eu disse, quando a página nunca foi carregada, ele carrega todos os dados, mas se em algum momento foi carregada, todos os dados anteriores ficam em “CACHE” e não são carregado novas atualizações.

Para sintetizar é realizado uma compra, o cara clica no menu bar e é redirecionado para o relatório das compras.

[/quote]
Amigão, tente ser mais assertivo.

quando alguém pergunta como você fez? provavelmente está querendo código.
Com certeza a explicação do funcionamento da tela pode ajudar, mas se postar códigos de exemplo, vai facilitar muito mais a vida de todos :slight_smile:

Meus caros,

conforme o digaoneves disse para ser mais direto nas coisas. Acho que eu fui claro que é forçar a atualização de uma página jsf esm precisar aplicar um update no dataTable, sabendo que ao acaso posso chamar a página (Código no primeiro POST). Caso não tenha ficado claro, preciso saber o que preciso postar para ajudar.

Mas segue parte do código do bean

package br.com.almeidasirtoli.aplicacao.bean;

import java.util.ArrayList;
import java.util.Iterator;

import br.com.almeidasirtoli.aplicacao.dao.DAOCompra;
import br.com.almeidasirtoli.aplicacao.principal.Compra;

public class CompraRelatorioBean {

	private ArrayList<Compra> listaCompra = new ArrayList<Compra>();
	private ArrayList<Object> listaCompras;
	
	public CompraRelatorioBean() {
		carregarDados();
	}

	public void carregarDados(){
		DAOCompra dbCompra = new DAOCompra();
		Object o = null;
		
		this.listaCompras = dbCompra.read(o);
		
		System.out.println("Tamanho: " + listaCompras.size());
		Iterator<Object> it = this.listaCompras.iterator();
		while (it.hasNext()){
			Compra compra = (Compra) it.next();
			listaCompra.add(compra);
		}
	}
	
	public ArrayList<Compra> getListaCompra() {
		return listaCompra;
	}

	
	
}

[]´s

Nilson

Amigo como os colegas acima falaram, daria para ser feito usando ajax do primefaces, que é um ótimo recurso, agora já que você não quer usar, você pode usar esse método na sua bean após a execução do conteudo do método chamado você chamaria esse método


public void refresh() {
		FacesContext context = FacesContext.getCurrentInstance();
		Application application = context.getApplication();
		ViewHandler viewHandler = application.getViewHandler();
		UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
		context.setViewRoot(viewRoot);
		context.renderResponse();
	}

espero ter ajudado.

att.,

1 curtida

Rafael,

não é que eu não queira usar, é pq não dá do jeito que está sendo feito.

última dúvida para terminar como chamo esse método dentro do JSF?

[]´s

Nilson

exemplo:


public void salvar(){
    this.controllerUsuario.save(usuario);
    this.refresh();
}

ele ira forçar o contexto do JSF, para que o mesmo seja atualizado.

entendeu?

1 curtida

Sò ficou uma dúvida. em qual momento ele irá chamar o salvar?

Então cara é muito simples, na sua pagina .XHTML você não tem um botão com action chamando um método qualquer na bean seja ele salvar alterar ou excluir ou consultar

ex:

#{pessoaBean.salvar}
#{pessoaBean.alterar}

etc. isso são EL expression Language que chamam métodos diretamente na sua Bean, certo?

então dentro de um método qualquer que você queira fazer com que a pagina .XHTML seja recarregada você chama esse método refresh


<h:commandButton value="Salvar" id="botaoSalvar" name="botaoSalvar" 
action="#{suaVisao.seuMetodo}">

Bean


public void seuMetodo(){
     suaController.save(seuObjeto); // até aqui é tudo normal a unica diferença, ou seja onde seu método será chamado é aqui
     this.refresh();
}

public void refresh() {  
        FacesContext context = FacesContext.getCurrentInstance();  
        Application application = context.getApplication();  
        ViewHandler viewHandler = application.getViewHandler();  
        UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());  
        context.setViewRoot(viewRoot);  
        context.renderResponse();  
    } 

entendeu companheiro?

abraços.

Coloca seu Bean no escopo de View.

ressuscitaram o topico oO?