问题描述:我在JSP里面使用jasperreport来编译.jrxml文件,好像不行啊。可是如果我用的是java文件却可以。
源代码如下:
<%@ page contentType="text/html;charset=GBK"%><%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.sql.*"%><%@ page import="net.sf.jasperreports.engine.*"%><%@ page import="net.sf.jasperreports.engine.JasperFillManager"%>
 <%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
 <%@ page import="net.sf.jasperreports.engine.JRException"%>
 <%@ page import="net.sf.jasperreports.engine.JasperRunManager"%><%
String path =session.getServletContext().getRealPath("/");//String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<%
//这个是用来联接我的mysql 的JDBC URL
try {
Class.forName("org.gjt.mm.mysql.Driver");
Connection con = DriverManager
.getConnection(
"jdbc:mysql://localhost:3306/bugfreej?useUnicode=true&characterEncoding=gb2312",
"root", "admin"); //报表编译之后生成的.jasper 文件的存放位置
// File reportFile = new File(application
// .getRealPath("jasper/demo1.jrxml"));
// if (reportFile == null)
// throw new JRRuntimeException(
// "File WebappReport.jasper not found. The report design must be compiled first.");

//编译报表
System.out.println("Starting...");
//System.out.println("path:"+basePath);
System.out.println("path:"+path+"jasper\\bao1.jrxml");
String cc = path+"jasper\\demo1.jrxml";

JasperReport jasperReport = null;
jasperReport = JasperCompileManager.compileReport(cc);
System.out.println("Complieling...");

//向报表中定义的参数赋值
Map props = new HashMap();
System.out.println("---------Jasper begin-------------");
//在控制台显示一下报表文件的物理路径
// System.out.println(reportFile.getPath());
// fill
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,props,con);

byte[] bytes = JasperRunManager.runReportToPdf(jasperReport
, props, new JREmptyDataSource());
System.out.println("---------Jasper end-------------");
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
} catch (ClassNotFoundException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } catch (JRException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } catch (SQLException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
%> </body>
</html>
页面上的错误信息如下:
HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception org.apache.jasper.JasperException: An exception occurred processing JSP page /Jasreport_test.jsp at line 4542:  String cc = path+"jasper\\demo1.jrxml";
43: 
44:  JasperReport jasperReport = null;
45:  jasperReport = JasperCompileManager.compileReport(cc);
46:  System.out.println("Complieling...");
47: 
48:  //向报表中定义的参数赋值
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:524)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:850)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
org.apache.jsp.Jasreport_005ftest_jsp._jspService(Jasreport_005ftest_jsp.java:159)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
org.apache.commons.digester.Digester.<init>(Digester.java:304)
net.sf.jasperreports.engine.xml.JRXmlDigester.<init>(JRXmlDigester.java:62)
net.sf.jasperreports.engine.xml.JRXmlDigesterFactory.createDigester(JRXmlDigesterFactory.java:975)
net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:203)
net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:168)
net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:152)
net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:151)
org.apache.jsp.Jasreport_005ftest_jsp._jspService(Jasreport_005ftest_jsp.java:107)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.13 logs.我觉得这个问题的原因在这条语句上:
jasperReport = JasperCompileManager.compileReport(cc);
然后报错:
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory可是源jrxml文件我在ireports里面编译的也没有错误,而且在java程序里面也能正常的编译执行生成报表啊。
希望有高手前辈可以给我提供一个思路,不胜感激!!