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>
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
<htmlxmlns="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>CadastroeEmissãodeCertificado</title></h:head><h:body><h:formid="cadastro"><p:panelid="painelCadastro"header="Novo Cadastro"style="margin-bottom:10px;"><p:messagesid="messages"autoUpdate="true"closable="true"/><h:panelGridcolumns="3"><h:outputLabelfor="username"value="Username"/><p:inputTextid="username"value="#{certificadoBean.certificadoModel.username}"required="true"requiredMessage="Nome do usuário"/><p:messagefor="username"style="color: red"/><h:outputLabelfor="password"value="Password"/><p:passwordid="password"value="#{certificadoBean.certificadoModel.password}"required="true"requiredMessage="Senha"/><p:messagefor="password"style="color: red"/><h:outputLabelfor="cn"value="Nome Completo"></h:outputLabel><p:inputTextid="cn"value="#{certificadoBean.certificadoModel.CN}"required="true"requiredMessage="Nome completo"/><p:messagefor="cn"style="color: red"/><h:outputLabelid="lblLocalidade"for="localidade"value="Localidade"/><p:selectOneMenuid="localidade"value="#{certificadoBean.certificadoModel.l}"><f:selectItemitemValue="BragancaPaulista"itemLabel="Bragança Paulista"/><f:selectItemitemValue="Piracaia"itemLabel="Piracaia"/><f:selectItemitemValue="Atibaia"itemLabel="Atibaia"/><f:selectItemitemValue="BomJesusdosPerdoes"itemLabel="Bom Jesus dos Perdões"/><f:selectItemitemValue="NazarePaulista"itemLabel="Nazaré Paulista"/></p:selectOneMenu><p:messagefor="lblLocalidade"style="color: red"/><h:outputLabelfor="campus"value="Campus"/><p:selectOneMenuid="campus"value="#{certificadoBean.certificadoModel.o}"><f:selectItemitemValue="BragancaPaulista"itemLabel="Bragança Paulista"/></p:selectOneMenu><p:messagefor="campus"style="color: red"/><h:outputLabelfor="tipoUsuario"value="Tipo de Usuário"/><p:selectOneMenuid="tipoUsuario"value="#{certificadoBean.certificadoModel.ou}"><f:selectItemitemValue="Administrativo"itemLabel="Administrativo"/><f:selectItemitemValue="Alunos"itemLabel="Aluno"/><f:selectItemitemValue="Professores"itemLabel="Professor"/></p:selectOneMenu><p:messagefor="tipoUsuario"style="color: red"/><h:outputLabelfor="tamanhoChave"value="Tamanho da Chave"/><p:selectOneMenuid="tamanhoChave"value="#{certificadoBean.certificadoModel.chave}"><f:selectItemitemValue="1024"itemLabel="1024"/><f:selectItemitemValue="2048"itemLabel="2048"/></p:selectOneMenu><p:messagefor="tamanhoChave"style="color: red"/><h:outputLabelfor="email"value="Email"/><p:inputTextid="email"value="#{certificadoBean.certificadoModel.e}"required="true"requiredMessage="E-mail"/><p:messagefor="email"style="color: red"/></h:panelGrid><p:commandButtonaction="#{certificadoBean.cadastrar}"ajax="false"value="Cadastrar"update="panel"/><p:commandButtonaction="voltar"ajax="false"value="Voltar"/></p:panel></h:form></h:body></html>
bean
publicclassCertificadoBeanimplementsSerializable{/** * */privatestaticfinallongserialVersionUID=1L;publicCertificadoBean()throwsNamingException{controlador=newCertificadoControlador();certificadoModel=newCertificadoModel();}privateCertificadoControladorcontrolador;privateCertificadoModelcertificadoModel;publicvoidcadastrar()throwsKeyStoreException,CADoesntExistsException,NoSuchAlgorithmException,CertificateException,IOException{KeyStorekeyStore=controlador.cadastrar(certificadoModel);System.out.println("Bean Class: "+certificadoModel.getMensagem());FacesContextfc=FacesContext.getCurrentInstance();if(certificadoModel.getMensagem()=="Cadastro Realizado com Sucesso!!"){ExternalContextec=fc.getExternalContext();ec.responseReset();ec.setResponseContentType("application/x-pkcs12");//ec.setResponseContentLength(contentLength); ec.setResponseHeader("Content-Disposition","attachment; filename=\""+certificadoModel.getUsername()+".p12"+"\"");OutputStreamoutput=ec.getResponseOutputStream();keyStore.store(output,certificadoModel.getPassword().toCharArray());fc.responseComplete();fc.addMessage(null,newFacesMessage("",certificadoModel.getMensagem()));controlador.clean(certificadoModel);}elsefc.addMessage(null,newFacesMessage("",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
ivandasilva
Tenta tirar o ajax false do seu código…
S
silver00
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
ivandasilva
Vc está fazendo update em um id que não existe ‘panel’ no update troque para painelCadastro
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:
publicvoidcadastrar()throwsKeyStoreException,CADoesntExistsException,NoSuchAlgorithmException,CertificateException,IOException{KeyStorekeyStore=controlador.cadastrar(certificadoModel);System.out.println("Bean Class: "+certificadoModel.getMensagem());FacesContextfc=FacesContext.getCurrentInstance();if(certificadoModel.getMensagem()=="Cadastro Realizado com Sucesso!!"){ExternalContextec=fc.getExternalContext();ec.responseReset();ec.setResponseContentType("application/x-pkcs12");//ec.setResponseContentLength(contentLength); ec.setResponseHeader("Content-Disposition","attachment; filename=\""+certificadoModel.getUsername()+".p12"+"\"");OutputStreamoutput=ec.getResponseOutputStream();keyStore.store(output,certificadoModel.getPassword().toCharArray());fc.responseComplete();fc.addMessage(null,newFacesMessage("",certificadoModel.getMensagem()));controlador.clean(certificadoModel);}elsefc.addMessage("messages",newFacesMessage("",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
silver00
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.
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:
publicvoidcadastrar()throwsKeyStoreException,CADoesntExistsException,NoSuchAlgorithmException,CertificateException,IOException{KeyStorekeyStore=controlador.cadastrar(certificadoModel);System.out.println("Bean Class: "+certificadoModel.getMensagem());FacesContextfc=FacesContext.getCurrentInstance();if(certificadoModel.getMensagem()=="Cadastro Realizado com Sucesso!!"){ExternalContextec=fc.getExternalContext();ec.responseReset();ec.setResponseContentType("application/x-pkcs12");//ec.setResponseContentLength(contentLength); ec.setResponseHeader("Content-Disposition","attachment; filename=\""+certificadoModel.getUsername()+".p12"+"\"");OutputStreamoutput=ec.getResponseOutputStream();keyStore.store(output,certificadoModel.getPassword().toCharArray());fc.responseComplete();fc.addMessage(null,newFacesMessage("",certificadoModel.getMensagem()));controlador.clean(certificadoModel);}elsefc.addMessage("messages",newFacesMessage("",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.
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.