Servlets JasperReports:从servlet调用报告

Servlets JasperReports:从servlet调用报告,servlets,jasper-reports,Servlets,Jasper Reports,我不熟悉JasperReports,不知道如何从servlet调用jasper文件。我的报告包含饼图。这里是在Servlet文件中创建的虚拟报告 它与普通Java类中的情况相同 只需确保文件顶部有jasper报表类的导入 下面的示例从XML数据源构建报告 public class JasperServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res)

我不熟悉JasperReports,不知道如何从servlet调用jasper文件。我的报告包含饼图。

这里是在Servlet文件中创建的虚拟报告

它与普通Java类中的情况相同

只需确保文件顶部有jasper报表类的导入

下面的示例从XML数据源构建报告

public class JasperServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        try {
            String reportFile = "myJasperReport.jrxml";
            File outputFile = new File("Report.pdf");
            HashMap hm = new HashMap();

            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory
                    .newDocumentBuilder();
            Document document = documentBuilder.parse(new File("myXml.xml"));

            // Compile the report
            JasperReport report = JasperCompileManager
                    .compileReport(reportFile);
            JRXmlDataSource xml = new JRXmlDataSource(document, "/xml/root");
            // Fill the report
            JasperPrint print = JasperFillManager.fillReport(report, hm, xml);
            // Create an Exporter
            JRExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE, outputFile);
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
            // Export the file
            exporter.exportReport();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

您可以准备Jasper文件并将其流式传输到客户端

bytes[] byteStream = JasperRunManager.runReportToPdf("myJasperReport.jasper",paramMap,databaseConn);

OutputStream outStream = servletResponse.getOutputStream();
response.setHeader("Content-Disposition","inline, filename=myReport.pdf");
response.setContentType("application/pdf");
response.setContentLength(byteStream.length);
outStream.write(bytes,0,bytes.length);

从servlet执行此操作的完整方法是:

public void myServletMethod(HttpServletRequest request, HttpServletResponse response) throws IOException{
            JasperReport jasperReport = null;
            JasperDesign jasperDesign = null;
            Map parameters = new HashMap();
            String path = getServletContext().getRealPath("/WEB-INF/");
            jasperDesign = JRXmlLoader.load(path+"/relative/path/to/MyReport.jrxml");
            jasperReport = JasperCompileManager.compileReport(jasperDesign);
            byte[] byteStream = JasperRunManager.runReportToPdf(jasperReport, parameters, **new DataSourceOfYourPreference**);                            
            OutputStream outStream = response.getOutputStream();
            response.setHeader("Content-Disposition","inline, filename=myReport.pdf");
            response.setContentType("application/pdf");
            response.setContentLength(byteStream.length);
            outStream.write(byteStream,0,byteStream.length);    

    }

通过填写
.jasper
文件,而不是在每次请求时编译报告,可以提高性能。