[RESOLVIDO]Janela Mensagem Bean JSF!

12 respostas
S

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?

12 Respostas

I

É 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…

S

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…

É JSF 2 mesmo, vou dar uma olhada.

Vlw!

F

da uma olhada no primefaces

http://www.primefaces.org

tem varios componentes legais que facilitam muito o trabalho

S
fabiozanardi:
da uma olhada no primefaces

[url]http://www.primefaces.org[/url]

tem varios componentes legais que facilitam muito o trabalho

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
&lt;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"&gt;  
        
&lt;h:head&gt;  
    &lt;title&gt;Cadastro e Emissão de Certificado&lt;/title&gt;  
&lt;/h:head&gt;  
  
&lt;h:body&gt;    
    &lt;h:form id="cadastro"&gt; 
    	&lt;p:panel id="painelCadastro" header="Novo Cadastro" style="margin-bottom:10px;"&gt;         
	    	&lt;p:messages id="messages" autoUpdate="true" closable="true" /&gt;   
	        &lt;h:panelGrid columns="3"&gt;  	                      
		       	&lt;h:outputLabel for="username" value="Username" /&gt;
		        &lt;p:inputText id="username" value="#{certificadoBean.certificadoModel.username}" required="true" requiredMessage="Nome do usuário" /&gt;  
		        &lt;p:message for="username" style="color: red"/&gt;
		                                          
		        &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;  
&lt;/h:body&gt;  
&lt;/html&gt;
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!

I

Tenta tirar o ajax false do seu código…

S

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)

I

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

R

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:

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);  
    }     
}

Abraços.

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

S

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.

S
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:

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);  
    }     
}

Abraços.

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

É 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.

I

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

S

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.

Criado 3 de abril de 2013
Ultima resposta 4 de abr. de 2013
Respostas 12
Participantes 4