Salve Pessoal,
Estou procurando bastante mas nao tenho encontrado nada em relacao ao problema que eu tinha descrito aqui: "Em uma aplicacao Struts eu gostaria de gerar o PDF e apresenta-lo em uma nova janela. Na sequencia eu gostaria de direcionar o fluxo para uma pagina onde eu possa apresentar uma mensagem informando se o relatorio foi gerado perfeitamente ou nao".
Depois de quebrar a cabeça acho que o problema esta no HibernateFilter que fecha a conexao com o BD pra mim. Vou colocar as principais partes do codigo abaixo.
public class HibernateFilter implements Filter {
private static Log log = LogFactory.getLog(HibernateFilter.class);
public void init(FilterConfig filterConfig) throws ServletException {
log.info("Servlet filter init, now opening/closing a Session for each request.");
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// There is actually no explicit "opening" of a Session, the
// first call to HibernateUtil.beginTransaction() in control
// logic (e.g. use case controller/event handler) will get
// a fresh Session.
try {
chain.doFilter(request, response);
// Commit any pending database transaction.
HibernateUtil.commitTransaction();
} finally {
// No matter what happens, close the Session.
HibernateUtil.closeSession();
}
}
public void destroy() {}
}
Action:
public ActionForward relComleto(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
// Cria uma sessão
HttpSession session = request.getSession();
// Cria um manipulador para ler o arquivo de propriedades
MessageResources messageResources = getResources(request);
// Verifica se o usuário realizou o login
Usuario usuario = (Usuario) session.getAttribute("usuario");
if (usuario == null) {
log.debug("==> Tentativa de acesso a página sem ter realizado login!");
ActionMessages errors = new ActionMessages();
errors.add("", new ActionMessage("user.not.login"));
saveErrors(request, errors);
// Encaminha o processamento
return mapping.findForward(GLOBAL_FORWARD_login);
}
// Recupera o título do arquivo de propriedades e salva na requisição
String tit = messageResources.getMessage("tit.pdf");
setTitulo(request, tit);
// Constrói um formatador de datas
SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
// Recupera as datas mínimas e máximas disponíveis da sessão como Strings
String inicioDisp = (String) session.getAttribute("inicioDisp");
String fimDisp = (String) session.getAttribute("fimDisp");
// Constrói as datas disponíveis como Date
Date inicioDispD = formatador.parse(inicioDisp);
Date fimDispD = formatador.parse(fimDisp);
//Recupera os dados do formulário de login
PDFForm pdfForm = (PDFForm) form;
// Recupera as datas escolhidas como Strings
String inicio = pdfForm.getInicio();
String fim = pdfForm.getFim();
// Constrói as datas escolhidas como Date
Date dInicio = formatador.parse(inicio);
Date dFim = formatador.parse(fim);
// Verifica se as datas escolhidas estão no limite permitido
// caso não estejam gera uma mensagem de erro e redireciona
if (dInicio.before(inicioDispD) || dFim.after(fimDispD) ||
dInicio.after(fimDispD) || dFim.before(inicioDispD)) {
log.debug("==> Datas escolhidas fora do intervalo permitido");
ActionMessages errors = new ActionMessages();
errors.add("", new ActionMessage("date.out.limit"));
saveErrors(request, errors);
// Encaminha o processamento
return mapping.findForward(LOCAL_FORWARD_relCompleto);
}
// Verifica se existe um token na requisicao
if(isTokenValid(request)) {
// Salva um token na sessão
saveToken(request);
// HashMap de parâmetros utilizados no relatório. Sempre instanciados
Map parameter = new HashMap();
parameter.put("inicio", dInicio);
parameter.put("fim", dFim);
// Constrói a coleção que representa a fonte de dados
Collection reportRows = (ArrayList) initializeCollectionCompleta(dInicio, dFim);
// Defina a stream de saída
ServletOutputStream servletOutputStream = response.getOutputStream();
// Define a stream de entrada como o JasperReport compilado
InputStream reportStream = getServlet().getServletConfig().
getServletContext().getResourceAsStream("/relatorios/DefalhasGeralPojos.jasper");
try {
// Constrói o DatSource a partir da coleção de pojos
JRDataSource datasource = createReportDataSource(reportRows);
// Cria o relatório em uma stream
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, parameter,
datasource);
// Define que o conteúdo de saída será um pdf
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "attachment;filename=" + "RelCompleto.pdf");
// Fecha o stream de saída
//servletOutputStream.flush();
//servletOutputStream.close();
} catch (Exception e) {
// Apresenta a pilha de erros no navegador
log.info("Erro na geração do PDF: " + e.getMessage());
StringWriter stringWriter = new StringWriter();
PrintWriter printerWriter = new PrintWriter(stringWriter);
e.printStackTrace(printerWriter);
response.setContentType("text/plain");
response.getOutputStream().print(stringWriter.toString());
}
}
else {
// Armazena a Mensagem de problema na inserção na requisição
String msg = messageResources.getMessage("msg.fluxo");
request.setAttribute("mensagem", msg);
}
// Encaminha o processamento
return mapping.findForward(GLOBAL_FORWARD_mensagem);
}
Pagina JSP:
<%@ include file="/pages/header.jsp"%>
<!-- ========== Corpo da Página =================================== -->
<tr>
<td valign="top" align="center" style="padding: 6; background: #ffffdd; border: 1; border-color: #004080; background: navy">
<b><font size="3" face="Verdana" >
<c:out value="${titulo}" /></font></b>
</td>
</tr>
<tr>
<td height="12"> </td>
</tr>
<tr>
<td align="left" style="font-size: 90%"><html:errors /></td>
</tr>
<tr>
<td align="center" valign="center">
<table border="1" width="100%" style="padding: 24; background: #ffffdd; font-size: 90%">
<html:form action="/relPDF" onsubmit="return validatePDFForm(this);">
<!-- ===[ Campo hidden necessário para "enganar" o validador ]=== -->
<html:hidden property="idTipoElemento" value="1"/>
<tr style="color: #0000a0; background-color: #fffa91;">
<td align="center"><b><fmt:message key="tab.semfiltros"/></b></td>
</tr>
<tr>
<td>
<table border="0" width="100%" id="table1">
<tr>
<td width="170" height="23" align="left"><b><fmt:message key="tit.periodoDisp"/></b></td>
<td width="20" height="23" align="left"><fmt:message key="tit.inicio"/></td>
<td height="23" align="left">
<html:text name="PDFForm" property="inicioD" size="8" value="${inicioDisp}" disabled="true" style="text-align: center;"/>
</td>
<td height="23" width="20" align="left"><fmt:message key="tit.final"/></td>
<td height="23" align="left">
<html:text name="PDFForm" property="fimD" size="8" value="${fimDisp}" disabled="true" style="text-align: center;"/>
</td>
</tr>
<tr>
<td width="170" height="23" align="left"><b><fmt:message key="tit.periodoSel"/></b></td>
<td width="20" height="23" align="left"><fmt:message key="tit.inicio"/></td>
<td height="23" align="left">
<html:text name="PDFForm" property="inicio" size="8" />
<a ><img ></a><br>
</td>
<td height="23" width="20" align="left"><fmt:message key="tit.final"/></td>
<td height="23" align="left">
<html:text name="PDFForm" property="fim" size="8" />
<a ><img ></a><br>
</td>
</tr>
</table>
</td>
</tr>
<!-- Botões da página -->
<tr align="center" style="background-color: #c4c4e1;">
<td>
<html:submit property="submit"><fmt:message key="button.relcomp"/></html:submit>
<html:cancel property="submit"><fmt:message key="button.cancel"/></html:cancel>
</td>
</tr>
<!-- Begin Validator Javascript Function-->
<html:javascript formName="PDFForm" dynamicJavascript="true" staticJavascript="true"/>
<!-- End of Validator Javascript Function-->
</html:form>
</table>
</td>
</tr>
<script language="JavaScript">
<!-- // create calendar object(s) just after form tag closed
// specify form element as the only parameter (document.forms['formname'].elements['inputname']);
// note: you can have as many calendar objects as you need for your application
var cal1 = new calendar1(document.forms['PDFForm'].elements['inicio']);
cal1.year_scroll = true;
cal1.time_comp = false;
var cal2 = new calendar1(document.forms['PDFForm'].elements['fim']);
cal2.year_scroll = true;
cal2.time_comp = false;
//-->
</script>
<!-- ========== Corpo da Página =================================== -->
<%@ include file="/pages/footer.txt"%>
O stackTrace do erro eh:
ERROR [http-8080-Processor23] (StandardWrapperValve.java:260) - Servlet.service() for servlet action threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:313)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at br.com.bandeirante.util.HibernateFilter.doFilter(HibernateFilter.java:47)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
ERROR [http-8080-Processor23] (StandardWrapperValve.java:260) - Servlet.service() for servlet action threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:313)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at br.com.bandeirante.util.HibernateFilter.doFilter(HibernateFilter.java:47)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
Da pra ver que o erro esta dando no HibernateFilter.java:47.
Sera que alguem tem alguma ideia pra me ajudar?
Obrigado,
celso