smnj
Abril 15, 2012, 11:20pm
#1
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>
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.
smnj
Abril 16, 2012, 8:10am
#5
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");
}
}
smnj
Abril 16, 2012, 8:15am
#6
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<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;
/* 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();
}
}
smnj
Abril 16, 2012, 12:30pm
#10
Vou testar agora, desde já, te agradeço demais.