Como abrir um relatório em nova janela?

15 respostas
guilhermetonetto

Estou desenvolvendo uma aplicação em JSP, e no action tenho o código que implementa meu relatório desenvolvido com jasper report. Quando clico em relatório, ele abre na mesma janela, sendo que qdo eu volto a página a aplicação perde o caminho e tenho que logar novamente. Coloquei um target="_blank" no evento do botão…mas ele perde o caminho. Acredito que para abrir em nova janela deva ser colocado alguma propriedade que faça isso no próprio action onde tenho o restante do código do relatório.Alguém pode me ajudar em como faço para abrir esse meu relatório em uma nova janela??

15 Respostas

psandrelli

Coloca o target do seu form assim:

target="_blank"
guilhermetonetto

mas nao tem como colocar no action?? pois é o unico lugar onde eu chamo o relatorio. e no evento do botão(que seria no JSP) ele perde o caminho e não consegue abrir o relatorio.

[]'s

psandrelli

Vc tá usando algum framework? Struts por exemplo.
Na minha action do Struts, quando ela cospe o relatório, ou seja, faz o flush(), se eu não deixo o target, ela gera na mesma página.

edwins

Vc está desenvolvendo com struts?

Você está setando na sua action os headers do response para receber conteúdo pdf ao invés de html? Exemplo:

response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=MeuRelatorio.pdf");
response.getOutputStream().write(relatorio); //Assuma que relatorio é um array de bytes.
guilhermetonetto

sim eu uso Struts , mas onde vc coloca o target? pq se eu tentar colocar junto com o flush() ele da erro pq nao reconhece o target. vc coloca no form né? mas não teria como colocar algum método que abra outra pg no action?? Pois eu não tenho nada referente ao relatorio no form.

[]'s

guilhermetonetto

edwins,

é bem isso que eu estou desenvolvendo.

1. response.setContentType("application/pdf"); 2. response.setHeader("Content-Disposition", "attachment; filename=MeuRelatorio.pdf"); 3. response.getOutputStream().write(relatorio); //Assuma que relatorio é um array de bytes.

tem como colocar dentro deste codigo alguma propriedade para abrir em outra pg?

pode me ajudar?

[]'s

roberiomatos

Kara não sei se resolve teu problema, + tenta assim:

na tua JSP vc retira a tag <form> dela, e no botão vc coloca assim:

<input id="teste" onclick="onclick"/>

depois, dentro do <head> vc coloca esse código javascript:

<script language="javascript">
     function onclick(){
          window.open("servlet");
     }
</script>

desta forma vc não perde as informações q estão na tela, e quando ele for abrir o PDF ele abre dentro de uma nova janela.

leosouzabh

Na verdade vc coloca o target na sua JSP
<html:form action="…" target="_blank">

Fazendo assim da certo, so que todo submit vai para uma outra janela.

ou vc pode fazer por javascript no botão que imprime

function imprimirRelatorio(){ with(document.forms[0]){ method.value="imprimir"; target="_blank"; submit(); target=""; } }

edwins

Cara, sinceramente eu nunca enfrentei este problema. Nos relatórios que implementei, tanto para o IE 6 e 7, quanto para o Mozilla Firefox o relatório vem como opção de download para o usuário e é sempre aberto eu uma nova janela, sem comprometer a janela que gerou o relatório. Para tal, eu boto a resposta como um application pdf e retorno um ActionForward nulo. Ex:

public ActionForward gerarRelatorio(ActionMapping mapping, 
			ActionForm aform, HttpServletRequest request, 
			HttpServletResponse response) throws Exception {

byte[] output = getRelatorio();
response.setContentType("application/pdf");    
response.setHeader("Content-Disposition", "attachment; filename=MeuRelatorio.pdf");    
response.getOutputStream().write(relatorio); 

return null;
}

Acho que é só isto. Estou procurando se existe mais alguma configuração necessária aqui.
Se achar te respondo.
Cara vc pode mandar o código que chama esta Action, a url ou o submit.

edwins

leosouza, uma dúvida que surgiu agora. O que faz o método javascript with() ?

guilhermetonetto

edwins,

Esse é o código implementado no meu action SaveMemorandoAction:

if (acao.equals("relatorio")){ 
                    
                       System.out.println("esta na acao relatório");         
             
                       ToolBarBean bar = (ToolBarBean) session.getAttribute("session_actiontool");
                           
                       if(bar.getUsp_relat().equals("1")){
                            
                                                       
                            JREmptyDataSource ED = new JREmptyDataSource();
                            
                            // perfeito                                                        
                            String  caminho2 = this.getClass().getResource("/com/tn3/protocolonh/action/programas/memorandos/novohamburgo.jasper").getPath();                            
                                
                            
                             Map<String, Object> params = new HashMap<String, Object>();
                             
                             //EditExcMemorandoForm memForm = (EditExcMemorandoForm) form;
                             MemorandoForm memForm = (MemorandoForm) form;
                             
                             //MemorandoBean mem = memForm.getMem();
                             
                                                          
                             java.awt.Image img1 = new ImageIcon(new URL("http://"+request.getLocalAddr()+":"+request.getLocalPort()+request.getContextPath()+"/pages/images/img01.jpg")).getImage();   
                             java.awt.Image img2 = new ImageIcon(new URL("http://"+request.getLocalAddr()+":"+request.getLocalPort()+request.getContextPath()+"/pages/images/img02.gif")).getImage();   
                             
                             System.out.println("param:: "+memForm.getMem().getMem_codigo());
                             params.put("mem_codigo", memForm.getMem().getMem_codigo());
                             params.put("dest", metodos.getRelatorioMem(memForm.getMem().getMem_codigo()));
                             params.put("brasao", img1);
                             params.put("imagem", img2);
                             params.put("SUBREPORT_DIR", this.getClass().getResource("/com/tn3/protocolonh/action/programas/memorandos/").getPath());
                             
                             
                             
                             
                             
                            JasperReport relatorio = (JasperReport) JRLoader.loadObject(caminho2);
                            JasperPrint impressao = new JasperPrint();
                            impressao = JasperFillManager.fillReport(relatorio, params, ConexaoBean.getDataSource().getConnection() );
                            
                            
                            
                            ByteArrayOutputStream baos = new ByteArrayOutputStream();
                           // byte[] buffer = JasperExportManager.exportReportToPdf(impressao);
                            
                            baos.write(JasperExportManager.exportReportToPdf(impressao));
                            
                            baos.close();
                              
                            response.reset();
                                                               
                            response.setHeader("Content-disposition", "inline; filename=novohamburgo.pdf" );
                            
                            response.setContentType("application/pdf");
                            
                                                        
                            response.setContentLength(baos.size());    
                            
                            ServletOutputStream sos;
                            sos = response.getOutputStream();
                            
                            
                            baos.writeTo(sos);
                            sos.flush();                          
                            sos.close();
                            
                            
                    
                            return null;
                            
                            }else{
                                                      
                           return mapping.findForward("memvisual");
                      }

Só que neste action existem várias outras ações tbm!! dai esse action é chamado no meu jsp :

<form action="savememorandoaction.do" method="post" name="adminForm" >

Mas o botão que imprime o relatório não esta neste JSP, e sim em outro que somente inicializa e passa as ações para os botões:

<c:if test='${session_actiontool.usp_relat == "1"}'>  
                      
                      <td>

			<a class="toolbar" href="javascript: submitbutton('relatorio')" >

				<img src="pages/images/printer.png" alt="relatorio" align="middle" name="relatorio" border="0" hspace="4" vspace="4" /><br />Relatório</a>

                        </td>
                                          
                      
                  
                    
                </c:if>

E de códigos é isso....

Tentei aplicar as funções acima...mas não obti nenhum resultado positivo!! Se alguém souber de mais alguma coisa que possa ser feito...agradeço!

edwins

Tente mudar o header “Content-Disposition”, coloque attachment ao invés de inline. Este arquivo irá ser disponibilizado para download ao usuário. Deverá acabar com o problema da janela, eu acredito

response.setHeader("Content-Disposition", "attachment; filename=Whatever.pdf");

Abraxx

guilhermetonetto

edwins

Cara…funcionou!!! agora abre para download em uma outra janela!! Valeu…

leosouzabh

edwins:
leosouza, uma dúvida que surgiu agora. O que faz o método javascript with() ?

e como se o codigo estivesse assim:

function imprimirRelatorio(){                 
     
     document.forms[0].method.value="imprimir";  
     document.forms[0].target="_blank";  
     document.forms[0].submit();  
     document.forms[0].target="";                    
 }
edwins

ahhh, entendi !!! Bom saber, mas uma coisa pra se aprender. Vlw.

Criado 11 de janeiro de 2008
Ultima resposta 16 de jan. de 2008
Respostas 15
Participantes 5