ireport
Jasperreport基本介绍
Jasperreport与ireport介绍
Jasperreport是报表打印工具,支持pdf、csv多种格式的报表打印。
JasperReport是一个开源的工具包,将JasperReport包加入到项目的classpath中即可开始使用JasperReport包了,从java程序中通过调用包中的类对jrxml文件进行操作,可以完成报表的编译、显示、输出等工作;
Jasperreport的报表生成过程,如下图。
如上图所示。报表模板有两种制作方式:
1)利用ireport图形编辑工具,iReport是报表编辑图形工具,编辑完成后输出jrxml文件(xml格式),生成jasper文件(以.jasper结尾);
2)直接利用java代码编译生成jasper文件(以.jasper结尾)。
最终要使用的是编译后的*.jasper文件。
Jasperreport支持多种数据源,包括xml、数据库、JavaBean等多种数据源。
Jasperreport基本类
l net.sf.jasperreports.engine.JasperCompileManager类。
使用这个类的几个静态方法即可完成对报表的编译工作(具体参见api文档)
编译完成后可以JasperCompileManager有两种处理方式:
1>返回一个JasperReport对象
2>在.jrxml文件所在的目录生成一个.jasper文件
这两种方式是由程序员自己选择的。不过我比较倾向使用.jasper文件,毕竟报表的结构不是每天都在改动,所以每次重新编译报表并不是很划算。
l net.sf.jasperreports.engine.JasperFillManager类
这个类的作用是用数据填充报表。它可以使用JasperReport对象也可以使用。jasper文件做为报表模板。
它同样有2中处理方式:
1>返回一个Jsaperprint对象。
2>在.jasper文件所在目录生成一个.jrprint文件
这个类使用net.sf.jasperreports.engine.JRdatasource接口的实现做为数据源。任何实现了JRDataSource的类均可做为数据源使用
在net.sf.jasperreports.engine.data包中定义了一些数据源,可根据自己的需要选择。这里我使用的是JRTableModelDataSource做为
l 3.net.sf.jasperreports.engine.JasperPrintManager和
net.sf.jasperreports.engine.JasperExportManager这两个类的作用是打印、导出报表他们使用JasperPrint和.jrprint文件做为输入。
Jasperreport实例演示
少说废话,下面我们就进行一些基本的演示。在下才疏学浅,在调查中只做了三种尝试:1)利用ireport进行模板设计,数据源采用xml文件;
2)利用ireport设计模板,导入jfreechat对象;
下面我们逐一进行讲解。OK,let’sgo!!!!
Ireport设计模板,xml数据源
1)安装ireport。
直接点击windows版本ireport安装文件,安装文件中已经包含了jasperreport组件,这里不做表述,有问题问百度!
2)打开ireport
Ireport3.7.4用户界面如图所示。
客官您瞧见,用户界面上的“Quickstart”没?按照图中表示的1、2、3去做,就基本能搞清楚ireport是什么道道!
3)添加数据源
点击标号①,界面如下:
哇塞,这么多数据源,看来真的是很好很强大耶。我们选择“xmlfiledatasource”,点击next,
按照上图填入数据源名称、以及数据源xml文件,注意一定要选择“UsethereportXpathexpressionwhenfillingthereport”.点击“save”即可,在下图标记处会出现相应的生成结果。
现在让我们先查看一下,刚刚添加xml数据源的具体结构:
数据源准备好了,可以开始模板创建了。
4)创建模板
在上图中点击“②”,出现下图。
点击“Launchreportwizard”,如下图:
输入报表名以及保存路径,点击“下一步”
在“Connections/Datasources”中选择你需要的数据源。接下来就直接点击“下一步”,直到完成。
点击完成后,进入模板元素设计页面。
图中,左边标记为页面监视器(reportinspector),右边为组件工具栏。若客官您在使用的过程中,不小心关闭了这些窗口,您可以在菜单栏“窗口”中找到,点击之后,该窗口就会出现了。
5)添加元素
在组件工具栏中选择组件,直接拖拽到模板中。
点击图中红色标记,进入如下图:
将图中标记的“Customers”拖拽到下方的标记处,此处的作用就是要将数据源中的数据字段添加要ireport中,以便下一步为刚刚建立的“field”元素指定,查询语句。如下图。
点击OK即可。
再右击Field元素,点击“EditExpression”,如图:
将Field括号内的改成您需要的字段如“CompanyName”。点击“APPly”
做到这一步,您可能觉得“应该该做了都做完了,可以进行预览了!”,其实我也这么想的,也这么做的,可是,预览报错,经过研究,我还是少做了一步,而这一步至关重要,就是我们没有选择xml文件中的数据list节点。
您必须要按照如上图所做,输入Query语句。
好了,这下我们就可以预览了。
6)预览报表
点击“preview”按钮就成,让我们看看效果吧:
呵呵,丑是丑了点,但是这是我们头一回用ireport,还是很有成就感的。
ireport设计模板,导入jfreechat对象
JasperReport在用数据填充报表时,根据图形报表的类型,生成对应的JFreeChart的dataset对象,再调用org.jfree.chart.ChartFactory产生出对应的org.jfree.chart.JFreeChart对象。获取到该对象后,JasperReport在exporter里建立一个java.awt.image.BufferedImage对象,
BufferedImage返回一个java.awt.Graphics2D对象,再将它传入给之前JFreeChart对象,最后调用JFreeChart对象的draw方法将图形输出到BufferedImage对象,供给Exporter使用。
在介绍导入jfreechat对象之前,我们现在讨论一个东西,这个东西很有用,叫scriptlet---脚本语言,听过吧,我们把生成jfreechat对象的java代码放在报表模板的脚本里,在编译模板时,连同脚本一起编译进去。
jasperReport也是支持scriptlet的哦,先分析一下JasperReport的API吧!在填充报表时scriplet是一个非常有力的工具,
JRAbstractScriptlet.java位于net.sf.jasperreports.engine包下是一个抽象类
beforeReportInit()
afterReportInit()
beforePageInit()
afterPageInit()
beforeColumnInit()
afterColumnInit()
beforeGroupInit(Stringgroujpame)
afterGroupInit(Stringgroujpame)
看看这些名字就知道你能完成那些功能,这几个方法是要求我们实现的,jasperReport给我们提供了一个实现类JRDefaultScriptlet.java,默认的空实现了上面几个方法,它只是很便利的为我们提供了所需的八个方法的空实现。我们写自己的scriptlet时需要继承JRDefaultScriptlet.java这个类实现自己的相应的功能即可。
好了,我们现在就来为模板添加scriptlet
1) 在模板中,选中整个模板,如图:
双击右边的属性窗口,将其中的内容设置为如图所示的内容:
将“scriptletclass”设为您即将要制作的java类,这里我的java类名叫scriplet.ScriptletDemo。
其内部代码如下:
packagescriplet;
importnet.sf.jasperreports.engine.JRDefaultScriptlet;
importnet.sf.jasperreports.engine.JRScriptletException;
importnet.sf.jasperreports.renderers.JFreeChartRenderer;
importorg.jfree.chart.ChartFactory;
importorg.jfree.chart.JFreeChart;
importorg.jfree.chart.plot.PiePlot;
importorg.jfree.chart.plot.PiePlot3D;
importorg.jfree.data.general.DefaultPieDataset;
publicclassScriptletDemoextendsJRDefaultScriptlet{
publicvoidafterColumnInit()throwsJRScriptletException{
System.out.println("**************************************afterColumnInit()**************************************");
}
@Override
publicvoidafterDetailEval()throwsJRScriptletException{
System.out.println("**************************************afterDetailEval()**************************************");
}
@Override
publicvoidafterGroupInit(Stringgroujpame)throwsJRScriptletException{
System.out.println("**************************************afterDetailEval()**************************************");
}
@Override
publicvoidafterPageInit()throwsJRScriptletException{
System.out.println("**************************************afterPageInit()**************************************");
}
@Override
publicvoidafterReportInit()throwsJRScriptletException{
System.out.println("**************************************afterReportInit()begin**************************************");
//createpiechartdataset
DefaultPieDatasetdateset=newDefaultPieDataset();
//setdatasetvalue
dateset.setValue("Chinese",108);
dateset.setValue("Math",110);
dateset.setValue("English",74);
dateset.setValue("ScienceDepartment",226);
/**//*
*createjfreeChartobject
*thefirstparameterispiecharttitle
*thesecendparameterisdatasetofpiechart
*thethreeparameterisbooleanvalue,createchartnote
*thefourparameterisbooleanvalue,it'satooltipofmovemouseon
*configurecharttogenerateURLs,It'sgetaPiePlot3Dobject
*
*/
JFreeChartfreeChart=ChartFactory.createPieChart3D("ReportPieChart",dateset,true,false,false);
PiePlotpieplot=(PiePlot)freeChart.getPlot();
pieplot.setNoDatamessage("Nodatatodisplay");
//setvariable"jfreeChart"value
this.setVariableValue("jfreechart",newJFreeChartRenderer(freeChart));
System.out.println("**************************************afterReportInit()end**************************************");
}
@Override
publicvoidbeforeColumnInit()throwsJRScriptletException{
System.out.println("**************************************beforeColumnInit()**************************************");
}
@Override
publicvoidbeforeDetailEval()throwsJRScriptletException{
System.out.println("**************************************beforeDetailEval()**************************************");
}
@Override
publicvoidbeforeGroupInit(Stringgroujpame)throwsJRScriptletException{
System.out.println("**************************************beforeGroupInit()**************************************");
}
@Override
publicvoidbeforePageInit()throwsJRScriptletException{
System.out.println("**************************************beforePageInit()**************************************");
}
@Override
publicvoidbeforeReportInit()throwsJRScriptletException{
System.out.println("**************************************beforeReportInit()**************************************");
}
publicStringshowInfor()throwsJRScriptletException{
return"theisscriptletscriptletscriptletthe,sscriptletreporttheisascriptletreportthisisascriptletreportthisisascriptletreport";
}
}
2)新建变量variable
如图在选中“Variable”,右击,点击“添加variable”
将新建的variable属性设置如下图所示:
其中variableclass设为“net.sf.jasperreports.engine.JRRenderable”,同志您可能要迷惑了,该选项的下拉菜单中没有该选项啊,是的,的确没有,但是你可以粘贴进去。
3)添加图像,直接将组件中的“image”对象拖拽进来,拖拽的时候,会有图片选择框,这个没有关系,你可以选择一个您喜欢的图片,也可以直接取消,只不过是一个标志,在模板中出现如下画面:
是不是很丑呢,嘿嘿,我也觉得丑。
好了,下面来设置图片的属性,这个才是关键的。属性如下图:
重要的是imageexpression以及expressionclass,分别设为“$V{jfreechart}”、“net.sf.jasperreports.engine.JRRenderable”
至此模板设置成功。
4) 代码测试
将上面设计好的模板保存为“E:/ireport/jfreechat.jrxml”
写一段java代码测试一下:
packagetest;
importjava.io.File;
importjava.io.fileinputstream;
importjava.io.InputStream;
importjava.util.HashMap;
importnet.sf.jasperreports.engine.JRemptyDataSource;
importnet.sf.jasperreports.engine.JasperCompileManager;
importnet.sf.jasperreports.engine.JasperFillManager;
importnet.sf.jasperreports.engine.JasperPrint;
importnet.sf.jasperreports.engine.JasperReport;
importnet.sf.jasperreports.engine.base.JRBaseVariable;
importnet.sf.jasperreports.view.JasperViewer;
publicclassJChartReportMain{
/**
*Methodname:main<BR>
*Description:main<BR>
*Remark:<BR>
*@paramargsvoid<BR>
*/
publicstaticvoidmain(String[]args){
Stringpath="
Filefile=newFile(path);
InputStreamin;
try{
HashMap<String,String>parameters=newHashMap<String,String>();
parameters.put("ReportTitle","LAOSHULIN");
in=newFileInputStream(file);
JasperReportjasperReport=JasperCompileManager.compileReport(in);
for(inti=0;i<jasperReport.getVariables().length;i++){
JRBaseVariablejb=(JRBaseVariable)jasperReport.getVariables()[i];
System.out.println(jb.getValueClassName()+jb.getName());
}
JasperPrintjasperPrint=JasperFillManager.fillReport(jasperReport,
parameters,newJREmptyDataSource());
JasperViewerviewer=newJasperViewer(jasperPrint);
viewer.setVisible(true);
}catch(Exceptione){
e.printstacktrace();
}
}
}
运行结果如图:
你看多棒啊,是不是觉得自己很牛叉啊!
java代码设计模板,数据源为对象数组。
用java实现模板设计,我们就直接粘贴代码,先要将jasperreport相关的jar包导入进来:
我的代码结构如图所示:
webappDataSource.java
/*
*JasperReports-FreeJavaReportingLibrary.
*Copyright(C)2001-2009JaspersoftCorporation.Allrightsreserved.
*http://www.jaspersoft.com
*
*UnlessyouhavepurchasedacommerciallicenseagreementfromJaspersoft,
*thefollowinglicensetermsapply:
*
*ThisprogramispartofJasperReports.
*
*JasperReportsisfreesoftware:youcanredistributeitand/ormodify
*itunderthetermsoftheGNULesserGeneralPublicLicenseaspublishedby
*theFreeSoftwareFoundation,eitherversion3oftheLicense,or
*(atyouroption)anylaterversion.
*
*JasperReportsisdistributedinthehopethatitwillbeuseful,
*butwithOUTANYWARRANTY;withouteventheimpliedwarrantyof
*MERCHANTAbilityorFITNESSFORAPARTICULARPURPOSE.Seethe
*GNULesserGeneralPublicLicenseformoredetails.
*
*YoushouldhavereceivedacopyoftheGNULesserGeneralPublicLicense
*alongwithJasperReports.Ifnot,see<http://www.gnu.org/licenses/>.
*/
packagedatasource;
importnet.sf.jasperreports.engine.JRDataSource;
importnet.sf.jasperreports.engine.JRException;
importnet.sf.jasperreports.engine.JRField;
/**
*@authorTeodorDanciu([email protected])
*@version$Id:WebappDataSource.java30312009-08-2711:14:57Zteodord$
*/
publicclassWebappDataSourceimplementsJRDataSource
{
/**
*
*/
privateObject[][]data=
{
{"Berne",newinteger(22),"Bill","250-20thAve."},
{"Berne",newInteger(9),"JamesSchneider","277SeventhAv."},
{"Boston",newInteger(32),"MichaelOtt","339CollegeAv."},
{"Boston",newInteger(23),"JuliaHeiniger","358CollegeAv."},
{"Chicago",newInteger(39),"MaryKarsen","202CollegeAv."},
{"Chicago",newInteger(35),"GeorgeKarsen","412CollegeAv."},
{"Chicago",newInteger(11),"JuliaWhite","412UplandPl."},
{"Dallas",newInteger(47),"JanetFuller","445UplandPl."},
{"Dallas",newInteger(43),"SusanneSmith","2UplandPl."},
{"Dallas",newInteger(40),"SusanneMiller","440-20thAve."},
{"Dallas",newInteger(36),"JohnSteel","276UplandPl."},
{"Dallas",newInteger(37),"MichaelClancy","19SeventhAv."},
{"Dallas",newInteger(19),"SusanneHeiniger","86-20thAve."},
{"Dallas",newInteger(10),"AnneFuller","135UplandPl."},
{"Dallas",newInteger(4),"SylviaRinger","365CollegeAv."},
{"Dallas",newInteger(0),"LauraSteel","429SeventhAv."},
{"Lyon",newInteger(38),"AndrewHeiniger","347CollegeAv."},
{"Lyon",newInteger(28),"SusanneWhite","74-20thAve."},
{"Lyon",newInteger(17),"LauraOtt","443SeventhAv."},
{"Lyon",newInteger(2),"AnneMiller","20UplandPl."},
{"NewYork",newInteger(46),"AndrewMay","172SeventhAv."},
{"NewYork",newInteger(44),"SylviaOtt","361CollegeAv."},
{"NewYork",newInteger(41),"BillKing","546CollegeAv."},
{"Oslo",newInteger(45),"JanetMay","396SeventhAv."},
{"Oslo",newInteger(42),"RobertOtt","503SeventhAv."},
{"Paris",newInteger(25),"SylviaSteel","269CollegeAv."},
{"Paris",newInteger(18),"SylviaFuller","158-20thAve."},
{"Paris",newInteger(5),"LauraMiller","294SeventhAv."},
{"SanFrancisco",newInteger(48),"RobertWhite","549SeventhAv."},
{"SanFrancisco",newInteger(7),"JamesPeterson","231UplandPl."}
};
privateintindex=-1;
/**
*
*/
publicWebappDataSource()
{
}
/**
*
*/
publicbooleannext()throwsJRException
{
index++;
return(index<data.length);
}
/**
*
*/
publicObjectgetFieldValue(JRFieldfield)throwsJRException
{
Objectvalue=null;
StringfieldName=field.getName();
if("city".equals(fieldName))
{
value=data[index][0];
}
elseif("ID".equals(fieldName))
{
value=data[index][1];
}
elseif("name".equals(fieldName))
{
value=data[index][2];
}
elseif("address".equals(fieldName))
{
value=data[index][3];
}
returnvalue;
}
}
next()实现了JRDataSource中的方法.判断是否还有下一个.
getFieldValue(JRFieldfield)实现了JRDataSource中的方法.field是对应报表中的要填充的字段的名称.
模板设计代码,java实现模板时,要贯彻一个思想就设计思路要与XML模板中组成结构一致,这也是我的心得体会之一。
StaticText.java
packagetest;
importjava.io.File;
importjava.util.HashMap;
importnet.sf.jasperreports.engine.JRAlignment;
importnet.sf.jasperreports.engine.JRElement;
importnet.sf.jasperreports.engine.JRException;
importnet.sf.jasperreports.engine.JasperCompileManager;
importnet.sf.jasperreports.engine.JasperFillManager;
importnet.sf.jasperreports.engine.JasperPrint;
importnet.sf.jasperreports.engine.JasperReport;
importnet.sf.jasperreports.engine.design.JRDesignBand;
importnet.sf.jasperreports.engine.design.JRDesignExpression;
importnet.sf.jasperreports.engine.design.JRDesignField;
importnet.sf.jasperreports.engine.design.JRDesignParameter;
importnet.sf.jasperreports.engine.design.JRDesignReportFont;
importnet.sf.jasperreports.engine.design.JRDesignStyle;
importnet.sf.jasperreports.engine.design.JRDesignTextField;
importnet.sf.jasperreports.engine.design.JasperDesign;
importnet.sf.jasperreports.engine.util.JRLoader;
importnet.sf.jasperreports.view.JasperDesignViewer;
importnet.sf.jasperreports.view.JasperViewer;
importdatasource.WebappDataSource;
publicclassStaticText{
JRDesignReportFontfont1=newJRDesignReportFont();
//TODOAuto-generatedmethodstub
/**
*Methodname:main<BR>
*Description:main<BR>
*Remark:<BR>
*@paramargsvoid<BR>
*/
publicstaticvoidmain(String[]args){
JRDesignReportFontfont1=newJRDesignReportFont();
font1.setFontSize(12);
try{
// JRDesignStaticTexttext1=ReportUtil.getStaticText(
// 110,0,400,22,null,JRTextElement.TEXT_ALIGN_CENTER,font1,"city");
// JRDesignStaticTexttext2=ReportUtil.getStaticText(
// 110,0,400,22,null,JRTextElement.TEXT_ALIGN_CENTER,font1,"name");
// JRDesignStaticTexttext3=ReportUtil.getStaticText(
// 110,0,400,22,null,JRTextElement.TEXT_ALIGN_CENTER,font1,"address");
JasperDesignjasperDesign=newJasperDesign();
jasperDesign.setName("NoXmlDesignReport");
jasperDesign.setPageWidth(595);
jasperDesign.setPageHeight(842);
jasperDesign.setColumnWidth(515);
jasperDesign.setColumnSpacing(0);
jasperDesign.setLeftMargin(40);
jasperDesign.setRightMargin(40);
jasperDesign.setTopMargin(50);
jasperDesign.setBottomMargin(50);
JRDesignStylenormalStyle=newJRDesignStyle();
normalStyle.setName("Arial_Normal");
normalStyle.setDefault(true);
normalStyle.setFontName("Arial");
normalStyle.setFontSize(12);
normalStyle.setPdfFontName("helvetica");
normalStyle.setPdfEncoding("Cp1252");
normalStyle.setPdfEmbedded(false);
jasperDesign.addStyle(normalStyle);
// JRDesignStyleboldStyle=newJRDesignStyle();
// boldStyle.setName("Arial_Bold");
// boldStyle.setFontName("Arial");
// boldStyle.setFontSize(12);
// boldStyle.setBold(true);
// boldStyle.setPdfFontName("Helvetica-Bold");
// boldStyle.setPdfEncoding("Cp1252");
// boldStyle.setPdfEmbedded(false);
// jasperDesign.addStyle(boldStyle);
//
// JRDesignStyleitalicStyle=newJRDesignStyle();
// italicStyle.setName("Arial_Italic");
// italicStyle.setFontName("Arial");
// italicStyle.setFontSize(12);
// italicStyle.setItalic(true);
// italicStyle.setPdfFontName("Helvetica-Oblique");
// italicStyle.setPdfEncoding("Cp1252");
// italicStyle.setPdfEmbedded(false);
// jasperDesign.addStyle(italicStyle);
JRDesignParameterparameter=newJRDesignParameter();
parameter.setName("ReportTitle");
parameter.setValueClass(java.lang.String.class);
jasperDesign.addParameter(parameter);
//Fields
JRDesignFieldfield=newJRDesignField();
field.setName("city");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field=newJRDesignField();
field.setName("ID");
field.setValueClass(java.lang.Integer.class);
jasperDesign.addField(field);
field=newJRDesignField();
field.setName("name");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field=newJRDesignField();
field.setName("address");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
JRDesignBandband=null;
JRDesignTextFieldtextField=null;
JRDesignExpressionexpression=null;
band=newJRDesignBand();
band.setHeight(20);
textField=newJRDesignTextField();
textField.setX(5);
textField.setY(4);
textField.setWidth(100);
textField.setHeight(15);
textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_RIGHT);
textField.setStyle(normalStyle);
expression=newJRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{city}");
textField.setExpression(expression);
band.addElement(textField);
textField=newJRDesignTextField();
textField.setStretchWithOverflow(true);
textField.setX(120);
textField.setY(4);
textField.setWidth(100);
textField.setHeight(15);
textField.setPositionType(JRElement.POSITION_TYPE_FLOAT);
textField.setStyle(normalStyle);
expression=newJRDesignExpression();
expression.setValueClass(java.lang.Integer.class);
expression.setText("$F{ID}");
textField.setExpression(expression);
band.addElement(textField);
textField=newJRDesignTextField();
textField.setStretchWithOverflow(true);
textField.setX(220);
textField.setY(4);
textField.setWidth(100);
textField.setHeight(15);
textField.setPositionType(JRElement.POSITION_TYPE_FLOAT);
textField.setStyle(normalStyle);
expression=newJRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{name}");
textField.setExpression(expression);
band.addElement(textField);
textField=newJRDesignTextField();
textField.setStretchWithOverflow(true);
textField.setX(400);
textField.setY(4);
textField.setWidth(100);
textField.setHeight(15);
textField.setPositionType(JRElement.POSITION_TYPE_FLOAT);
textField.setStyle(normalStyle);
expression=newJRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{address}");
textField.setExpression(expression);
band.addElement(textField);
jasperDesign.setDetail(band);
HashMap<String,String>titleParameters=newHashMap<String,String>();
titleParameters.put("ReportTitle","helloworld");
FilereportFile=newFile("E:/billin.jasper");
JasperCompileManager.compileReportToFile(jasperDesign,reportFile.getPath());
JasperReportjasperReport=(JasperReport)JRLoader.loadObject(reportFile.getPath());
JasperPrintjasperPrint=JasperFillManager.fillReport(jasperReport,titleParameters,newWebappDataSource());
System.out.println("--------"+jasperPrint.getName());
JasperViewerviewer=newJasperViewer(jasperPrint);
viewer.setTitle("");
viewer.setVisible(true);
// JasperDesignViewerviewer=newJasperDesignViewer(jasperReport);
// viewer.setVisible(true);
}catch(JRExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
下面就可以运行,查看报表结果:
关于jasperreport的sample
1)运行sample之前需要安装ant服务器
2)进入到某个sample目录中,输入ant,之后再输入antview
3)有些sample需要运行sample自带的数据,则在hsqldb目录中,输入antrunServer命令启动数据库,再到sample目录中,输入ant,之后再输入antview。
相关阅读
动态性网页页面的开发环境依据开发设计视频语音不一样而不一样,关键的方法取决于Python开发设计、JSP开发设计和ASP开发设计的
黑客技术一度被认为是一个神秘的特有领域,随着技术的进步和领域环境的进步,它已经成为一种非常普遍的现象。黑客技术可以用于有害目
空调清洁—挂壁式空调清洁的方法 1、 关闭空调电源,拔去插头,开窗保持室内空气流通。2、 打开空调表面面板,取下过滤网、空气净化
大多费尔公用模块都需要连接互联网,但有时可能因为网络问题而无法正常连接,这时可以尝试使用代理服务器。但首先您必需知道代理服务
PhoneGap是一个基于HTML和JavaScript的应用开发平台,使用它可以构建本地应用。你可以把PhoneGap看作一个正方形的web view contain