报表工厂类创建一个报表实例,用request参数来确定报表类型。这种方法巧妙的把商业逻辑通过一个方法(method)装入单独报表。在ReportFactory子集中,工厂方法对于复合报表来说是一个最好的解决办法-ReportFactory能够代表子集创建一个报表。
|
package com.ensemsys.twb.presentation.crystal; import com.crystaldecisions.sdk.occa.report.data.Fields; import com.crystaldecisions.sdk.occa.report.data.ParameterField; import com.crystaldecisions.sdk.occa.report.data.ParameterFieldDiscreteValue; import com.crystaldecisions.sdk.occa.report.data.Values; import javax.servlet.ServletRequest; import javax.servlet.jsp.JspException; import java.sql.Date; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; /** * Provides methods for creating an instance of a Report * from the parameters in the request. */ public class ReportFactory { public static final DateFormat FORMAT = new SimpleDateFormat( "yyyy.MM.dd" ); public static Report newInstance( ServletRequest request )throws JspException { String reportType = getParameter( request, ReportParameter.TYPE ); Report report = null; // For brevity, only the simple report type is shown here if ( reportType.equals( ReportType.BANKED_TIME_SIMPLE ) ) { report = newSimpleBankedTimeReport( request ); }else { throw new InvalidReportTypeException( reportType ); } return report; } |
图四:ReportFactory.java 基于form提交的参数创建一个实例
|
private static Report newSimpleBankedTimeReport( ServletRequest request ) throws JspException { Date startDate = getDateParameter( request, ReportParameter.START_DATE ); Date endDate = getDateParameter( request, ReportParameter.END_DATE ); Fields fields = new Fields(); ParameterField prevYearField = newDateField( "Prev Fiscal Year", startDate); ParameterField reportDateField = newDateField( "Report Date", endDate ); fields.add( prevYearField ); fields.add( reportDateField ); return new Report( "protected/reports/bhr_simple_demo.rpt", ReportType.BANKED_TIME_SIMPLE, fields ); } public static ParameterField newDateField( String name, Date date ) { ParameterField field = new ParameterField(); Values vals = new Values(); ParameterFieldDiscreteValue value = new ParameterFieldDiscreteValue(); field.setName( name ); value.setValue( date ); field.setReportName( "" ); value.setDescription( "" ); vals.add( value ); field.setCurrentValues( vals ); return field; } public static Date newDate( String s ) throws InvalidDateStringException { java.sql.Date date = null; try{ date = new java.sql.Date( FORMAT.parse( s ).getTime() ); } catch ( ParseException e ) { throw new InvalidDateStringException( e ); } return date; } protected static void assertHasParameter( ServletRequest request, String name) { String parameter = request.getParameter( name ); if ( parameter == null || parameter.equals( "" ) ) { throw new NoSuchParameterException( name ); } } |
图四:ReportFactory.java
|
protected static Date getDateParameter( ServletRequest request, String name ) throws JspException { String parameter = getParameter( request, name ); Date date = null; try{ date = newDate( parameter ); } catch ( InvalidDateStringException e ) { throw new JspException( e ); } return date; } protected static String getParameter( ServletRequest request, String name ) { assertHasParameter( request, name ); return request.getParameter( name ); } } |
图四:ReportFactory.java
SimpleReportViewerTag.java 呈现报表,这个类使用水晶报表的API来完成画出报表的工作。这个类非常简单――它创建一个CrystalReportViewer实例,设置数据库连接信息和报表需要的参数,最后显示报表。对应的TLD,simplereportviewer.tld,在图六列出。
|
package com.ensemsys.twb.presentation.crystal; import com.crystaldecisions.report.web.viewer.CrystalReportViewer; import com.crystaldecisions.reports.reportengineinterface.JPEReportSourceFactory; import com.crystaldecisions.sdk.occa.report.data.ConnectionInfo; import com.crystaldecisions.sdk.occa.report.data.ConnectionInfos; import com.crystaldecisions.sdk.occa.report.data.Fields; import com.crystaldecisions.sdk.occa.report.data.IConnectionInfo; import com.crystaldecisions.sdk.occa.report.lib.ReportSDKExceptionBase; import com.crystaldecisions.sdk.occa.report.reportsource.IReportSource; import com.crystaldecisions.sdk.occa.report.reportsource.IReportSourceFactory2; import com.ensemsys.twb.ApplicationProperties; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; import java.util.Locale; |
图五:SimpleReportViewerTag.java 被执行来显示一个报表。
|
/** * Displays a */ public class SimpleReportViewerTag extends TagSupport { private Report report; public Report getReport() { return report; } public void setReport( Report report ) { this.report = report; } public int doEndTag() throws JspException { CrystalReportViewer viewer = newViewer( report ); try{ IReportSourceFactory2 rptSrcFactory = new JPEReportSourceFactory(); IReportSource reportSource = (IReportSource) rptSrcFactory.createReportSource( report.getReportFileName(), getLocale() ); viewer.setReportSource( reportSource ); viewer.setDatabaseLogonInfos( newDBConnectionInfos() ); viewer.setEnableLogonPrompt( false ); Fields fields = report.getFields(); if ( fields != null ) { viewer.setParameterFields( fields ); viewer.setEnableParameterPrompt( false ); } viewer.processHttpRequest( (HttpServletRequest) pageContext.getRequest(), (HttpServletResponse) pageContext.getResponse(), pageContext.getServletConfig().getServletContext(), pageContext.getOut() ); } catch ( ReportSDKExceptionBase e ) { throw new JspException( e ); } finally { if ( viewer != null ) { viewer.dispose(); } } return EVAL_PAGE; } |
图五:SimpleReportViewerTag.java
|
private Locale getLocale() { // generally you want to change this method // to return the specific locale that your J2EE // application is using return pageContext.getRequest().getLocale(); } private static ConnectionInfos newDBConnectionInfos() { ConnectionInfos infos = new ConnectionInfos(); IConnectionInfo con = new ConnectionInfo(); con.setUserName( ApplicationProperties.getJDBCUser() ); con.setPassword( ApplicationProperties.getJDBCPassword() ); infos.add( con ); return infos; } private static CrystalReportViewer newViewer( Report report ) { CrystalReportViewer viewer = new CrystalReportViewer(); viewer.setName( report.getName() ); // set the viewer formatting and behaviour options //viewer.setSeparatePages( false ); //viewer.setBestFitPage( true ); // ... and so on return viewer; } } |
图五:SimpleReportViewerTag.java
|
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Crystal Viewer Tag Library</short-name> <description>Display a <tag> <name>viewer</name> <tagclass> com.ensemsys.twb.presentation.crystal.SimpleReportViewerTag </tag-class> <body-content>JSP</body-content> <attribute> <name>report</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> |
图六:simplereportviewer.tld
应为TWB仅仅允许管理者查看报表,TWB现有的接口控制系统控制对报表的访问。将来,TWB可以要求更精细的访问控制-例如,用户可以在有限的条件下查看特定项目的报表。在这个案例中,为了到达这种访问标准,我们使用水晶报表的安全特性。
进入讨论组讨论。相关专题
- 开发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次浏览)



