Olá a todos, estou precisando gerar um relatório em pdf via browser pelo servlet pois tenho um projeto que é preciso ser entregue o quanto antes. Eu consegui gerar o relatorio usando o jasper JasperViewer e salvar como pdf, porem o que preciso é mostrar em pdf e a pessal baixar em pdf. Ja usei tanto recurso e indicacoes que nao funcionaram que estou usando agora um passo a passo do David Buzatto, inclusive ate enviei email para ver se ele poderia me ajudar, enfim segue projeto.
Meu projeto esta da seguinte maneira:
Index:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<a href="ReportServlet">ReportServlet</a></br>
</body>
</html>
Classe ConnectionFactory
package tutorialrelatoriosweb.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionFactory {
/*
* Este bloco estático será executado assim que esta classe for carregada,
* sendo assim, será executado apenas uma vez.
*/
static {
try {
/*
* Carrega a classe com.mysql.jdbc.Driver, que é a implementação
* do driver JDBC para o MySQL.
*/
Class.forName( "com.mysql.jdbc.Driver" );
// caso a classe não seja encontrada
} catch ( ClassNotFoundException exc ) {
/*
* Como log usaremos o stacktrace das excessões, mas recomendo
* que para um projeto real você utilize algum mecanismo de log
* melhor, como o Log4J por exemplo.
*/
exc.printStackTrace();
}
}
public static Connection getConnection(
String url,
String usuario,
String senha ) throws SQLException {
// retorna a conexão a partir do método getConnection de DriverManager
return DriverManager.getConnection( url, usuario, senha );
}
/**
* Obtém uma conexão para a base de dados sakila.
*
* @return Uma conexão para a base de dados sakila.
* @throws SQLException Caso ocorra algum problema durante a conexão.
*/
public static Connection getSakilaConnection() throws SQLException {
return getConnection(
"jdbc:mysql://localhost/sakila",
"root",
"123456" );
}
}
SERVLET
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package tutorialrelatoriosweb.servlets;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import tutorialrelatoriosweb.jdbc.ConnectionFactory;
import tutorialrelatoriosweb.util.ReportUtils;
/**
* Servlet para geração de relatórios.
*
* @author David Buzatto
*/
public class ReportServlet extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
OutputStream out = null;
// obtém o relatório compilado
InputStream inputStream = getClass().getResourceAsStream( "/ClientesPorNome.jasper" );
// preenche o mapa de parâmetros
Map<String, Object> parametros = new HashMap<String, Object>();
parametros.put( "primeiroNome", "D%" );
try {
// gera o relatório e atribui o OutputStream gerado
out = ReportUtils.createPDFReport( inputStream, parametros,
ConnectionFactory.getSakilaConnection(), response );
} catch ( SQLException exc ) {
exc.printStackTrace();
} catch ( JRException exc ) {
exc.printStackTrace();
} finally {
// se não aconteceu nenhum problema, fecha o output stream
if ( out != null ) {
out.close();
}
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
**ReportUtils**
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package tutorialrelatoriosweb.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;
/**
* Classe com métodos utilitários para gerar relatórios.
*
* @author David Buzatto
*/
public class ReportUtils {
/**
* Gera o relatório em PDF.
*
* @param inputStream InputStream que contém o relatório.
* @param parametros Parâmetros utilizados pelo relatório.
* @param conexao Conexão utilizada para a execução da query.
* @param response HttpServletResponse que será usado como base para
* gerar o relatório.
* @return O OutputStream do HttpServletResponse passado.
* @throws JRException Caso ocorra algum problema na geração do relatório.
* @throws IOException Caso ocorra algum problema na obtenção do
* OutputStream.
*/
public static OutputStream createPDFReport(
InputStream inputStream,
Map<String, Object> parametros,
Connection conexao,
HttpServletResponse response ) throws JRException, IOException {
// configura o content type do response
response.setContentType( "application/pdf" );
// obtém o OutputStream para escrever o relatório
OutputStream out = response.getOutputStream();
/*
* Cria um JasperPrint, que é a versão preenchida do relatório,
* usando uma conexão.
*/
JasperPrint jasperPrint = JasperFillManager.fillReport(
inputStream, parametros, conexao );
// Exporta em PDF, escrevendo os dados no outputStream do response.
JRExporter exporter = new JRPdfExporter();
exporter.setParameter( JRExporterParameter.JASPER_PRINT,
jasperPrint );
exporter.setParameter( JRExporterParameter.OUTPUT_STREAM,
out );
exporter.exportReport();
// retorna o OutputStream
return out;
}
}
Sou novo aqui, se tiver postado algo de errado peço desculpas desde ja, aguardo uma ajuda ai galera. Obrigado.
