[RESOLVIDO]Janela Mensagem Bean JSF!

Pessoal, é o seguinte, digamos que eu execute o seguinte:

E receba um return "Sucesso" ou "Erro"

E quando eu receba a essa mensagem, na página em que eu chamei o processo, não seja necessário ser encaminhado para outra página e sim aparece uma pequena janela (com o fundo esmaecido) com alguma mensagem armazenado um uma variável em um bean, tipo <p><h:outputLabel value="#{meuBean.mensagem}" /></p>

Alguém sabe como eu poderia estar fazendo isso?

É JSF 2 ?

Se for fica mais sussa… dá uma googleada sobre o FacesMessage

JSF 1.*

Troca o action por um actionListener e googlea por FacesMessage do mesmo jeito…

[quote=ivandasilva]É JSF 2 ?

Se for fica mais sussa… dá uma googleada sobre o FacesMessage

JSF 1.*

Troca o action por um actionListener e googlea por FacesMessage do mesmo jeito…
[/quote]

É JSF 2 mesmo, vou dar uma olhada.

Vlw!

da uma olhada no primefaces

http://www.primefaces.org

tem varios componentes legais que facilitam muito o trabalho

[quote=fabiozanardi]da uma olhada no primefaces

http://www.primefaces.org

tem varios componentes legais que facilitam muito o trabalho[/quote]

Então, no meu código não retorna a mensagem de sucesso, mas creio que é por causa do uso do FacesContext para outro fim. De uma olhada:

xhtml

[code]
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f=“http://java.sun.com/jsf/core”>

<h:head>
<title>Cadastro e Emissão de Certificado</title>
</h:head>

<h:body>
<h:form id=“cadastro”>
<p:panel id=“painelCadastro” header=“Novo Cadastro” style=“margin-bottom:10px;”>
<p:messages id=“messages” autoUpdate=“true” closable=“true” />
<h:panelGrid columns=“3”>
<h:outputLabel for=“username” value=“Username” />
<p:inputText id=“username” value="#{certificadoBean.certificadoModel.username}" required=“true” requiredMessage=“Nome do usuário” />
<p:message for=“username” style=“color: red”/>

	        &lt;h:outputLabel for="password" value="Password" /&gt;
	        &lt;p:password id="password" value="#{certificadoBean.certificadoModel.password}"  required="true" requiredMessage="Senha" /&gt;
	        &lt;p:message for="password" style="color: red"/&gt;
	                                                                  
	        &lt;h:outputLabel for="cn" value="Nome Completo"&gt;&lt;/h:outputLabel&gt;  
	        &lt;p:inputText id="cn" value="#{certificadoBean.certificadoModel.CN}" required="true" requiredMessage="Nome completo" /&gt;
	        &lt;p:message for="cn" style="color: red"/&gt;
	                                       
	        &lt;h:outputLabel id="lblLocalidade" for="localidade" value="Localidade" /&gt;
	        &lt;p:selectOneMenu id="localidade" value="#{certificadoBean.certificadoModel.l}"&gt;  
		    	&lt;f:selectItem itemValue="BragancaPaulista" itemLabel="Bragança Paulista" /&gt;  
		        &lt;f:selectItem itemValue="Piracaia" itemLabel="Piracaia" /&gt;  
		        &lt;f:selectItem itemValue="Atibaia" itemLabel="Atibaia" /&gt;  
		        &lt;f:selectItem itemValue="BomJesusdosPerdoes" itemLabel="Bom Jesus dos Perdões" /&gt;  
		        &lt;f:selectItem itemValue="NazarePaulista" itemLabel="Nazaré Paulista" /&gt;  
	       	&lt;/p:selectOneMenu&gt;   
	      	&lt;p:message for="lblLocalidade" style="color: red"/&gt;                   
	                                          
	      	&lt;h:outputLabel for="campus" value="Campus" /&gt;
	      	&lt;p:selectOneMenu id="campus" value="#{certificadoBean.certificadoModel.o}"&gt;  
	      			&lt;f:selectItem itemValue="BragancaPaulista" itemLabel="Bragança Paulista" /&gt;                         
	      	&lt;/p:selectOneMenu&gt;  
	      	&lt;p:message for="campus" style="color: red"/&gt; 
	                                           
	      	&lt;h:outputLabel for="tipoUsuario" value="Tipo de Usuário" /&gt;
	      	&lt;p:selectOneMenu id="tipoUsuario" value="#{certificadoBean.certificadoModel.ou}"&gt;  
		      	&lt;f:selectItem itemValue="Administrativo" itemLabel="Administrativo" /&gt;  
		      	&lt;f:selectItem itemValue="Alunos" itemLabel="Aluno" /&gt;  
		      	&lt;f:selectItem itemValue="Professores" itemLabel="Professor" /&gt;  
	     	&lt;/p:selectOneMenu&gt;     
	     	&lt;p:message for="tipoUsuario" style="color: red"/&gt;  
	                    
	    	&lt;h:outputLabel for="tamanhoChave" value="Tamanho da Chave" /&gt;
	    	&lt;p:selectOneMenu id="tamanhoChave" value="#{certificadoBean.certificadoModel.chave}"&gt;  
		    	&lt;f:selectItem itemValue="1024" itemLabel="1024" /&gt;  
		    	&lt;f:selectItem itemValue="2048" itemLabel="2048" /&gt;  
	    	&lt;/p:selectOneMenu&gt;      
	    	&lt;p:message for="tamanhoChave" style="color: red"/&gt; 
	                                                  
	    	&lt;h:outputLabel for="email" value="Email" /&gt;
	    	&lt;p:inputText id="email" value="#{certificadoBean.certificadoModel.e}" required="true" requiredMessage="E-mail" /&gt;
	    	&lt;p:message for="email" style="color: red"/&gt; 
   		&lt;/h:panelGrid&gt;   
   		
   		&lt;p:commandButton action="#{certificadoBean.cadastrar}"  ajax="false" value="Cadastrar" update="panel" /&gt;	                  
   		&lt;p:commandButton action="voltar" ajax="false" value="Voltar"/&gt;                                  
   	&lt;/p:panel&gt;       
&lt;/h:form&gt;  

</h:body>
</html> [/code]

bean


public class CertificadoBean implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	public CertificadoBean() throws NamingException
	{
		controlador = new CertificadoControlador();	
		certificadoModel = new CertificadoModel();
	}	
	
	private CertificadoControlador controlador;
	private CertificadoModel certificadoModel;
	
	public void cadastrar () throws KeyStoreException, CADoesntExistsException, NoSuchAlgorithmException, CertificateException, IOException  	
	{			
		KeyStore keyStore = controlador.cadastrar(certificadoModel);      
		System.out.println("Bean Class: " + certificadoModel.getMensagem());
		FacesContext fc = FacesContext.getCurrentInstance();
		
		if (certificadoModel.getMensagem() == "Cadastro Realizado com Sucesso!!")
		{	       
	        ExternalContext ec = fc.getExternalContext();
	
	        ec.responseReset(); 
	        ec.setResponseContentType("application/x-pkcs12"); 
	        //ec.setResponseContentLength(contentLength); 
	        ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + certificadoModel.getUsername() + ".p12" + "\""); 
	
	        OutputStream output = ec.getResponseOutputStream();
	        keyStore.store(output, certificadoModel.getPassword().toCharArray());
	          
	        fc.responseComplete(); 
	        fc.addMessage(null, new FacesMessage("", certificadoModel.getMensagem()));
	        controlador.clean(certificadoModel);			
		}else			
		 	fc.addMessage(null, new FacesMessage("", certificadoModel.getMensagem()));  
			controlador.clean(certificadoModel);
	}	
}

Quando eu retiro toda essa parte da manipulação do arquivo que vou receber, a mensagem aparece normalmente.

Obrigado!

Tenta tirar o ajax false do seu código…

Tentei tirar, e até mesmo colocar true, mas tenho a seguinte stacktrace:

2013-04-04 10:21:45,485 INFO [org.primefaces.webapp.PostConstructApplicationEventListener] (HDScanner) Running on PrimeFaces 3.5 2013-04-04 10:21:51,332 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (http-127.0.2.1-8080-1) Error Rendering View[/pages/public/cadastroProfile.xhtml] javax.faces.FacesException: Cannot find component with identifier "panel" referenced from "cadastro:j_idt32". at org.primefaces.util.ComponentUtils.findClientIds(ComponentUtils.java:250) at org.primefaces.util.AjaxRequestBuilder.addIds(AjaxRequestBuilder.java:102) at org.primefaces.util.AjaxRequestBuilder.update(AjaxRequestBuilder.java:90) at org.primefaces.renderkit.CoreRenderer.buildAjaxRequest(CoreRenderer.java:200) at org.primefaces.component.commandbutton.CommandButtonRenderer.encodeMarkup(CommandButtonRenderer.java:75) at org.primefaces.component.commandbutton.CommandButtonRenderer.encodeEnd(CommandButtonRenderer.java:50) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879) at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:63) at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:47) at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:202) at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:119) at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:56) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650) at javax.faces.render.Renderer.encodeChildren(Renderer.java:164) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:389) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:662) 2013-04-04 10:21:51,336 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/CertificadoDigital-web].[Faces Servlet]] (http-127.0.2.1-8080-1) Servlet.service() for servlet Faces Servlet threw exception javax.faces.FacesException: Cannot find component with identifier "panel" referenced from "cadastro:j_idt32". at org.primefaces.util.ComponentUtils.findClientIds(ComponentUtils.java:250) at org.primefaces.util.AjaxRequestBuilder.addIds(AjaxRequestBuilder.java:102) at org.primefaces.util.AjaxRequestBuilder.update(AjaxRequestBuilder.java:90) at org.primefaces.renderkit.CoreRenderer.buildAjaxRequest(CoreRenderer.java:200) at org.primefaces.component.commandbutton.CommandButtonRenderer.encodeMarkup(CommandButtonRenderer.java:75) at org.primefaces.component.commandbutton.CommandButtonRenderer.encodeEnd(CommandButtonRenderer.java:50) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879) at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:63) at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:47) at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:202) at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:119) at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:56) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650) at javax.faces.render.Renderer.encodeChildren(Renderer.java:164) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:389) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:662)

Vc está fazendo update em um id que não existe ‘panel’ no update troque para painelCadastro

voce poderia fazer assim:

<p:commandButton action="#{certificadoBean.cadastrar}"  ajax="true" value="Cadastrar" update="messages" />

Ai em cima como voce percebe, estou dando update no p:messages, ja que é so isso que voce quer mostrar certo ? Nao preciso atualizar o painel todo.

e la no java voce teria que por assim:

[code]
public void cadastrar () throws KeyStoreException, CADoesntExistsException, NoSuchAlgorithmException, CertificateException, IOException
{
KeyStore keyStore = controlador.cadastrar(certificadoModel);
System.out.println("Bean Class: " + certificadoModel.getMensagem());
FacesContext fc = FacesContext.getCurrentInstance();

    if (certificadoModel.getMensagem() == "Cadastro Realizado com Sucesso!!")  
    {            
        ExternalContext ec = fc.getExternalContext();  
  
        ec.responseReset();   
        ec.setResponseContentType("application/x-pkcs12");   
        //ec.setResponseContentLength(contentLength);   
        ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + certificadoModel.getUsername() + ".p12" + "\"");   
  
        OutputStream output = ec.getResponseOutputStream();  
        keyStore.store(output, certificadoModel.getPassword().toCharArray());  
            
        fc.responseComplete();   
        fc.addMessage(null, new FacesMessage("", certificadoModel.getMensagem()));  
        controlador.clean(certificadoModel);              
    }else             
        fc.addMessage("messages", new FacesMessage("", certificadoModel.getMensagem())); // Observe que coloquei no CONTEXT o ID do p:messages.
        controlador.clean(certificadoModel);  
}     

} [/code]

Abraços.

Obs.: Coloquei ajax true no botao, assim ele nao faz nenhum submit.

Então, quando eu faço isso, esse update deve fazer a atualização do painel, o processo é realizado normalmente, mas nem o arquivo é retornado, muito menos a mensagem aparece.

[quote=rof20004]voce poderia fazer assim:

<p:commandButton action="#{certificadoBean.cadastrar}"  ajax="true" value="Cadastrar" update="messages" />

Ai em cima como voce percebe, estou dando update no p:messages, ja que é so isso que voce quer mostrar certo ? Nao preciso atualizar o painel todo.

e la no java voce teria que por assim:

[code]
public void cadastrar () throws KeyStoreException, CADoesntExistsException, NoSuchAlgorithmException, CertificateException, IOException
{
KeyStore keyStore = controlador.cadastrar(certificadoModel);
System.out.println("Bean Class: " + certificadoModel.getMensagem());
FacesContext fc = FacesContext.getCurrentInstance();

    if (certificadoModel.getMensagem() == "Cadastro Realizado com Sucesso!!")  
    {            
        ExternalContext ec = fc.getExternalContext();  
  
        ec.responseReset();   
        ec.setResponseContentType("application/x-pkcs12");   
        //ec.setResponseContentLength(contentLength);   
        ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + certificadoModel.getUsername() + ".p12" + "\"");   
  
        OutputStream output = ec.getResponseOutputStream();  
        keyStore.store(output, certificadoModel.getPassword().toCharArray());  
            
        fc.responseComplete();   
        fc.addMessage(null, new FacesMessage("", certificadoModel.getMensagem()));  
        controlador.clean(certificadoModel);              
    }else             
        fc.addMessage("messages", new FacesMessage("", certificadoModel.getMensagem())); // Observe que coloquei no CONTEXT o ID do p:messages.
        controlador.clean(certificadoModel);  
}     

} [/code]

Abraços.

Obs.: Coloquei ajax true no botao, assim ele nao faz nenhum submit.

[/quote]

É o seguinte, se eu deixo o ajax como true, ele não retorna o arquivo para download, mas mesmo false ou true, não retorna a mensagem. Pelo que li uma vez, não me lembro onde, acho que o ExternalContext não funciona com o ajax, deve ser por isso o problema do arquivo não retornar, mas a mensagem continua um mistério.

Obs:. A mensagem funciona normalmente com mensagens de erro, tipo usuário ja cadastrado no db, vai ver o fc.responseComplete() não funciona com o fc.addMessage ou da algum conflito.

Se é upload que você quer e primefaces que você usa, deveria dar uma olhada neste componente: http://primefaces.org/showcase/ui/fileUploadSimple.jsf

Não é fileUpload que estou usando, estou fazendo uma requisição que retorna uma keyStore que vai ser repassada ao usuário por stream, tudo isso é o FacesContext e o ExternalContext que fazem pra mim, mesmo com o fileDownload, não sei se é possível fazer isso. Testarei depois.