Tenho uma aplicação web que uso com JSF e estou tentando incorporar os Relatórios do jasper nele, tenho uma pagina xhtml que possue um simples botao que gera o relatorio, ao clicar nele, ele exibe a jasperViewer corretamente com o relatorio, porém quando clico no ‘X’ do jasperViewer para fechar o relatorio, ele derruba o tomcat e exibe o seguinte erro
GRAVE: The web application [/Curriculo] created a ThreadLocal with key of type [net.sf.jasperreports.engine.util.JRFontUtil$1] (value [net.sf.jasperreports.engine.util.JRFontUtil$1@1788424]) and a value of type [java.util.HashSet] (value [[]]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
E este é o codigo que uso para gerar o relatorio
[code]
public void gerarRelatorio() throws Exception {
//Connection con = HibernateUtil.getSession().connection();
Session sessao = HibernateUtil.getSession();
Connection con = sessao.connection();
//Connection con = new ConexaoMySQL().getConnection();
try {
package control;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import persistence.ProdutoDao;
public class Relatorio extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
execute(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
execute(request, response);
}
protected void execute(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
ProdutoDao d = new ProdutoDao();
try{
d.open();
//JasperReports -> iReport
//Passo o ResultSet do JDBC para o Relatorio
JRResultSetDataSource ds = new JRResultSetDataSource(d.findAll());
//Arquivo do relatório
JasperDesign jd = JRXmlLoader.load("c:\\aula\\relatorio.jrxml");
//Compilar o relatório
JasperReport jr = JasperCompileManager.compileReport(jd);
//Mescar os dados do JDBC ao documento do Relatório
JasperPrint jp = JasperFillManager.fillReport(jr, null, ds);
//Download de PDF
response.reset();
response.setContentType("application/pdf");
OutputStream out = response.getOutputStream();
JasperExportManager.exportReportToPdfStream(jp, out);
out.flush();
out.close();
}
catch(Exception e){
e.printStackTrace();
}
finally{
d.close();
}
}
}
No seu DAO, utilizei ProdutoDao:
public ResultSet findAll() throws Exception{
stmt = con.prepareStatement("select * from produto");
rs = stmt.executeQuery();
return rs; //Retorna o proprio ResultSet com os dados do JDBC
}
Ai você baixa o !Report… e cria um relatório com ele… com tutoriais vc consegue fácil !!!
E na sua JSP, você coloca uma action do formulário ou um link mesmo, chamando seu servlet…