使用jasper和servlet以pdf格式创建报告

时间:2013-02-25 12:22:38

标签: java servlets jasper-reports

我想使用servlet,.jasper文件创建pdf格式的报告,但有一个例外:

  

HTTP状态500 - Servlet执行引发异常

--------------------------------------------------------------------------------

type Exception report

message Servlet execution threw an exception

description The server encountered an internal error that prevented it from fulfilling     this request.

exception 
     

javax.servlet.ServletException:Servlet执行引发异常

     

根本原因

     

java.lang.NoClassDefFoundError:   净/平方英尺/ JasperReports的/发动机/ JasperRunManager     one.Patient.doGet(Patient.java:46)     javax.servlet.http.HttpServlet.service(HttpServlet.java:621)     javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

     

注意Apache中提供了根本原因的完整堆栈跟踪   Tomcat / 7.0.34日志。

     

servlet代码是:

package one;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.util.HashMap;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;

/**
 * Servlet implementation class Patient
 */
@WebServlet("/Patient")
public class Patient extends HttpServlet implements Servlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Patient() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        Connection con=DBCon.getConnection();
        InputStream inS=getServletContext().getResourceAsStream("/report-src/ganeshaji.jashper");

        OutputStream outS=response.getOutputStream();
        response.setContentType("application/pdf");

        try {
            JasperRunManager.runReportToPdfStream(inS, outS, new HashMap<String, Object>(),con);
            outS.flush();
            con.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            response.setContentType("text/html");
            e.printStackTrace();
        }   
        }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

请。为我提供解决方案

2 个答案:

答案 0 :(得分:2)

通过调查根本原因

java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JasperRunManager 

好像你要么错过了jasper jar,要么错误的版本不支持JasperRunManager。

在类路径中包含适当的jar将解决您的问题。

请下载这些罐子:

itext-4.2.0.jar 

itextpdf-5.3.4.jar 

jasperreports-4.0.1.jar 

jasperreports-fonts-4.0.0.jar 

并编写如下代码:

try { 
FileInputStream fis = new FileInputStream(YOURREPORTPATH.jasper"); 
BufferedInputStream bufferedInputStream = new BufferedInputStream(fis); 
jasperReport = (JasperReport) JRLoader.loadObject(bufferedInputStream); 
} catch (Exception e2) {
 e2.printStackTrace(); 
}

然后在填充参数和数据源之后创建pdf,如下所示:

JasperExportManager.exportReportToPdfFile(jasperPrint, OUTPUTFILENAME+".pdf");

...谢谢

Mr.777

答案 1 :(得分:0)

检测到在NoClassDefFoundError之前抛出的根异常:net / sf / jasperreports / engine / util / JRStyledTextParser:

java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment

Unix和Linux上的Sun AWT课程依赖于X Window系统。当您使用这些类时,他们希望加载X客户端库并能够与X显示服务器通信。如果您的客户端有GUI,这是有意义的;不幸的是,即使您的客户使用AWT但没有GUI(这是我的情况,从Web应用程序生成报告),它也是必需的

绕过此方法的方法是在系统启动时设置系统属性java.awt.headless=true

例如

让java尽可能早地执行静态块,将其移到类的顶部!

  public class Foo() {
    static { /* works fine! ! */
      System.setProperty("java.awt.headless", "true");
      }

     public static void main() {}
  }

我认为可以通过将其作为参数传递给Java虚拟机来设置此参数,例如

-Djava.awt.headless =真。不确定这是否会对您应用程序的其他组件产生影响。

尝试将其放入$ {CATALINA_HOME} /bin/catalina.sh脚本中:

export JAVA_OPTS="${JAVA_OPTS} -Djava.awt.headless=true"

来自 - https://stackoverflow.com/a/3651196/1602230