Olá pessoal, boa tarde.
Estou com um problema tremendo ao executar o evento onComplete do componente primefaces o qual dá suporte ao jsf 2.0
Anteriormente no jsf 1.2 utilizava o a4j:support, e este se comportava corretamente, onde o método era chamado e após ser concluído era exibido um alert.
Porém com o jsf 2.0 se comporta de maneira diferente, observem o código abaixo,
Tenho algo como:
<p:commandButton id="cbtIncluir" value="#{msg['botao.incluir']}" styleClass="botoes" immediate="false"
action="#{usuarioController.salvar}" oncomplete="javascript:alert('Teste');" update="pgrUsuario">
</p:commandButton>
Nesse caso o evento oncomplete está se comportando de maneira semelhante ao evento onclick, onde a action salvar não está sendo executada
anteriormente, e ao ser finalizada um alert é demonstrado. O alert é exibido assim que o botão é acionado, e o método salvar nem foi chamado ainda.
Alguém teria alguma solução para esse problema?
Abs,
Lessandro
Conforme me pediram, segue a página xhtml e o bean utilizado. Quanto à versão do PrimeFaces é a 2.0 e o servidor de aplicações o Glassfih EE 6.
Página incluirUsuario.xhtml:
<?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:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui">
<ui:composition template="/resources/jsf/template.xhtml">
<ui:define name="menu">
<ui:include src="/resources/jsf/menu.xhtml" />
</ui:define>
<ui:define name="corpoDialog">
<h:outputLabel id="oplMensagem" value="#{usuarioController.mensagem}" />
<h:inputHidden />
<h:commandButton id="cbtOk" value="#{msg['botao.ok']}" styleClass="botoes" immediate="true" action="#{usuarioController.preparaLista}" />
</ui:define>
<ui:define name="centro">
<p:panel id="pnlCentro" style="position: relative; margin-top: 40px; margin-left: 300px; width: 450px;">
<f:facet name="header">
<h:outputText value="#{msg['usuario.detalhe']}" styleClass="fonteTitulo" />
</f:facet>
<h:panelGrid columns="2" cellspacing="5px">
<h:outputLabel value="#{msg['usuario.nome']}" />
<h:inputText id="iptNome" value="#{usuarioController.selecionado.nmUsuario}" size="70" maxlength="100"
onkeyup="this.value = somenteCaracteres(this.value)" required="true"
requiredMessage="#{msg['usuario.nome.requerido']}" />
<h:inputHidden />
<h:message for="iptNome" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
<h:outputLabel value="#{msg['usuario.rua']}" />
<h:inputText id="iptRua" value="#{usuarioController.selecionado.dsRua}" size="70" maxlength="100"
onkeyup="this.value = somenteCaracteres(this.value)"
required="true" requiredMessage="#{msg['usuario.rua.requerido']}" />
<h:inputHidden />
<h:message for="iptRua" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
<h:outputLabel value="#{msg['usuario.bairro']}" />
<h:inputText id="iptBairro" value="#{usuarioController.selecionado.dsBairro}" size="51" maxlength="50"
onkeyup="this.value = somenteCaracteres(this.value)" required="true"
requiredMessage="#{msg['usuario.bairro.requerido']}" />
<h:inputHidden />
<h:message for="iptBairro" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
<h:outputLabel value="#{msg['usuario.numero']}" />
<h:inputText id="iptNumero" value="#{usuarioController.selecionado.nuLocal}" size="11" maxlength="10"
onkeypress="return somenteNumeros(event, false)" required="true"
requiredMessage="#{msg['usuario.numero.requerido']}" />
<h:inputHidden />
<h:message for="iptNumero" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
<h:outputLabel value="#{msg['usuario.cidade']}" />
<h:inputText id="iptCidade" value="#{usuarioController.selecionado.dsCidade}" size="51" maxlength="50"
onkeyup="this.value = somenteCaracteres(this.value)" required="true"
requiredMessage="#{msg['usuario.cidade.requerido']}" />
<h:inputHidden />
<h:message for="iptCidade" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
<h:outputLabel value="#{msg['usuario.estado']}" />
<h:inputText id="iptEstado" value="#{usuarioController.selecionado.dsEstado}" size="3" maxlength="2"
onkeyup="this.value = somenteCaracteres(this.value)" required="true"
requiredMessage="#{msg['usuario.estado.requerido']}" />
<h:inputHidden />
<h:message for="iptEstado" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
<h:outputLabel value="#{msg['usuario.cep']}" />
<h:inputText value="#{usuarioController.selecionado.nuCep}" size="9" maxlength="8" />
<h:outputLabel value="#{msg['usuario.login']}" />
<h:inputText id="iptLogin" value="#{usuarioController.selecionado.dsLogin}" size="21" maxlength="20" required="true"
requiredMessage="#{msg['usuario.login.requerido']}" />
<h:inputHidden />
<h:message for="iptLogin" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
<h:outputLabel value="#{msg['usuario.senha']}" />
<p:password id="pasSenha" value="#{usuarioController.selecionado.dsSenha}" minLength="0" size="50" maxlength="20"
weakLabel="#{msg['usuario.senha.fraca']}" goodLabel="#{msg['usuario.senha.boa']}"
strongLabel="#{msg['usuario.senha.excelente']}" promptLabel="#{msg['usuario.senha.requerido']}"
required="true" requiredMessage="#{msg['usuario.senha.requerido']}" />
<h:inputHidden />
<h:message for="pasSenha" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
<h:outputLabel value="#{msg['usuario.perfil']}" />
<h:selectOneMenu value="#{usuarioController.selecionado.perfil}">
<f:converter converterId="perfilConverter" />
<f:selectItems value="#{usuarioController.listaPerfis}" var="perfil" itemLabel="#{perfil.nmPerfil}" itemValue="#{perfil}" />
</h:selectOneMenu>
</h:panelGrid>
<f:facet name="footer">
<h:commandButton value="#{msg['botao.voltar']}" styleClass="botoes" immediate="true" action="#{usuarioController.preparaLista}" />
<h:outputText value=" " />
<h:commandButton id="cbtIncluir" value="#{msg['botao.incluir']}" styleClass="botoes" action="#{usuarioController.salvar}">
<f:ajax execute="@this" onevent="javascript:alert('oi');" />
</h:commandButton>
</f:facet>
</p:panel>
</ui:define>
</ui:composition>
</html>
Bean UsuarioController.java:
package br.com.notaroberto.controller;
//~--- non-JDK imports --------------------------------------------------------
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.bean.ManagedBean;
import br.com.notaroberto.dao.UsuarioDAO;
import br.com.notaroberto.model.Perfil;
import br.com.notaroberto.model.Usuario;
import br.com.notaroberto.util.Constantes;
import br.com.notaroberto.util.JsfUtil;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
@ManagedBean(name = "usuarioController")
@SessionScoped
public class UsuarioController {
private Usuario usuario;
private UsuarioDAO usuarioDAO;
private int idUsuarioSelecionado;
private List<Usuario> listaUsuarios;
private List<Perfil> listaPerfis;
private String mensagem, msgDialog;
public Usuario getSelecionado() {
if (usuario == null) {
usuario = new Usuario();
idUsuarioSelecionado = -1;
} else {
if (idUsuarioSelecionado != -1) {
usuario = recuperaUsuario(idUsuarioSelecionado);
}
}
return usuario;
}
private UsuarioDAO getUsuarioDAO() {
usuarioDAO = new UsuarioDAO();
return usuarioDAO;
}
public void setListaUsuarios(List<Usuario> listaUsuarios) {
this.listaUsuarios = listaUsuarios;
}
public List<Usuario> getListaUsuarios() {
return listaUsuarios;
}
public List<Perfil> getListaPerfis() {
return listaPerfis;
}
public void setListaPerfis(List<Perfil> listaPerfis) {
this.listaPerfis = listaPerfis;
}
public int getIdUsuarioSelecionado() {
return idUsuarioSelecionado;
}
public void setIdUsuarioSelecionado(int idUsuarioSelecionado) {
this.idUsuarioSelecionado = idUsuarioSelecionado;
}
public String getMensagem() {
return mensagem;
}
public void setMensagem(String mensagem) {
this.mensagem = mensagem;
}
public String getMsgDialog() {
return msgDialog;
}
public void setMsgDialog(String msgDialog) {
this.msgDialog = msgDialog;
}
public String preparaLista() {
recriaModelo();
setListaUsuarios(getUsuarioDAO().buscaTodos());
return Constantes.URL_MENU_USUARIO;
}
public String carregaListaPerfis() {
PerfilController perfilController = new PerfilController();
perfilController.preparaLista();
setListaPerfis(perfilController.getListaPerfis());
return null;
}
public String preparaCriacao() {
usuario = new Usuario();
idUsuarioSelecionado = -1;
carregaListaPerfis();
return Constantes.URL_INCLUIR_USUARIO;
}
public String preparaAlteracao() {
carregaListaPerfis();
return Constantes.URL_ALTERAR_USUARIO;
}
public Usuario recuperaUsuario(int idUsuarioSelecionado) {
Usuario ususarioRecuperado = null;
for (int i = 0; i < listaUsuarios.size(); i++) {
if (listaUsuarios.get(i).getIdUsuario() == idUsuarioSelecionado) {
ususarioRecuperado = listaUsuarios.get(i);
}
}
return ususarioRecuperado;
}
public void salvar() {
setMensagem("");
setMsgDialog("");
try {
getUsuarioDAO().salva(usuario);
setMensagem(ResourceBundle.getBundle("/message").getString("usuario.criadoSucesso"));
setMsgDialog(Constantes.SHOW_DIALOG);
} catch (Exception e) {
setMensagem(e + " " + ResourceBundle.getBundle("/message").getString("PersistenceErrorOccured"));
setMsgDialog(Constantes.SHOW_DIALOG);
}
}
public String alterar() {
try {
getUsuarioDAO().altera(usuario);
JsfUtil.addSuccessMessage(null, ResourceBundle.getBundle("/message").getString("UsuarioUpdated"));
return "Exibe";
} catch (Exception e) {
JsfUtil.addErrorMessageExcecao(e, ResourceBundle.getBundle("/message").getString("PersistenceErrorOccured"));
return null;
}
}
public String excluir() {
try {
getUsuarioDAO().exclui(usuario);
JsfUtil.addSuccessMessage(null, ResourceBundle.getBundle("/message").getString("UsuarioDeleted"));
return "Exibe";
} catch (Exception e) {
JsfUtil.addErrorMessageExcecao(e, ResourceBundle.getBundle("/message").getString("PersistenceErrorOccured"));
return null;
}
}
private void recriaModelo() {
setListaUsuarios(null);
}
public String autenticaUsuario() {
String pagina = null;
usuario = getUsuarioDAO().buscaLoginSenha(getSelecionado().getDsLogin(), getSelecionado().getDsSenha());
if (usuario == null) {
JsfUtil.addErrorMessage("form:iphMensagem", ResourceBundle.getBundle("/message").getString("usuario.naoEncontrado"));
} else {
pagina = Constantes.URL_MENU_HOME;
}
return pagina;
}
@FacesConverter(forClass = Usuario.class, value = "usuarioConverter")
public static class UsuarioControllerConverter implements Converter {
@Override
public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
if ((value == null) || (value.length() == 0)) {
return null;
}
UsuarioController usuarioController = (UsuarioController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(),
null, "usuarioController");
return usuarioController.getUsuarioDAO().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 Usuario) {
Usuario o = (Usuario) object;
return getStringID(o.getIdUsuario());
} else {
throw new IllegalArgumentException("objeto " + object + " possui o tipo " + object.getClass().getName()
+ "; tipo esperado: " + UsuarioController.class.getName());
}
}
}
}
Detalhe: Tentei utilizar o f:ajax agora, mas também não funcionou. Utilize como exemplo o primeiro código que postei aqui substituindo o <p:commandButton> com o evento onComplete.
Resolvido por mim mesmo, com ajuda do Rafael. Segue a solução: http://www.guj.com.br/posts/list/205485.java