Java 如何在servlet中运行jasper报表

Java 如何在servlet中运行jasper报表,java,servlets,jasper-reports,Java,Servlets,Jasper Reports,我有一个简单的jasper报告,其中显示了数据库中的一些数据。jasper报告在ireport designer上运行良好。问题是当我试图从servlet运行报告时。我试图在从servlet运行时将报告导出为pdf。 我包括了依赖项,比如 - jasperreports-4.6.0.jar - itextpdf-5.1.1.jar - commons-logging-1.1.1.jar - commons-collections-3.2.1.jar - commons-beanutils-1.8

我有一个简单的jasper报告,其中显示了数据库中的一些数据。jasper报告在ireport designer上运行良好。问题是当我试图从servlet运行报告时。我试图在从servlet运行时将报告导出为pdf。 我包括了依赖项,比如

- jasperreports-4.6.0.jar
- itextpdf-5.1.1.jar
- commons-logging-1.1.1.jar
- commons-collections-3.2.1.jar
- commons-beanutils-1.8.3.jar
- commons-digester3-3.2.jar
- cglib-2.2.jar
我已将report1.jasper文件放在/web/report1.jasper中 这是我的servlet文件:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    Connection connection;
    ServletOutputStream servletOutputStream =response.getOutputStream();

    InputStream reportStream =getServletConfig().getServletContext().getResourceAsStream("/report1.jasper");

    HashMap parameterMap = new HashMap();
    String stdID="510BCT2010";
    String semester="1";
    parameterMap.put("stdID", stdID);
    parameterMap.put("semester", semester);
    try
    {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        connection = DriverManager.getConnection ("jdbc:odbc:ACEM","","");
        JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream, parameterMap, connection);

        connection.close();
        response.setContentType("application/pdf");
        servletOutputStream.flush();
        servletOutputStream.close();
    }
    catch (Exception e)
    {
        // display stack trace in the browser
        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);
        e.printStackTrace(printWriter);
        response.setContentType("text/plain");
        response.getOutputStream().print(stringWriter.toString());
    }
}
第一次运行servlet时,出现以下错误:

java.lang.NoClassDefFoundError: org/apache/commons/digester/Rule
net.sf.jasperreports.components.ComponentsExtensionsRegistryFactory.<clinit>(ComponentsExtensionsRegistryFactory.java:100)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:247)
net.sf.jasperreports.engine.util.JRClassLoader.loadClassForRealName(JRClassLoader.java:157)
net.sf.jasperreports.engine.util.JRClassLoader.loadClassForName(JRClassLoader.java:115)
net.sf.jasperreports.engine.util.ClassUtils.instantiateClass(ClassUtils.java:53)
net.sf.jasperreports.extensions.DefaultExtensionsRegistry.instantiateRegistry(DefaultExtensionsRegistry.java:237)
net.sf.jasperreports.extensions.DefaultExtensionsRegistry.loadRegistries(DefaultExtensionsRegistry.java:214)
net.sf.jasperreports.extensions.DefaultExtensionsRegistry.loadRegistries(DefaultExtensionsRegistry.java:162)
net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getRegistries(DefaultExtensionsRegistry.java:133)
net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getExtensions(DefaultExtensionsRegistry.java:105)
net.sf.jasperreports.engine.util.JRStyledTextParser.<clinit>(JRStyledTextParser.java:83)
net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:121)
net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:88)
net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:103)
net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:61)
net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:153)
net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:55)
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:446)
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:407)
net.sf.jasperreports.engine.JasperRunManager.runToPdfStream(JasperRunManager.java:201)
net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:720)
com.reports.reportGenerator.doGet(reportGenerator.java:54)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
java.lang.NoClassDefFoundError:org/apache/commons/digester/Rule
net.sf.jasperreports.components.ComponentSextensionRegistryFactory。(ComponentSextensionRegistryFactory.java:100)
java.lang.Class.forName0(本机方法)
java.lang.Class.forName(Class.java:247)
net.sf.jasperreports.engine.util.JRClassLoader.loadClassForRealName(JRClassLoader.java:157)
net.sf.jasperreports.engine.util.JRClassLoader.loadClassForName(JRClassLoader.java:115)
net.sf.jasperreports.engine.util.ClassUtils.InstanceClass(ClassUtils.java:53)
net.sf.jasperreports.extensions.DefaultExtensionsRegistry.InstanceRegistry(DefaultExtensionsRegistry.java:237)
net.sf.jasperreports.extensions.DefaultExtensionsRegistry.loadRegistries(DefaultExtensionsRegistry.java:214)
net.sf.jasperreports.extensions.DefaultExtensionsRegistry.loadRegistries(DefaultExtensionsRegistry.java:162)
net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getRegistries(DefaultExtensionsRegistry.java:133)
net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getExtensions(DefaultExtensionsRegistry.java:105)
net.sf.jasperreports.engine.util.JRStyledTextParser。(JRStyledTextParser.java:83)
net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:121)
net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:88)
net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:103)
net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:61)
net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:153)
net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:55)
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:446)
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:407)
net.sf.jasperreports.engine.JasperRunManager.runToPdfStream(JasperRunManager.java:201)
net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:720)
doGet(reportGenerator.java:54)
javaservlet.http.HttpServlet.service(HttpServlet.java:621)
javaservlet.http.HttpServlet.service(HttpServlet.java:722)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
当我运行servlet之后,我得到以下错误

java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:121)
net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:88)
net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:103)
net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:61)
net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:153)
net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:55)
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:446)
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:407)
net.sf.jasperreports.engine.JasperRunManager.runToPdfStream(JasperRunManager.java:201)
net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:720)
com.reports.reportGenerator.doGet(reportGenerator.java:54)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
java.lang.NoClassDefFoundError:无法初始化类net.sf.jasperreports.engine.util.JRStyledTextParser
net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:121)
net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:88)
net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:103)
net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:61)
net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:153)
net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:55)
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:446)
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:407)
net.sf.jasperreports.engine.JasperRunManager.runToPdfStream(JasperRunManager.java:201)
net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:720)
doGet(reportGenerator.java:54)
javaservlet.http.HttpServlet.service(HttpServlet.java:621)
javaservlet.http.HttpServlet.service(HttpServlet.java:722)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

它说java.lang.NoClassDefFoundError。我错过了一些依赖项吗?我的报告没有图表,只从数据库中获取数据。鉴于stacktrace,您的依赖项中似乎缺少apache commons digester。

我解决了这个问题。Jasper报表库依赖项取决于其版本。jasperreport 4.6要求。我还有新的itext库(5.1),但JasperReport4.6仍然使用itext-2.1.7

请看一下[1]: