JSF - <h:commandButton> como abrir relatorio em outra página?

Tenho esse commandButton

                            <h:commandButton image="/imagens/report.png"
                                             action="#{PesquisaSolicitacaoMB.emitirRelatorioSolicitacao}"
                                             onclick="if (!confirm('Tem certeza que deseja EMITAR RELATÒRIO da solicitação #{solicitacao.pkSeqSolicitacaoSol}?')) return false"
                                             style="float:left"
                                             rendered="#{renderBotaoEmitirRelatSolicitacao}">
                                <f:setPropertyActionListener
                                    target="#{PesquisaSolicitacaoMB.idSolicitacao}"
                                    value="#{solicitacao.pkSeqSolicitacaoSol}" />
                                <rich:toolTip>
                                    <span style="white-space:nowrap">
                                        <strong>Emitir relatório</strong> da solicitação
                                    </span>
                                    <h:outputText value="#{solicitacao.pkSeqSolicitacaoSol}"
                                                  style="font-weight: bold" />
                                </rich:toolTip>
                            </h:commandButton>

que chama esse código (resumido para não pesar muito):

                FacesContext facesContext = FacesContext.getCurrentInstance();
                ServletContext servletContext = (ServletContext) facesContext.
                        getExternalContext().getContext();

                String dirBase = servletContext.getRealPath("");
                String caminhoImagem = dirBase + PropertiesHelper.getInstance().
                        getProperty("sdp.properties", "report.image.dir").
                        replace(
                        "[BARRA]", File.separator);
                String caminhoJasper = dirBase + PropertiesHelper.getInstance().
                        getProperty("sdp.properties", "report.jasper.dir").
                        replace(
                        "[BARRA]", File.separator);

                Map parametros = new HashMap();
                parametros.put("SUBREPORT_DIR", caminhoJasper);
                parametros.put("IMAGES_URI", caminhoImagem);
                parametros.put("PK_SEQ_SOLICITACAO_SOL", idSolicitacao);

                stream = service.gerarRelatorioBD(parametros, caminhoJasper +
                        "SDP-RelatorioSolicitacao01.jasper");

                HttpServletResponse res = (HttpServletResponse) facesContext.
                        getExternalContext().getResponse();

                res.setContentType("application/pdf");
                res.setHeader("Pragma", "public");
                res.setHeader("Cache-control", "must-revalidate");

                FacesContext.getCurrentInstance().responseComplete();

Do jeito que está atualmente o relatório está abrindo na mesma página, quebrando a navegação. Queria uma dica da melhor maneira de fazer esse commandButton abrir esse PDF em outra página. De preferência com um exemplo de código.

[]'s

Use um Command Link com sua imagem…

<h:commandLink action="#{PesquisaSolicitacaoMB.emitirRelatorioSolicitacao}" target="_blank">
     <img src="/imagens/report.png" />
</h:commandLink>

[quote=Gbzao!]Use um Command Link com sua imagem…

<h:commandLink action="#{PesquisaSolicitacaoMB.emitirRelatorioSolicitacao}" target="_blank"> <img src="/imagens/report.png" /> </h:commandLink> [/quote]

Tem como fazer isso com o commandButton? Porque tem no projeto alguns botões padrão

A cargo de teste eu mudei o botão.

                            <h:commandLink
                                             value="Teste"
                                             target="_blank"
                                             action="#{PesquisaSolicitacaoMB.emitirRelatorioSolicitacao}"
                                             onclick="if (!confirm('Tem certeza que deseja EMITAR RELATÒRIO da solicitação #{solicitacao.pkSeqSolicitacaoSol}?')) return false"
                                             style="float:left"
                                             rendered="#{renderBotaoEmitirRelatSolicitacao}">
                                <f:setPropertyActionListener
                                    target="#{PesquisaSolicitacaoMB.idSolicitacao}"
                                    value="#{solicitacao.pkSeqSolicitacaoSol}" />
                                <rich:toolTip>
                                    <span style="white-space:nowrap">
                                        <strong>Emitir relatório</strong> da solicitação
                                    </span>
                                    <h:outputText value="#{solicitacao.pkSeqSolicitacaoSol}"
                                                  style="font-weight: bold" />
                                </rich:toolTip>
                            </h:commandLink>

ele continua abrindo o relatório na mesma página

Eu uso o JasperRunManager.runReportToPdfStream para enviar o relatório para o browser.
E utilizo um commandLink com target _blank ( nova janela ).
Funciona perfeitamente.

[quote=rollei]A cargo de teste eu mudei o botão.

                            <h:commandLink
                                             value="Teste"
                                             target="_blank"
                                             action="#{PesquisaSolicitacaoMB.emitirRelatorioSolicitacao}"
                                             onclick="if (!confirm('Tem certeza que deseja EMITAR RELATÒRIO da solicitação #{solicitacao.pkSeqSolicitacaoSol}?')) return false"
                                             style="float:left"
                                             rendered="#{renderBotaoEmitirRelatSolicitacao}">
                                <f:setPropertyActionListener
                                    target="#{PesquisaSolicitacaoMB.idSolicitacao}"
                                    value="#{solicitacao.pkSeqSolicitacaoSol}" />
                                <rich:toolTip>
                                    <span style="white-space:nowrap">
                                        <strong>Emitir relatório</strong> da solicitação
                                    </span>
                                    <h:outputText value="#{solicitacao.pkSeqSolicitacaoSol}"
                                                  style="font-weight: bold" />
                                </rich:toolTip>
                            </h:commandLink>

ele continua abrindo o relatório na mesma página[/quote]

Tente fazer redirecionar para outra pagina assim q o relatorio for invocado.

ex:

//apos chamar o print do relatorio insira a seguinte linha de codigo metodo emitirRelatorioSolicitacao()
response.sendRedirect( request.getContextPath() + "/pathDaPaginaQueDesejaRedicionar/suaPagina.jsp" );

Outra dica seria usar o actionListener ao invés do action. Boa Sorte!

kra, tava com um problema parecido…
Coloca o target ="_blank" no teu form que resolve…

[quote=aspiranteJava]kra, tava com um problema parecido…
Coloca o target ="_blank" no teu form que resolve…[/quote]

Esse Form que eu tenho por exemplo tem 3 commandButtons e todos abrem outra pagina, mas soh esse de imprimir relatorio deveria abrir uma outra página. Como faço para os outros abrirem na mesma página?

[quote=Gbzao!]Eu uso o JasperRunManager.runReportToPdfStream para enviar o relatório para o browser.
E utilizo um commandLink com target _blank ( nova janela ).
Funciona perfeitamente.[/quote]

estou usando essa função:

byte array[] = JasperRunManager.runReportToPdf(jasperReport, parametros, con);

Estou gerando um stream e mandando para o Browser

ServletOutputStream servletOutputStream = res.getOutputStream(); servletOutputStream.write(stream);

Alguma coisa diferente que você está fazendo? Tem como fazer usando o botao e nao o link?

[]'s

Vc pode utilizar h:commandLink

Aqui eu utilizo assim :

<a4j:form id="formReport" target="_new">
                <rich:toolBar height="20" itemSeparator="line" >
                    <rich:toolBarGroup itemSeparator="line" location="right">
                        <h:panelGroup>
                            <div id="menu">
                                <a jsfc="h:commandLink" name="Gerar Relatório" title="Imprimir" 
                                   action="#{clienteReportBean.gerarRelatorio}">
                                    <span>
                                        <img src="imagens/icon/btnImprimir.png" />
                                        <h:outputText value="Imprimir"/>
                                    </span>
                                </a>
                            </div>   
                        </h:panelGroup>
                        <h:panelGroup>
                            <div id="menu">
                                <a jsfc="a4j:commandLink" name="Cancelar" reRender="formReport" title="Cancelar" 
                                   action="#{clienteReportBean.setarCampos}">
                                    <span>
                                        <img src="imagens/menu/cancelar.png" />
                                        <h:outputText value="Cancelar" />
                                        
                                    </span>
                                </a>
                            </div>
                        </h:panelGroup>

Ai acontece que o botão de gerar relatório abre outra página e o cancelar executa a função no bean e apenas renderiza a página.

Então rollei, você conseguiu abrir o relatório em outra página?!
Ressuscitei o tópico pq esse esta exatamente no contexto que gostaria e não acho necessário criar um novo e estamos usando métodos muito semelhantes.

Abraços!

Se for só um botão ou se sempre quiser abrir em outra janela então basta colocar o target do form para _blank.
E depois na action do botão fazer o retorno do método para string e encaminha-la à pagina desejada pelo faces-config.

Segue uma alternativa, utilizando o onclick

&lt;h:commandButton id="gerarRelatorio" value="Gerar Relatório" action="gerarRelatorio" onclick="this.form.target='_blank'" /&gt;

se houver outros botões basta não incluir o onclick

Estou com o mesmo problema e tenho mais 3 botões na tela. Se usar o _blank todos direcionam para outra pagina.

Tenho 3 botões. Salvar, Excluir, Voltar e Exibir Relatório. Todos tem q ser <h:commandButton> mas só o Exibir Relatório tem q abrir outra pag…

Alguem pode dar uma luz ai, estou com o mesmo problema do colega ai d cima!

Solução: Se voce usou em um dos botões para abrir uma nova aba (ou janela dependendo do browser):

onclick="this.form.target=’_blank’;

Todos os botões do seu form passam a abrir uma nova aba.
Para evitar que isso aconteça nos demais botões que não deseja essa ação use:

onclick="this.form.target=’_self’;

Valeu!

1 curtida

Resolvi esse problema da seguinte forma:

<h:form id="form" target="_blank">
                       // Formulario do relatório
        <p:commandButton id="gerar" value="GERAR" action="#{visualizadorBean.gerarPDf}" ajax="false"/>
</h:form>

No meu caso que preciso somente gerar o relatorio funcionu perfeitamente!!

A solução no onclick=“this.form.target=’_blank’” funcionou perfeitamente! Obrigado.

haaaaaaaaaaa num funciona… to com o mesmo problema seu tenho 3 botoes um pra editar outro pra confirma e outro para abrir o relatorio se eu coloco onclick=“this.form.target=’_self’” não funciona e assim onclick=“this.form.target=’_blank’” todos abrem em uma nova pagina… alguem????????????w

Pessoal obrigado pela ajuda.