Olá pessoal, boa noite.
Estarei aqui demonstrando como exibir a mensagem de sucesso ou erro após a submissão do form no JSF 2.0 com o Primefaces 2.1.
Primeiro temos a página xhtml, onde possuímos um p:dialog que ficará responsável por exibir a mensagem que o Managed Bean retornar durante a persistência de determinado objeto na base.
<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui">
<ui:composition template="/resources/template.xhtml">
<ui:define name="login">
<ui:include src="/resources/usuarioAutenticado.xhtml" />
</ui:define>
<ui:define name="javascript">
<script type="text/javascript" src="${facesContext.externalContext.requestContextPath}/js/jquery.maskedinput-1.2.2.js"></script>
<script type="text/javascript" src="${facesContext.externalContext.requestContextPath}/js/jquery-1.4.2.js"></script>
<script type="text/javascript" src="${facesContext.externalContext.requestContextPath}/js/funcoes.js"></script>
</ui:define>
<ui:define name="centro">
<p:outputPanel id="oplDialog" layout="block">
<p:dialog id="dlgMsg" header="#{msg['modalPanel.msgAlerta']}"
position="center" minWidth="300" width="300" visible="true"
resizable="false" modal="true" rendered="#{perfilController.exibeDialog}">
<h:panelGrid columns="1" cellspacing="5px">
<h:outputLabel id="oplMensagem" value="#{perfilController.mensagem}" styleClass="fonteAlerta" />
<h:commandButton id="cbtOk" value="#{msg['botao.ok']}"
action="/jsf/perfil/exibirPerfis?faces-redirect=true" immediate="true">
</h:commandButton>
</h:panelGrid>
</p:dialog>
</p:outputPanel>
<p:outputPanel id="pnlCentro" layout="block" style="position: relative; margin: auto; margin-top: 30px; width: 900px;">
<p:panel id="pnlCorpoPerfil" style="position: relative; margin: auto; margin-top: 20px; width: 900px;"
rendered="#{!perfilController.exibeListaPerfis}">
<f:facet name="header">
<h:outputText value="#{msg['perfil.detalhe']}" />
</f:facet>
<h:panelGrid id="pgrPerfil" columns="3">
<h:outputLabel value="*" styleClass="fonteAlerta">
<h:outputLabel styleClass="fontePadrao" value="#{msg['perfil.nome']}" />
</h:outputLabel>
<h:inputText id="iptNome" value="#{perfilController.perfil.nmPerfil}" size="21" maxlength="20"
onkeyup="this.value = somenteCaracteres(this.value)" required="true" requiredMessage="#{msg['perfil.nome.requerido']}"
readonly="#{perfilController.somenteLeitura}" />
<h:message for="iptNome" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
<h:outputLabel value="*" styleClass="fonteAlerta">
<h:outputLabel styleClass="fontePadrao" value="#{msg['perfil.descricao']}" />
</h:outputLabel>
<h:inputText id="iptDescricao" value="#{perfilController.perfil.dsPerfil}" size="61" maxlength="60"
onkeyup="this.value = somenteCaracteres(this.value)"
required="true" requiredMessage="#{msg['perfil.descricao.requerido']}"
readonly="#{perfilController.somenteLeitura}" />
<h:message for="iptDescricao" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
</h:panelGrid>
<f:facet name="footer">
<p:commandButton value="#{msg['botao.fechar']}"
action="/jsf/perfil/exibirPerfis?faces-redirect=true"
immediate="true" />
<h:outputText value=" " />
<p:commandButton id="cbtIncluir" value="#{msg['botao.incluir']}"
rendered="#{perfilController.exibeBotaoIncluir}" actionListener="#{perfilController.salvar}"
update="pgrPerfil, oplDialog" />
<p:commandButton id="cbtAlterar" value="#{msg['botao.alterar']}"
rendered="#{perfilController.exibeBotaoAlterar}" actionListener="#{perfilController.alterar}"
update="pgrPerfil, oplDialog" />
<p:commandButton id="cbtExcluir" value="#{msg['botao.excluir']}"
rendered="#{perfilController.exibeBotaoExcluir}" actionListener="#{perfilController.excluir}"
update="pgrPerfil, oplDialog" />
</f:facet>
</p:panel>
</p:outputPanel>
</ui:define>
</ui:composition>
</html>
Reparem que o dialog da mensagem possui um rendered que a princípio sua exibição é falsa. Dentro desse dialog temos um label que está setado num atributo do Managed Beans e este será alterado em tempo de execução. Ao submetermos o form através da ação do botão de incluir por exemplo no Managed Beans, mandamos atualizar o componente outoutPanel com o id “oplDialog”. Estou também atualizando o painelGrid por outro motivo, mas não se atentem para essa questão.
Segue abaixo agora o Managed Bean, o qual manipulamos o DAO responsável por incluir, alterar, excluir e consultar um Perfil. Atentem-se para a mensagem que é alterada e o atributo booleano de exibição do dialog.
package br.com.notaroberto.controller;
import br.com.notaroberto.dao.PerfilDAO;
import br.com.notaroberto.model.Perfil;
import java.io.Serializable;
import java.util.List;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.event.ActionEvent;
@ManagedBean(name = "perfilController")
@ViewScoped
public class PerfilController implements Serializable {
private static final long serialVersionUID = 398906636209328367L;
private Perfil perfil;
private PerfilDAO perfilDAO;
private List<Perfil> listaPerfis;
private String mensagem;
private boolean exibeBotaoIncluir, exibeBotaoAlterar,
exibeBotaoExcluir, somenteLeitura,
exibeListaPerfis = true, exibeDialog;
@PostConstruct
public void init() {
// Chamado só quando o managed bean é colocado no escopo view,
// e não a cada requisição como acontecia com o escopo request
perfilDAO = new PerfilDAO();
setListaPerfis(perfilDAO.buscaTodos());
}
@PreDestroy
public void destroy() {
/* chamado quando outra view for chamada através do UIViewRoot.setViewId(String viewId) */
setListaPerfis(null);
setExibeBotaoIncluir(false);
setExibeBotaoAlterar(false);
setExibeBotaoExcluir(false);
setExibeListaPerfis(true);
setSomenteLeitura(false);
}
public Perfil getPerfil() {
return perfil;
}
public void setPerfil(Perfil perfil) {
this.perfil = perfil;
}
public List<Perfil> getListaPerfis() {
return listaPerfis;
}
public void setListaPerfis(List<Perfil> listaPerfis) {
this.listaPerfis = listaPerfis;
}
public String getMensagem() {
return mensagem;
}
public void setMensagem(String mensagem) {
this.mensagem = mensagem;
}
public boolean isExibeBotaoIncluir() {
return exibeBotaoIncluir;
}
public void setExibeBotaoIncluir(boolean exibeBotaoIncluir) {
this.exibeBotaoIncluir = exibeBotaoIncluir;
}
public boolean isExibeBotaoAlterar() {
return exibeBotaoAlterar;
}
public void setExibeBotaoAlterar(boolean exibeBotaoAlterar) {
this.exibeBotaoAlterar = exibeBotaoAlterar;
}
public boolean isExibeBotaoExcluir() {
return exibeBotaoExcluir;
}
public void setExibeBotaoExcluir(boolean exibeBotaoExcluir) {
this.exibeBotaoExcluir = exibeBotaoExcluir;
}
public boolean isSomenteLeitura() {
return somenteLeitura;
}
public void setSomenteLeitura(boolean somenteLeitura) {
this.somenteLeitura = somenteLeitura;
}
public boolean isExibeListaPerfis() {
return exibeListaPerfis;
}
public void setExibeListaPerfis(boolean exibeListaPerfis) {
this.exibeListaPerfis = exibeListaPerfis;
}
public boolean isExibeDialog() {
return exibeDialog;
}
public void setExibeDialog(boolean exibeDialog) {
this.exibeDialog = exibeDialog;
}
public void preparaInclusao() {
perfil = new Perfil();
setExibeListaPerfis(false);
setExibeBotaoIncluir(true);
}
public void preparaConsulta() {
setExibeListaPerfis(false);
setSomenteLeitura(true);
}
public void preparaAlteracao() {
setExibeListaPerfis(false);
setSomenteLeitura(false);
setExibeBotaoAlterar(true);
}
public void preparaExclusao() {
setExibeListaPerfis(false);
setSomenteLeitura(true);
setExibeBotaoExcluir(true);
}
public void carregaPerfisUsuarios() {
perfilDAO = new PerfilDAO();
setListaPerfis(perfilDAO.buscaTodos());
}
public void salvar(ActionEvent actionEvent) {
setExibeDialog(false);
try {
perfilDAO = new PerfilDAO();
perfilDAO.salva(perfil);
setExibeDialog(true);
setMensagem(ResourceBundle.getBundle("/message").getString("perfil.criadoSucesso"));
} catch (Exception e) {
setExibeDialog(true);
setMensagem(e + " " + ResourceBundle.getBundle("/message").getString("perfil.erroIncluir"));
}
}
public void alterar(ActionEvent actionEvent) {
setExibeDialog(false);
try {
perfilDAO = new PerfilDAO();
perfilDAO.altera(perfil);
setExibeDialog(true);
setMensagem(ResourceBundle.getBundle("/message").getString("perfil.alteradoSucesso"));
} catch (Exception e) {
setExibeDialog(true);
setMensagem(e + " " + ResourceBundle.getBundle("/message").getString("perfil.erroAlterar"));
}
}
public void excluir(ActionEvent actionEvent) {
setExibeDialog(false);
try {
perfilDAO = new PerfilDAO();
perfilDAO.exclui(perfil);
setExibeDialog(true);
setMensagem(ResourceBundle.getBundle("/message").getString("perfil.excluidoSucesso"));
} catch (Exception e) {
setExibeDialog(true);
setMensagem(e + " " + ResourceBundle.getBundle("/message").getString("perfil.erroExcluir"));
}
}
@FacesConverter(forClass = Perfil.class, value = "perfilConverter")
public static class PerfilControllerConverter implements Converter {
@Override
public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
if ((value == null) || (value.length() == 0)) {
return null;
}
PerfilController perfilController = (PerfilController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(),
null, "perfilController");
return perfilController.perfilDAO.buscaPeloID(getID(value));
}
Integer getID(String value) {
Integer id;
id = Integer.valueOf(value);
return id;
}
String getStringID(Integer value) {
StringBuffer sb = new StringBuffer();
sb.append(value);
return sb.toString();
}
@Override
public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
if (object == null) {
return null;
}
if (object instanceof Perfil) {
Perfil p = (Perfil) object;
return getStringID(p.getIdPerfil());
} else {
throw new IllegalArgumentException("objeto " + object + " possui o tipo " + object.getClass().getName()
+ "; tipo esperado: " + PerfilController.class.getName());
}
}
}
}
Evitei de usar javascript para exibição do dialog, conforme alguns utilizam, pois já tive problemas com esse tipo de modelo (dlg.show()). O primefaces implementa a utilização do dialog de forma diferente, onde é verificado se ocorreu algum erro no Managed Beans e depois o show é executado dentro de um método javascript, onde tem algo como if (!validation.args).
Grande abraço,
Até o próximo post,
Lessandro