频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

J2ee应用程序结合水晶报表:例程研究

来源:csdn 作者:纸上谈兵 出处:巧巧读书 2007-09-06 进入讨论组
上一页 1 2 
访问 http://www.qqread.com/j2ee/w329842.html

报表工厂类创建一个报表实例,用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 Crystal report.

*/

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 Crystal Report with paramters</description>

<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可以要求更精细的访问控制-例如,用户可以在有限的条件下查看特定项目的报表。在这个案例中,为了到达这种访问标准,我们使用水晶报表的安全特性。

进入讨论组讨论。
上一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章