绪论
这篇文章,我们讨论j2ee应用程序结合水晶报表的经验,这个例子叫做“Task Workbench (TWB)”。这篇文章的目的是帮助大家评估在j2ee应用程序中使用水晶报表的优点和缺点。
TWB(www.taskworkbench.com)是提供工程和每日运作的实时信息的工作管理工具。它是一个web应用程序,jsp作为表示层,EJBs处理商业逻辑,CMP实体bean作为持久层映射到一个oracle数据库。
TWB帮助项目经理了解不同方法下项目花费时间和员工在每个项目上的消耗。当设计这个程序的时候,一个非常重要的需求就是提供给项目经理和项目管理人员一个高水平的项目成员和工程数据的视图。
最初,我们用jsp创建报表。但是这个方法被证实太耗费时间,特别是创建联合报表的时候。所以开始寻找一个java报表解决方案。我们的基本要求是这个方案能够快速配置,并且轻松生成和修改报表,还有要容易整合到j2ee程序中。
我们选择水晶报表因为它完全满足我们的需求。它是一个成熟的、同类产品中处于领导地位的的工具。这是一个重要的考虑,因为我们希望我们的报表方案可以随着TWB一起成长。
实现
水晶报表被整合进TWB中有两个关键目的:第一是实现花费最小代价增加新报表和维护现有报表。第二个目的是转换到更复杂报表方案时,可以通过简单配置实现。
Crystal Java Reporting Component 有一个jsp标签库,提供创建基本报表的简单方法。我们决定使用自己的自定义jsp标签库,来使用Crystal Java Reporting Component显示报表。这个方法允许我们定制报表外观和报表参数,这样可以保持设计简单容易。
在jsp上唯一并且必须的java代码是一个为了得到一个显示在页面上的报表的实例而去访问工厂class的java方法。图二是一个可以请求报表的简单的jsp例子。Form传递必需的参数到view_report.jsp(图三)。
|
<%@ page import="com.ensemsys.twb.presentation.crystal.ReportParameter, com.ensemsys.twb.presentation.crystal.ReportType"%> <html> <head> <title>Report Viewer</title> <link rel="stylesheet" href="style/main.css" type="text/css"/> </head> <body> <h1>Simple Banked Hours Report</h1> <p>Enter the date range for the report and click "Submit" to view the report.</p> <form method="post" action="view_report.jsp"> <input type="hidden" name="<%=ReportParameter.TYPE%>" value="<%=ReportType.BANKED_TIME_SIMPLE%>"/> <table> <tr> <td class="label">Start Date:</td> <td> <input type="text" name="<%=ReportParameter.START_DATE%>" value="2003.06.30"/> </td> </tr> <tr> <td class="label">End Date:</td> <td> <input type="text" name="<%=ReportParameter.END_DATE%>" value="2003.12.01"/> </td> </tr> <tr> <td> </td> <td style="text-align: right"> <input type="submit" name="submitBtn" value="Submit"/> </td> </tr> </table> </form> </body> </html> |
图二:simple_banked_time_report.jsp
|
<%@ page import="com.ensemsys.twb.presentation.crystal.ReportFactory, com.ensemsys.twb.presentation.crystal.Report"%> <%@ taglib uri="/simplereportviewer.tld" prefix="viewer" %> <html> <head> <title>Report</title> <link rel="stylesheet" href="style/main.css" type="text/css"/> </head> <body> <% // "CrystalEventTarget" is the report action name used by final String REPORT_NAME = "CrystalEventTarget"; String reportName = (String) session.getAttribute( REPORT_NAME ); // refresh might have done via a report action if ( reportName == null ) { reportName = (String) request.getParameter( REPORT_NAME ); } Report report = null; if ( reportName == null ) { report = ReportFactory.newInstance( request ); reportName = report.getName(); session.setAttribute( REPORT_NAME, reportName ); session.setAttribute( reportName, report ); } else { report = (Report) session.getAttribute( reportName ); } %> <viewer:viewer report="<%=report%>" /> </body> </html> |
图三:view_report.jsp
进入讨论组讨论。相关专题
- 开发J2EE应用时应该遵循的几个基本准则 (0次浏览)
- 提高J2EE层与数据库层交互操作能力优势 (0次浏览)
- 怎样部署基于WebSphere的J2EE应用 (0次浏览)
- 微软冲击移动平台市场J2ME何去何从 (0次浏览)
- 开发工具王者比拼 .NET单挑J2EE (0次浏览)
- 教您怎样部署基于WebSphere的J2EE应用 (0次浏览)
- 华山论剑 J2EE单挑.NET之框架组件篇 (0次浏览)
- 对J2EE项目实际应用的一点体会 (0次浏览)
- J2EE综合:介绍编写XML文档的工作经验 (0次浏览)
- J2ME手机游戏:获取RecordStore相关信息 (0次浏览)



