Confirmação de exclusão

Saudações caros.
Tentei fazer uma janela de confirmação de exclusão hoje, o.k. tudo parecia estar certo, funcionava e talz, porém minha dúvida é simples: como farei para que depois da execução do método, a minha página pudesse ser atualizada, porquê até então o que acontece é que o registro é excluído porém ele permanece na tela até que o usuário "recarregue" a página, então ela não é atualizada automaticamente.
Como proceder para resolver este problema?

<?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">

<ui:composition template="../template/template.xhtml">
	<ui:define name="content">
		<rich:panel header="Lista os registros">
			<h:form id="table">

				<h:panelGrid columns="2">
					<a4j:outputPanel id="eventoPanel">
						<h:outputText value="Sem registros para exibir!"
							rendered="#{empty eventoBean.eventos}" />

						<rich:dataTable value="#{eventoBean.eventos}" var="evento"
							id="eventosTable" rows="8" iterationStatusVar="item">

							<rich:column>
								<f:facet name="header">
									<h:outputText value="Nome do evento" />
								</f:facet>
								<h:outputText value="#{evento.nome}" />
							</rich:column>

							<h:inputHidden value="#{evento.id}" />
							<rich:column style="text-align:center;">
								<f:facet name="header">
									<h:outputText value="Data do evento" />
								</f:facet>
								<h:outputText value="#{evento.dataEvento}">
									<f:convertDateTime pattern="dd/MM/yyyy" />
								</h:outputText>
							</rich:column>

							<rich:column style="text-align:center;">
								<f:facet name="header">
									<h:outputText value="Operações" />
								</f:facet>

								<h:commandLink action="edit"
									actionListener="#{eventoBean.preparaALteracao}">
									<f:param name="id" value="#{evento.id}" />
									<h:graphicImage value="/pages/images/edit.gif" />
									<rich:tooltip value="alterar"></rich:tooltip>
								</h:commandLink>



								<h:commandButton value="excluir">

									<rich:componentControl target="popup" operation="show" />
								</h:commandButton>
								<rich:popupPanel id="popup" modal="true" resizeable="true"
									onmaskclick="#{rich:component('popup')}.hide()">
									<f:facet name="header">
										<h:outputText
											value="Realmente deseja exclujir esete registro?" />
									</f:facet>
									<a4j:commandButton value="cancelar"
										onclick="#{rich:component('popup')}.hide(); return false;">
									</a4j:commandButton>

									<a4j:commandButton value="remover" render="@form"
										execute="this" immediate="true"
										actionListener="#{eventoBean.remove()}"
										onclick="#{rich:component('popup')}.hide()">
										<f:param name="id" value="#{evento.id}" />
									</a4j:commandButton>
								</rich:popupPanel>
							</rich:column>



							<f:facet name="footer">
								<rich:dataScroller for="eventosTable" maxPages="5" />
							</f:facet>
						</rich:dataTable>
					</a4j:outputPanel>
					<ui:include src="confirmaExclusao.xhtml"></ui:include>
				</h:panelGrid>
			</h:form>
		</rich:panel>
	</ui:define>
</ui:composition>
</html>

O reRender não funciona?

Bom dia

tenta logo apos fazer a exclusao, no mesmo metodo de exclusão do seu MBean trazer uma nova lista eventos do BD e atribui-la a lista de eventos do seu Mbean, ai quando o rerender for executado sua lista estara atualizada .

ou vc pode tambem no seu metodo de exclusão do MBean apos excluir o evento do banco remove-lo da lista de eventos do MBean terá o mesmo efeito da consulta e será mais performatico

obs: ao aderir a segunda opção voce pode acarbar ficando com dados na tele inconsistentes, pois outras pessoas ja podem ter alterado os dados

Acredito que a forma mais facil seja após executar seu método de exclusão, realizar a consulta novamente ao BD para recarregar a lista. No próprio metodo de exlusão do seu MB vc faz a chamada do método de consulta.

Bom dia, vinicius, passarei o código do meu managed bean.
Como posso fazer isso?


package br.com.estudo.managedbeans;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;

import br.com.estudo.modelo.Evento;
import br.com.estudo.repository.EventoRepository;

@ManagedBean
public class EventoBean {

	private Evento evento;
	private List<Evento> eventos;
	private Evento eventoSelecionado;

	public EventoBean() {
		evento = new Evento();
		eventos = new ArrayList<Evento>();
	}

	public void adiciona() {
		EntityManager manager = this.getManager();
		EventoRepository repository = new EventoRepository(manager);
		if (this.evento.getId() == null) {
			repository.adiciona(this.evento);
		} else {
			repository.atualiza(this.evento);
		}
		this.evento = new Evento();
		this.evento = null;
	}

	public void preparaALteracao() {
		Map<String, String> params = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap();
		Long id = Long.parseLong(params.get("id"));
		EntityManager manager = this.getManager();
		EventoRepository repository = new EventoRepository(manager);
		System.out.println(id);
		this.evento = repository.procura(id);

	}

	public void altera() {
		EntityManager manager = this.getManager();
		EventoRepository repository = new EventoRepository(manager);
		repository.atualiza(evento);
	}

	public void remove() {
		Map<String, String> params = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap();
		Long id = Long.parseLong(params.get("id"));
		EntityManager manager = this.getManager();
		EventoRepository repository = new EventoRepository(manager);
		repository.remove(id);
		this.evento = null;
	}

	public void limpar() {
		evento = new Evento();
		eventos = new ArrayList<Evento>();
	}

	public List<Evento> completeEvento(String query) {
		EntityManager manager = this.getManager();
		EventoRepository repository = new EventoRepository(manager);
		List<Evento> results = new ArrayList<Evento>();
		if (eventos.isEmpty()) {
			this.eventos = repository.complete();
		}
		for (Evento e : eventos) {
			if (e.getNome().startsWith(query)) {
				results.add(e);
			}
		}
		return results;
	}

	public List<Evento> getEventos() {
		if (this.eventos.isEmpty()) {
			EntityManager manager = this.getManager();
			EventoRepository repository = new EventoRepository(manager);
			this.eventos = repository.getLista();
		}
		return this.eventos;

	}

	public Evento getEvento() {
		return evento;
	}

	public void setEvento(Evento evento) {
		this.evento = evento;
	}

	public Evento getEventoSelecionado() {
		return eventoSelecionado;
	}

	// public void setEventoSelecionado(Evento eventoSelecionado) {
	// this.eventoSelecionado = eventoSelecionado;
	// System.out.println("ES: " + eventoSelecionado.getNome());
	// consulta(eventoSelecionado);
	// }

	public void setEventos(List<Evento> eventos) {
		this.eventos = eventos;
	}

	private EntityManager getManager() {
		FacesContext fc = FacesContext.getCurrentInstance();
		ExternalContext ec = fc.getExternalContext();
		HttpServletRequest request = (HttpServletRequest) ec.getRequest();
		return (EntityManager) request.getAttribute("EntityManager");
	}

}


Em relação à reREnder, como estou usando a4j command button ele só permite usar render.

então, não creio que isto será uma opção…

uma ideia

 public void remove() {  
        Map<String, String> params = FacesContext.getCurrentInstance()  
                .getExternalContext().getRequestParameterMap();  
        Long id = Long.parseLong(params.get("id"));  
        EntityManager manager = this.getManager();  
        EventoRepository repository = new EventoRepository(manager);  
        repository.remove(id);  
        this.evento = null; 
        this.eventos.clear(); // aqui vc limpa lista 
        getEventos(); // aqui vc reconsulta

    }  

isso é so uma forma de fazer

vc pode fazer assim tambem

public void remove() {  
        Map<String, String> params = FacesContext.getCurrentInstance()  
                .getExternalContext().getRequestParameterMap();  
        Long id = Long.parseLong(params.get("id"));  
        EntityManager manager = this.getManager();  
        EventoRepository repository = new EventoRepository(manager);  
        repository.remove(id);  
        this.evento = null; 
        this.eventos = repository.getLista(); // reconsulta 

    }  

Você pode fazer assim, acredito que dê certo.
Após remover o registro, vc realiza a consulta novamente atualizando a lista.

	public void remove() {
		Map&lt;String, String&gt; params = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap();
		Long id = Long.parseLong(params.get("id"));
		EntityManager manager = this.getManager();
		EventoRepository repository = new EventoRepository(manager);
		repository.remove(id);
		this.evento = null;
		/* LIMPA A LISTA PARA ARMAZENAR O RESULTADO DA NOVA CONSULTA */
		this.eventos = null;
		/* AQUI VC REALIZA A CONSULTA NOVAMENTE */
		this.eventos = getEventos();
	}
}

Você pode utilizar seu método limpar().

public void limpar() {   
        evento = new Evento();   
        eventos = new ArrayList<Evento>();   

    } 

	public void remove() {
		Map<String, String> params = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap();
		Long id = Long.parseLong(params.get("id"));
		EntityManager manager = this.getManager();
		EventoRepository repository = new EventoRepository(manager);
		repository.remove(id);
		this.evento = null;
		limpar();
		/* AQUI VC REALIZA A CONSULTA NOVAMENTE */
		this.eventos = getEventos();
	}
}

Vou testar agora, desde já, te agradeço demais.

Brigadão.!!!