Olá Pessoal!
Estou gerando relatórios no formato PDF com o IReport´s, isso conforme dicas e tutoriais encontrados neste fórum. Ontem peguei algumas dicas de como abrir o PDF direto no Browse, mas está apresentando erros e não consegui sacar o motivo.
O form abaixo aprensenta dois COMBOBOX e um botão GERAR Relatório.
cargahorariasem_rel.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" import="bean.*,dao.*,java.util.*" errorPage="erro.jsp"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Relação Carga Horária</title>
</head>
<body>
<div id="paginaCargaHorariaSem_Rel">
</div>
<p class="txtTitulo">
Comparação Carga Horária Semestre<hr color="#000080">
</p>
<Script>
function carregaPagina(paramRegistro){
if(window.ActiveXObject) //IE
req = new ActiveXObject("Microsoft.XMLHTTP");
else if (window.XMLHttpRequest) // não IE
req = new XMLHttpRequest();
if(paramRegistro==null){
req.open("GET","cargahorariasem_rel.jsp",false);
req.send(null);
} else {
req.open("POST","cargahorariasem_rel_emissor.jsp",false);
req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
req.send(paramRegistro);
}
req.onreadystatechange = function() {
if(req.readyState==4){
var retorno = req.responseText;
var pagina = document.getElementById("paginaCargaHorariaSem_Rel");
pagina.innerHTML = retorno;
alert(retorno);
//carrega novamente a listagem de carga horaria, caso o retorno esteja vazio
if(retorno.trim() == ""){
document.formCargaHorariaSem_Rel.gerar.focus();
}
}
}
}
function gerarRelatorio(opcao){
if (validarFormulario()){
semestreAtualId = document.formCargaHorariaSem_Rel.semestreAtualId.value;
indexAtualId = document.getElementById("semestreAtualId").selectedIndex;
semestreAtualDescricao = document.formCargaHorariaSem_Rel.semestreAtualId.options[indexAtualId].text;
semestreAntId = document.formCargaHorariaSem_Rel.semestreAntId.value;
indexAntId = document.getElementById("semestreAntId").selectedIndex;
semestreAntDescricao = document.formCargaHorariaSem_Rel.semestreAntId.options[indexAntId].text;
param = "semestreAtualId="+semestreAtualId;
param+= "&semestreAtualDescricao="+semestreAtualDescricao;
param+= "&semestreAntId="+semestreAntId;
param+= "&semestreAntDescricao="+semestreAntDescricao;
param+= "&opcao="+opcao;
carregaPagina(param);
}
}
function validarFormulario(){
if(document.formCargaHorariaSem_Rel.semestreAtualId.value==document.formCargaHorariaSem_Rel.semestreAntId.value){
alert("Selecione Semestres diferentes");
document.formCargaHorariaSem_Rel.semestreAtualId.focus();
return false;
}
return true;
}
</Script>
<%
//Para o IE nao fazer cache do <div> ao usar AJAX
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
SemestreDao semestreDao = new SemestreDao();
List listaSemestre = semestreDao.getListaSemestres();
%>
<form method="post" name="formCargaHorariaSem_Rel" id="formCargaHorariaSem_Rel">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td class="txtDestaque"> Selecione: Semestre Atual:
<select name="semestreAtualId" class="forms">
<%
Iterator iteratorSemAtual = listaSemestre.iterator();
while (iteratorSemAtual.hasNext()) {
Semestre semestre = (Semestre)iteratorSemAtual.next();
out.print("<option value='" + semestre.getSmt_id()+"'>" + semestre.getSmt_descricao()+"</option>");
}
%>
</select>
</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td class="txtDestaque"> Semestre Anterior:
<select name="semestreAntId" class="forms">
<%
Iterator iteratorSemAnt = listaSemestre.iterator();
while (iteratorSemAnt.hasNext()) {
Semestre semestre = (Semestre)iteratorSemAnt.next();
out.print("<option value='" + semestre.getSmt_id()+"'>" + semestre.getSmt_descricao()+"</option>");
}
%>
</select>
</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td colspan="2">
<input name="gerar" value="Gerar Relatório" class="forms" type="button" onClick="gerarRelatorio('pdf')">
</td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<hr color="#000080">
</form>
</body>
</html>
Ao clicar em “Gerar Relatório” é chamado o cargahorariasem_rel_emissor.jsp:
<%@page import="net.sf.jasperreports.engine.JasperFillManager"%>
<%@page import="net.sf.jasperreports.engine.JasperPrint"%>
<%@page import="net.sf.jasperreports.engine.JasperExportManager"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" import="dao.*,impressao.*,java.util.*,net.sf.*" errorPage="erro.jsp"%>
<%
//Para o IE nao fazer cache do <div> ao usar AJAX
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
int semestreAtualId = Integer.parseInt(request.getParameter("semestreAtualId"));
String semestreAtualDescricao = request.getParameter("semestreAtualDescricao");
int semestreAntId = Integer.parseInt(request.getParameter("semestreAntId"));
String semestreAntDescricao = request.getParameter("semestreAntDescricao");
AlocacaoDao alocacaoDao = new AlocacaoDao();
List listAlocacao = null;
try {
listAlocacao = alocacaoDao.getListaAlocacaoesSemestre(semestreAtualId,semestreAntId);
}catch (Exception e){
e.printStackTrace();
}
Map par = new HashMap();
par.put("parSemAtual",semestreAtualDescricao);
par.put("parSemAnt",semestreAntDescricao);
String[] camposRel = new String[]{"professor_pfr_nome", "professor_pfr_qtdHoras", "sem_atual","sem_ant"};
byte[] bytes = null;
try {
//carrega arquivos Jasper
String pathJasper = getServletContext().getRealPath("/relatorios/") + "/";
HibernateQueryRS jrRS = new HibernateQueryRS(listAlocacao, camposRel);
Map parametros = new HashMap();
//direciona o relatorio para um stream
JasperPrint impressao = JasperFillManager.fillReport(pathJasper+"relCargaHorariaSemestre.jasper", parametros, jrRS);
bytes = JasperExportManager.exportReportToPdf(impressao);
}
catch(Exception e){
e.printStackTrace();
throw new ServletException(e);
}
if(bytes != null && bytes.length > 0) {
//envia o relatorio em pdf para o browser
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(bytes,0,bytes.length);
outputStream.flush();
outputStream.close();
}
%>
O erro apresentado:
16:19:10,859 ERROR [jsp]:253 - Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:599)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:195)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:117)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:191)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:115)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
at org.apache.jsp.cargahorariasem_005frel_005femissor_jsp._jspService(cargahorariasem_005frel_005femissor_jsp.java:119)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
Qualquer dica é bem vinda.