使用eclipse在jsp上显示水晶报表(转)2008-09-10 20:23:32| 分类:Java | 标签:|举报|字号大中小订阅我使用的开发IDE是eclipse3.2,服务器是tomcat5.5新建一个Crystal reports web项目在Target runtime选择apache tomcat v5.5下一步中crystal reports java reporting component、dynamic web module、java是默认选中的,这三个是必需的,你也可添加struts,后面的设置会要求你添加struts的类库。
在最后面默认加入示例的数据库和报表。
这样一个Crystal Reports web项目就建立了(上面的步骤应该是地球人都可以完成吧)在里面有个CrystalReport1.rpt和CrystalReport_viewer.jsp右键CrystalReport_viewer.jsp->运行方式->Run on Server,点击完成。
你应该就可以看到一个空的水晶报表了吧(为什么空的,当然啦,CrystalReport1.rpt本身是空的)在看看sample reports文件夹里面,有4个示例的.rpt报表文件,右击其中任何一个,选中Crystal Reports-》创建查看器JSP,就会创建一个*-viewer.jsp文件。
运行这个文件,你应该可以看到一个水晶报表了吧。
我想这对大部分人应该都是没有问题的,剩下的事情就是好好分析这个项目里面所有的东东了-------------------------------------------------------------------------------------------------------------------------------------------------------上面什么东西是在任何项目中实现都必须的呢?为此我特意建立一个新的tomcat项目,最好建一个简单的jsp页面测试下你的tomcat项目是否可以正常运行.通过本人的实验,在其他项目中JSP运行水晶报表的话,需要的类文件跟配置.1. 添加一个用户库如CrystalReports Libraries,把下面的*.jar添加进去commons-collections-3.1.jar,commons-configuration-1.2.jar,commons-lang-2.1.jar,commons-logging.jar,Concurrent.jar,CrystalCharting.jarCrystalCommon.jarCrystalContentModels.jarCrystalDatabaseConnectors.jarCrystalExporters.jarCrystalExportingBase.jarCrystalFormulas.jarCrystalQueryEngine.jarCrystalReportEngine.jarCrystalReportingCommon.jarderby.jaricu4j.jarjrcadapter.jarjrcerom.jarkeycodeDecoder.jarlog4j.jarMetafileRenderer.jarmsbase.jarmssqlserver.jarmsutil.jarrasapp.jarrascore.jarReportPrinter.jarrpoifs.jarserialization.jarURIUtil.jarwebreporting.jarwebreporting-jsf.jarxercesImpl.jarxml-apis.jarXtreme.jar(总共36个jar,里面有一些在其他的库已经有的了,在项目中添加这个自定义库就行了)2. 把上个例子中的crystalreportviewers文件夹放在WEB-INF文件夹同一目录下。
这个就是你能看到水晶报表的基本框架,相当于.net里面的水晶报表控件了的源代码了。
3. 把crystal-tags-reportviewer.tld放在WEB-INF下,主要标签4. web.xml 在<web-app>中间添加,主要是读入crystalreportviewers<context-param><param-name>crystal_image_uri</param-name><param-value>crystalreportviewers</param-value></context-param><context-param><param-name>crystal_image_use_relative</param-name><param-value>webapp</param-value></context-param>5. 把CRConfig.xml放在src文件夹下,水晶报表的配置文件,如果你有注册,注册码也会在这文件里面CRConfig.xml<?xml version="1.0" encoding="UTF-8"?><CrystalReportEngine-configuration><reportlocation>../..</reportlocation><timeout>0</timeout><ExternalFunctionLibraryClassNames><classname/></ExternalFunctionLibraryClassNames></CrystalReportEngine-configuration>配置超时间隔利用CRConfig.xml 文件,您可以配置确定何时丢弃不活动报表源的超时间隔(以分钟为单位)。
这是必要的,因为不活动报表源仍然会消耗系统资源(如数据库连接、服务器内存以及临时文件使用的磁盘空间)。
可以通过在CRConfig.xml 文件中设置timeout 标记的值来指定超时间隔。
默认情况下,超时间隔为10 分钟。
通过将该值设置为0,可以将Java Reporting Component 配置为没有超时。
超时间隔仅适用于不活动报表-- 正在处理的报表不会因超出此值而超时。
每次成功完成一个报表源请求时,超时定时器将会重置。
如果在超时间隔内没有使用某个报表源,则会丢弃该报表源,并将其资源提供给其他进程使用。
6. 在jsp页面插入这段代码<%@ taglib uri="/crystal-tags-reportviewer.tld" prefix="crviewer" %><crviewer:viewer reportSourceType="reportingComponent" viewerName="rcname-viewer" reportSourceVar="rcname" isOwnPage="true"><crviewer:report reportName="rcname.rpt" /></crviewer:viewer>感觉像在用.net里面的水晶报表控件一样,不只viewer,连partviewer也可以的.在(一)中的配置保持不变,前一篇是用crviewer标签来实现jsp显示水晶报表的这篇文章教你如何自己写代码来享受水晶报表的report_source.jsp<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><%//Crystal Java Reporting Component (JRC) imports.%><%-- jrcerom.jar--%><%@page import="com.crystaldecisions.reports.sdk.*" %><%-- rascore.jar--%><%@page import="com.crystaldecisions.sdk.occa.report.lib.*" %><%//水晶报表的位置final String REPORT_NAME = "view_report.rpt";%><%try ...{//打开报表ReportClientDocument reportClientDoc = new ReportClientDocument();reportClientDoc.open(REPORT_NAME, 0);//把报表源放进session,传递到报表显示页面session.setAttribute("reportSource", reportClientDoc.getReportSource());//转到报表显示页面response.sendRedirect("CrystalReportViewer.jsp");}catch(ReportSDKException ex) ...{out.println(ex);}catch(Exception ex) ...{out.println(ex);}%>上面的可以封装到javabean里面reportClientDoc.getDatabaseController().logon(USERNAME, PASSWORD);设置数据库的登陆用户,如果浏览这个报表的用户需要设置不同的权限的话,那就需要设置上面这个了CrystalReportViewer.jsp<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><%//Crystal Report Viewer imports.%><%-- webreporting.jar--%><%@page import="com.crystaldecisions.report.web.viewer.*"%><%-- rascore.jar--%><%@page import="com.crystaldecisions.reports.sdk.*" %><%//建立一个viewer对象实例,并设置CrystalReportViewer viewer = new CrystalReportViewer();viewer.setOwnPage(true);viewer.setOwnForm(true);viewer.setPrintMode(CrPrintMode.ACTIVEX);//从session中取报表源Object reportSource = session.getAttribute("reportSource");viewer.setReportSource(reportSource);//显示水晶报表viewer.processHttpRequest(request, response,this. getServletConfig().getServletContext(), null);%>第二种方法直接用一个页面CrystalReportViewer.jsp<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><%//Crystal Java Reporting Component (JRC) imports.%><%-- jrcerom.jar--%><%@page import="com.crystaldecisions.reports.sdk.*" %><%-- rascore.jar--%><%@page import="com.crystaldecisions.sdk.occa.report.lib.*" %><%-- webreporting.jar--%><%@page import="com.crystaldecisions.report.web.viewer.*"%><%//水晶报表的位置final String REPORT_NAME = "view_report.rpt";%><%try ......{//打开报表ReportClientDocument reportClientDoc = new ReportClientDocument();reportClientDoc.open(REPORT_NAME, 0);//把报表源放进session,传递到报表显示页面//session.setAttribute("reportSource", reportClientDoc.getReportSource());//建立一个viewer对象实例,并设置CrystalReportViewer viewer = new CrystalReportViewer();viewer.setOwnPage(true);viewer.setOwnForm(true);viewer.setPrintMode(CrPrintMode.ACTIVEX);//从session中取报表源//Object reportSource = session.getAttribute("reportSource");//viewer.setReportSource(reportSource);viewer.setReportSource(reportClientDoc.getReportSource());//显示水晶报表viewer.processHttpRequest(request, response,this. getServletConfig().getServletContext(), null);//转到报表显示页面//response.sendRedirect("CrystalReportViewer.jsp");}catch(ReportSDKException ex) ......{out.println(ex);}catch(Exception ex) ......{out.println(ex);}%>个人感觉第一种方法好,报表源跟显示分开,安全,重用方便在.net中,你可以很容易的用sql语句过滤报表数据,但在CR4E中没这样的功能设定,但可以通过编写代码完成。