Como abrir um relatório em nova janela?

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??

Coloca o target do seu form assim:

target="_blank"

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

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.

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.

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

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

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.

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=""; } }

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.

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

edwins,

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

[code]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");
                  }[/code]

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:

[code] <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> [/code]

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!

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

edwins

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

[quote=edwins]leosouza, uma dúvida que surgiu agora. O que faz o método javascript with() ?
[/quote]

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="";                    
 }

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