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.