为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

jfreechart数据库连接

2012-01-18 41页 doc 403KB 18阅读

用户头像

is_200960

暂无简介

举报
jfreechart数据库连接使用JFreeChart显示您的Oracle数据库数据作者:DustinMarx和MichaelG.Martin使用JFreeChart可以轻松绘制Oracle数据库数据图表,并可以选择多种高质量的图表类型。2007年9月发布借助图表、数字和图形可更快速地了解和分析大型数据集。俗话说“百闻不如一见”,因为图片可以传达有关难以从文本数据本身获得的数据的重要概述和比较信息。JFreeChart是一个基于Java的开源(免费)库,利用它可以轻松创建多种类型的以数据为中心的高质量图表。这个功能强大的库提供了一个...
jfreechart数据库连接
使用JFreeChart显示您的Oracle数据库数据作者:DustinMarx和MichaelG.Martin使用JFreeChart可以轻松绘制Oracle数据库数据图表,并可以选择多种高质量的图表类型。2007年9月发布借助图表、数字和图形可更快速地了解和分析大型数据集。俗话说“百闻不如一见”,因为图片可以传达有关难以从文本数据本身获得的数据的重要概述和比较信息。JFreeChart是一个基于Java的开源(免费)库,利用它可以轻松创建多种类型的以数据为中心的高质量图表。这个功能强大的库提供了一个非常方便的API,使不熟悉JFreeChart的开发人员可以快速创建表示其数据的高质量图表。在本文中,我们将使用Oracle数据库10g快捷版(XE)中的HR模式数据提供一个该过程的示例。JFreeChart简介JFreeChart项目的启动可追溯到2000年。这个库的最新版本1.0.6版于2007年6月发布,本文使用的就是该版本。JFreeChart支持生成多种不同类型的图表,包括从饼形图、条形图、面积图、直线图、柱状图以及Gantt图表等常见类型到Candlestick、Wind以及WaferMap图表等较专业、不太常用的类型。确定JFreeChart支持的现成图表类型的最快的一种是检查JFreeChart的ChartFactory类的JavadocAPI文档。在一些开发环境中,可以使用JFreeChart有效地生成面向数据的图表,这些环境包括:·生成的文件为可移植网络图形(PNG)或JPEG格式·基于JavaSESwing的应用程序,包括小程序·JavaEEservlet和JavaServer页面(JSP)·与iText集成创建PDF·与Batik集成创建SVG格式要绘制成图表的数据本文的图表中要以图形方式表示的数据来自于Oracle数据库快捷版提供的HR模式。图1显示了Oracle数据库快捷版附带的SQL*Plus编辑器中显示的HR模式中的表。图1:SQL命令行工具中显示的HR模式表Oracle数据库快捷版还提供了一个非常有用、易于使用的基于Web的管理工具,该工具是在OracleApplicationExpress上构建的。图2演示了该工具,并且再次显示了HR模式中的某些对象(在本示例中为表)。图2:OracleApplicationExpress中的HR模式表Oracle数据库快捷版为开发人员提供了很多优势,而且自身与JFreeChart兼容。Oracle免费提供Oracle数据库快捷版用于开发和生产。除了免费的优点之外,一个占用空间较小、易于安装和管理以及非常有用的集成Web管理工具,也是该数据库产品的其他优势之一。其缺点主要影响大型企业用户,因为缺陷涉及存储空间、内存大小以及比传统Oracle数据库产品小的特性集。对于开发和构建原型,甚至对于小型生产数据库,Oracle数据库快捷版都非常适合。对于预算有限的企业或项目来说尤为如此。图3中的快照再次显示了这个基于Web的管理工具,该工具显示了Oracle数据库快捷版的某些最重要的限制。Oracle数据库快捷版中一个实例的存储空间被限制为5GB(包括系统表空间),因此目前为止使用的710MB在该工具的屏幕截图中被描述为大约是该限制的14%。内存使用被限制为1GB,因此该实例的314MBRAM使用情况也是据此描述的。以SYSTEM身份登录到该管理工具可以在管理屏幕上显示更具体的存储和内存信息。图3中的屏幕截图还显示了该工具提供的用于管理数据库的所有子菜单选项。图3:Oracle数据库快捷版工具和使用情况监视介绍了Oracle数据库快捷版和作为本文图表生成的数据源的HR模式之后,我们现在回过头来继续介绍JFreeChart本身。下载并“安装”JFreeChartJFreeChart可从www.jfree.org/jfreechart/下载。单个下载文件包含几个用于JFreeChart的JAR文件。将下载的文件解压缩到所选目录下后,任何使用JFreeChart的应用程序的类路径至少需要指向jfreechart-1.0.5.jar和jcommon-1.0.9.jar文件。可以通过将这些JAR文件添加到您喜欢的IDE的项目中来处理此问。为了在IDE的外部构建和运行,JavaSE6允许在类路径中使用通配符指定JAR,因此JFreeChart库目录中的JAR都可以包括在类路径中的一个*.jar表达式中。除了解压缩分发文件并将您的应用程序的类路径指向相应的JFreeChartJAR文件之外,不需要任何重要的安装工作。为示例代码相关性配置OracleJDeveloper图4显示了构建和运行本文中的大多数代码示例所需的相关JAR文件。列出了前面提到的两个JFreeChartJAR,以及iText(用于生成PDF)、Batik(用于生成SVG)和OracleJDBC(用于对Oracle数据库进行Java访问)的JAR。即使您没使用JDeveloper,图4还是会在一个单独的位置显示您将需要置于类路径中以构建和运行本文中讨论的大多数工具的相关性。图4:要添加到JDeveloper项目(或类路径中的其他位置)的JAR生成JFreeChartJavadocAPI文档JFreeChart压缩的分发文件还包括一个build.xml文件,该文件对于生成基于JFreeChartJavadoc的文档尤为有用。要生成JFreeChart文档,请在提供的Antbuild.xml文件上运行“javadoc”目标(在“ant”子目录中运行“antjavadoc”)。假定您已经安装了Ant,该将在JFreeChart文件的解压缩目录中生成一个“javadoc”子目录,并将生成的Javadoc文件放在该目录中。JFreeChartWeb站点也在线提供JFreeChart的Javadoc文档。简要介绍JFreeChart的主要类和接口JFreeChart附带了许多程序包、类和接口,但您只需了解其中很少一部分就可以开始使用JFreeChart。本节简要介绍一些主要的类和接口,它们是使用JFreeChart的基础并将在本文的示例中使用。JFreeChart类JFreeChart库中最重要的类之一是它本身,名为JFreeChart。该类提供一种Java二维图表的表示。利用该类上的方法,开发人员可以控制生成的图表的各个方面,并可以创建表示图表的抽象窗口工具包(AWT)BufferedImage。您只需非常少的额外工作即可直接使用JFreeChart创建几种简单的图表类型,但JFreeChart却可以提供对代表(如允许对所生成的图表进行更多控制的Plot)的访问。ChartFactory类ChartFactory类用于创建不同类型的图表。该类的每种静态方法都根据其生成的图表类型命名,无论调用何种类型的图表,每种方法都返回一个通用的JFreeChart类实例。扫描该类的Javadoc文档可以加深了解,也是确定JFreeChart提供的现成的基本图表类型的最简单方法之一。ChartUtilities类与ChartFactory类相似,ChartUtilities类也具有大量静态方法。该类提供的大多数方法都可以将图表转换为一种图像格式或基本的HTML图像映射。数据集接口和实现类检查ChartFactory图表创建方法表明这些方法中的每一种都接受某种类型的数据集扩展的接口(注意类名称中的数据集)作为参数。针对数据集接口生成的Javadoc文档显示了它是由几个子接口扩展的,由更多具体类实现的。用于各种类型图表的数据集子接口通常是显而易见的,因为图表类型的名称通常出现在接口名称中。例如,PieDataset用于饼形图,XYDataset用于许多x,y类型图表。CategoryDataset用于直线图和面积图,其他扩展数据集接口的子接口用于其他图表类型。数据集子接口是为要在图表中表示的ChartFactory类提供数据的。创建适当数据集子接口的具体实现,对其进行填充并传递到ChartFactory的xiangycreate***Chart方法,其中***是相关的图表类型。不要将JFreeChart提供的数据集接口与JDBC4提供的数据集接口混淆。JFreeChart提供的数据集接口无需从数据库填充,也不必以任何方式与数据库相关。相反,JFreeChart数据集接口及其子接口是为使用数据填充JFreeChart图表而的。在运行中了解JFreeChart:示例本文的其余部分主要用于阐释某些JFreeChart特性以及JFreeChart是多么容易上手。本文通过一系列代码示例以及所生成图表的快照来阐释JFreeChart的可用性及特性。介绍每个示例时,还会介绍与每个具体示例有关的方面以及其他常用的JFreeChart概念。示例1:使用饼形图直接绘制HR模式数据图表本文的大多数示例都涉及到使用JFreeChart根据Oracle数据库快捷版提供的HR模式中存储的数据创建图表。由于我们要绘制数据库中存储的数据的图表,因此面向JDBC的数据集类尤为便利。这第一个示例显示了如何使用饼形图绘制每个部门的员工数量的图表。清单1演示了根据数据库中存储的数据创建图表是多么容易。databaseAccess.getOracleDbConnection()方法(未在此处显示)是一个简单方法,它提供了一个Oracle数据库连接(返回一个java.sql.Connection)。清单1:使用JFreeChart的JDBCPieDataset创建一个饼形图/***Createpiechartrepresentingpercentageofemployeesineachdepartment*thathasatleastoneemployee.**@returnPiechart;nullifnoimagecreated.*/publicJFreeChartcreateNumberEmpsPerDeptPieChart(){JFreeChartpieChart=null;finalStringQUERY_NUMBER_EMPLOYEES_PER_DEPARTMENT="SELECTdepartments.department_name,count(*)ASnum_employees"+"FROMdepartments,employees"+"WHEREemployees.department_id=departments.department_id"+"GROUPBYdepartments.department_name";finalStringTITLE_EMPS_PER_DEPT=“EmployeesPerDepartment”;try{PieDatasetpieDataset=newJDBCPieDataset(databaseAccess.getOracleDbConnection(),QUERY_NUMBER_EMPLOYEES_PER_DEPARTMENT);pieChart=ChartFactory.createPieChart(TITLE_EMPS_PER_DEPT,//charttitlepieDataset,true,//legenddisplayedtrue,//tooltipsdisplayedfalse);//noURLs}catch(SQLExceptionsqlEx)//checkedexception{System.err.println("ErrortryingtoacquireJDBCPieDataset.");System.err.println("ErrorCode:"+sqlEx.getErrorCode());System.err.println("SQLSTATE:"+sqlEx.getSQLState());sqlEx.printStackTrace();}returnpieChart;}如清单1所示,从数据库生成一个饼形图只需要两条重要的Java代码语句。创建相应的数据集,然后将其传递给ChartFactory的createPieChart方法,该方法返回包含所生成的饼形图的JFreeChart。构造一个JDBCPieDataset,并传递一个数据库连接和一个数据库SQL查询字符串。由于该具体类实现PieDataset接口,因此我们可以通过接口将其传递给createPieChart方法。该代码清单中SQLException的catch块是必需的,因为JDBCPieDataset构造器抛出检查到的SQLException异常。以JFreeChart类的实例形式创建了一个图表之后,我们可以对该图表进行一些操作。对创建的图表可以做的最简单的操作之一是将其作为图像文件写入文件系统。清单2中的代码阐释了如何使用ChartUtilities将新创建的JFreeChart作为一个PNG格式的图像写入文件系统。清单2:将图表写入PNG文件/***Write.pngfilebasedonprovidedJFreeChart.**@paramaChartJFreeChart.*@paramaFileNameNameoffiletowhichJFreeChartwillbewritten..*@paramaWidthWidthofimage.*@paramaHeightHeightofimage.*/publicvoidwritePngBasedOnChart(JFreeChartaChart,StringaFileName,intaWidth,intaHeight){try{ChartUtilities.writeChartAsPNG(newFileOutputStream(aFileName),aChart,aWidth,aHeight);}catch(IOExceptionioEx){System.err.println("ErrorwritingPNGfile"+aFileName);}}该代码清单只有一条重要的Java代码语句,用于将JFreeChart图表将作为PNG文件写出。这条语句调用ChartUtilities.writeChartAsPNG方法,向其传递清单1中新创建的JFreeChart图表,以及指明要将该图像写入到的文件的名称以及图像的长度和宽度的字符串。注意,这个通用方法可以接受任何JFreeChart图表,因此可用于所有图表类型。在本示例中,我们构造了一个饼形图(如图5所示)。从该图表可以很快看出绝大多数员工在Shipping或Sales部门工作。图5:根据DB查询创建的PNG格式饼形图如果不算用于处理异常、获得一个数据库连接以及返回类的“基础架构”代码行,直接从数据库创建图5中的图表只需三条重要的Java代码语句。这三条语句对应于使用JFreeChart从数据库生成基本图表通常所需的三个步骤:·用一个有效的数据库连接和相应的数据库SQL查询字符串创建相应的面向JDBC的数据集的实例。·将上一步骤中的面向JDBC的数据集传递给所需图表类型对应的ChartFactory.create***Chart方法。·以适当的格式显示新创建的JFreeChart(第一个示例中的PNG文件)。本文的其余部分将介绍其他显示生成的图表的方法以及其他类型图表的示例。示例2:使用三维饼形图间接绘制HR模式数据图表在第一个示例中,通过使用面向JDBC的数据集直接检索的数据集构造了一个饼形图。  特定的实现是使用提供的数据库连接和SQL查询语句构造的。然而,有时可能无法使用或者不希望使用面向JDBC的数据集。例如,JFreeChart仅为PieDataset、CategoryDataset和XYDataset子接口提供面向JDBC的数据集实现。可能还存在这样的情况:很难以适合JFreeChart的格式从数据库中提取数据,必须先在Java代码中进行一些数据操作。最后,可能不希望图表生成与数据库查询紧密耦合。无论上述哪种情况,都可改用非面向JDBC的数据集。清单3演示了如何针对三维饼形图实现该操作。清单3:手动构造数据集并生成JPG图表JFreeChartpieChart3D=null;finalDefaultPieDatasetpieDataset=newDefaultPieDataset();/*QueryusedbygetNumberEmployeesByLocation()method:SELECTlocations.city,count(*)ASnum_employeesFROMdepartments,employees,locationsWHEREemployees.department_id=departments.department_idANDdepartments.location_id=locations.location_idGROUPBYlocations.city*/Map<String,Integer>empsAtEachLocation=databaseAccess.getNumberEmployeesByLocation();for(Map.EntrynumEmpsAtLoc:empsAtEachLocation.entrySet()){pieDataset.setValue(numEmpsAtLoc.getKey().toString(),Integer.parseInt(numEmpsAtLoc.getValue().toString()));}pieChart3D=ChartFactory.createPieChart3D(TITLE_EMPS_PER_LOC,pieDataset,true,true,false);finalStringfileName="EmpsPerLocPieChart3D.jpg";try{ChartUtilities.writeChartAsJPEG(newFileOutputStream(fileName),aChart,aWidth,aHeight);}catch(IOExceptionioEx){System.err.println("ErrorwritingJPGfile"+fileName);}清单3中的代码比第一个实例中所需的代码略微冗长一些,因为它没有利用针对饼形图的JDBC数据集,而是将Map条目从其数据库存取器(databaseAccess.getNumberEmployeesByLocation)复制到一个被传递给createPieChart3D方法的DefaultPieDataset中。尽管这段代码比第一个实例所需的代码长,但它的优点是无需处理SQLException,而且与数据库查询的的直接耦合程度也没那么高。该示例还生成一个JPEG(.jpg)文件,而非第一个实例中生成的图像之类的PNG(.png)文件。这两个文件都是图像文件格式,这两个示例都显示了将一个图表写出到任何一种图像格式是多么容易。图6中显示了作为运行清单3中的代码的结果创建的实际JPEG图像。图6:从数据库创建的JPEG格式的三维饼形图这种数据图形表示打动您的一点就在于大多数员工在南圣弗朗西斯科、牛津或西雅图工作。由于使用面向JDBC的数据集无需从Java集合或结果集转换为JFreeChart所需的数据集格式,因此在可能的情况下,我们将在本文的其余部分都使用该方法以保持简单。然而如前所述,存在这样的情况:由于数据库访问与图表生成之间的强耦合,该方法无法实现或者不是所需要的。同样,尽管使用面向JDBC的数据集时需要捕获检查到的SQLException异常,但我们在本文后面的代码清单中将省略大多数异常处理代码。示例3:在Swing中生成条形图该示例演示如何使用JFreeChart生成条形图,还将介绍在Swing中显示JFreeChart生成的图表的想法。清单4显示了用于生成该图表以及在Swing中显示生成的图表的最重要的代码。清单4:从JavaSwing生成条形图/***CreateBarChartshowingsalaryofeachemployee.**@paramaOrientationHorizontalorVerticalorientationofbarchart.*@returnBarChart.*/publicJFreeChartcreateSalaryPerFinanceEmployeeBarChart(PlotOrientationaOrientation){JFreeChartbarChart=null;try{finalStringQUERY_SALARY_PER_FINANCE_EMPLOYEE="SELECTfirst_name||''||last_nameASName,salary"+"FROMemployees"+"WHEREdepartment_id=100";finalCategoryDatasetbarDataset=newJDBCCategoryDataset(databaseAccess.getOracleDbConnection(),QUERY_SALARY_PER_FINANCE_EMPLOYEE);barChart=ChartFactory.createBarChart(TITLE_SALARY_PER_FINANCE_EMP,//titleLABEL_EMPLOYEES_FINANCE,//x-axislabelLABEL_SALARIES,//y-axislabelbarDataset,aOrientation,true,//legenddisplayedtrue,//tooltipsdisplayedfalse);//noURLs}catch(SQLExceptionsqlEx){ //...exceptionhandlinggoeshere...}returnbarChart;} ...JFrameframe=newJFrame(aTitle);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JFreeChartbarChart=createSalaryPerFinanceEmployeeBarChart(PlotOrientation.VERTICAL);BufferedImageimage=barChart.createBufferedImage(750,450);JLabellabel=newJLabel();label.setIcon(newImageIcon(image));frame.getContentPane().add(label);frame.pack();frame.setVisible(true);该代码示例使用String常量取代硬编码的字符串,这些常量可以根据它们字母全部大写、单词之间用下划线分隔的命名规则得以轻松识别。前两个饼形图生成示例使用了一个PieDataset。这个条形图生成示例改用了一个CategoryDataset。与饼形图不同,方向也是条形图的一个问题,可以指定垂直或水平两个方向。该示例指定了一个垂直绘制方向。在代码清单的底部,示例代码演示了如何将图表作为一个可以作为图标轻松应用到JLabel的BufferedImage进行检索。图7显示了这个包含JFreeChart生成的条形图的简单的Swing图形用户界面(GUI)的快照图片。图7:在Swing应用程序中生成的条形图示例4:在JavaServlet中生成图表该示例演示了如何在servlet容器中生成一个JFreeChart。如前一个示例所示,JFreeChart可以向BufferedImage显示任何图表。以下代码清单利用此功能并向JFreeChart生成的图像添加一个示例公司徽标。最终图像和servlet输出流被传递给JFreeChart的ChartUtilities类进行写操作。清单5:在JavaServlet中生成图表/***ProcessesrequestsforbothHTTPGETandPOSTmethods.*@paramrequestservletrequest*@throwsjavax.servlet.ServletException*@throwsjava.io.IOException*@paramresponseservletresponse*/protectedvoidprocessRequest(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ ImageTypeimageType=ImageType.valueOf(request.getParameter("type"));intimageWidth=Integer.valueOf(request.getParameter("width"));intimageHeight=Integer.valueOf(request.getParameter("height"));floatimageQuality=Float.valueOf(request.getParameter("quality"));if(imageType.equals(ImageType.PNG)){response.setContentType("image/png");}elseif(imageType.equals(ImageType.JPEG)){response.setContentType("image/jpg");}HrJobsDatadata=getHrJobData();writeImage(imageType,data,response.getOutputStream(),imageWidth,imageHeight,quality);response.getOutputStream().close();}清单5中的代码显示了getHrJobData()方法提供的数据。此处并未显示该方法的实现,但该方法只不过是一个从持久性源检索数据的方法。由于该代码在一个servlet容器中执行,因此应使用一个数据源利用该servlet容器的事务支持和该数据源的连接缓冲池。使用数据源还将以与供应商无关的方式提供到我们代码的数据库连接。从servlet的doGet和doPost方法调用processRequest方法。servlet希望传入图像类型、宽度、高度和质量。目前,servlet支持用简单枚举类型表示的PNG或JPEG类型的图像。数据对象是表示我们希望绘制成图表的数据的XML对象。servlet根据传入的图像类型设置正确的内容类型,然后调用writeImage创建图像并通过HTTP响应输出流发送。清单6:自定义图表生成器privatevoidwriteImage(ImageTypeimageType,HrJobsDatadata,OutputStreamoutputStream,intwidth,intheight,floatquality){try{double[][]minWages=newdouble[1][data.getHrJob().size()];double[][]maxWages=newdouble[1][data.getHrJob().size()];String[]categories=newString[data.getHrJob().size()];intindex=0;for(HrJobhrJob:data.getHrJob()){minWages[0][index]=hrJob.getMinimumSalary();maxWages[0][index]=hrJob.getMaximumSalary();categories[index]=hrJob.getJobTitle();index++;}DefaultIntervalCategoryDatasetdataset=newDefaultIntervalCategoryDataset(minWages,maxWages);dataset.setCategoryKeys(categories);JFreeChartchart=ChartFactory.createBarChart("JobSalaryRanges", "JobTitle","SalaryRange", dataset,PlotOrientation.HORIZONTAL,false,false,false);IntervalBarRendererrenderer=newIntervalBarRenderer();((CategoryPlot)chart.getPlot()).setRenderer(renderer);BufferedImageimg=chart.createBufferedImage(width,height);BufferedImagelogo=getLogo();Graphics2Dgraphics2D=(Graphics2D)img.getGraphics();graphics2D.drawImage(logo,null,LOGO_OFFSET_X,LOGO_OFFSET_Y);graphics2D.dispose();if(imageType.equals(ImageType.JPEG)){ChartUtilities.writeBufferedImageAsJPEG(outputStream,quality,img);}elseif(imageType.equals(imageType.PNG)){//PNGscalesthequalityfrom0-9intpngQuality=(int)(quality*9);ChartUtilities.writeBufferedImageAsPNG(outputStream,img,true,pngQuality);}}catch(IOExceptionex){//...exceptionhandlinggoeshere...}}我们要绘制成图表的数据表示各个职位的工资范围。具有IntervalBarRenderer的JFreeChart条形图可以很好地反映这组数据。对传入的XML数据进行迭代,用最低工资、最高工资和职位填写三个数组。在生成的图表上调用createBufferedImage可以提供一个BufferedImage。getLogo调用返回包含在另一个BufferedImage中的我们的公司徽标。使用Java的二维图形功能,可以将公司徽标绘制在图表图像上,与原来的图表图像有一些小的偏移。quality参数允许对压缩水平进行精细控制。对于JPEG图像,质量范围为0.0到1.0。较低的值将产生较小的文件,但是会降低图像质量。对于PNG图像,质量范围为0到9。PNG是一个无损压缩格式,因此该质量适用于不会危及质量的数据的压缩水平。生成的PNG图像的质量与原来的图像质量相同。最后调用ChartUtilities.writeBufferedImageAsPNG或ChartUtilities.writeBufferedImageAsJPEG使得servlet可以很容易地将最终图像发回到浏览器。要调用servlet,可以使用的HTMLimg标记。清单7显示了一个简单的JSP页面,该页面使用一个嵌入的img标记调用servlet并在Web页面中显示一个生成的图表。清单7:调用Servlet以生成图表的JSP<html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>TitleSalaryRanges</title></head><body><h1style="text-align:center">JobSalaryRanges</h1><imgsrc="<%=request.getContextPath()%>/GetChart?type=PNG&width=800&height=400&quality=.9"></img></body></html>图8显示了调用该servlet返回一个JFreeChart图像的最终结果。 图8:PNG格式的Servlet构建的时间间隔条形图示例5:使用Cewolf在JSP中生成图表Cewolf(支持图表的Web对象框架)构建在JFreeChart上,使开发人员可以通过JSP自定义标记从JavaServer页面访问JFreeChart库。与JFreeChart一样,Cewolf也提供了一个简单的API。Cewolf可免费获得。在本示例中,我们使用Cewolf0.9.3。图9中的图像是使用JFreeChart和CewolfJSP标记生成的垂直条形图的屏幕截图。它在FirefoxWeb浏览器中显示,在OracleContainersforJ2EE10g上托管。该图像证明HR数据中表示的虚拟公司中的管理人员薪资很好。图9:使用CewolfJSP自定义标记在JSP中生成的堆积条形图使用Cewolf和JSP创建上图所示的图表很简单。下面是该JSP页面的代码:清单8:使用Cewolf标记生成图表的JSP页面<?xmlversion='1.0'encoding='windows-1252'?><jsp:rootxmlns:jsp="http://java.sun.com/JSP/Page"version="2.0"xmlns:cewolf="etc/cewolf.tld"><jsp:outputomit-xml-declaration="true"doctype-root-element="HTML"doctype-system="http://www.w3.org/TR/html4/loose.dtd"doctype-public="-//W3C//DTDHTML4.01Transitional//EN"<jsp:directive.pagecontentType="text/html;charset=windows-1252"<jsp:useBeanid="chartData"class="org.marx.hr.charting.HrDeptSalariesCategoryDataset"<scripttype="JavaScript"src="overlib.js"><!--overLIB(c)ErikBosrup--></script><html><head><metahttp-equiv="Content-Type"content="text/html;charset=windows-1252"<title>RenderJFreeChartinJSPwithCewolfJSPTagLibrary</title></head><body><cewolf:chartid="theChart"type="stackedverticalbar"title="SalariesForEachDepartment"xaxislabel="Departments"yaxislabel="Salaries"><cewolf:data><cewolf:producerid="chartData"</cewolf:data></cewolf:chart><cewolf:imgchartid="theChart"renderer="/cewolf"alt="SalariesperEmployeeAlongDepartmentLines"width="1200"height="800"</body></html></jsp:root>特定于Cewolf的部分代码包括<cewolf:chart>元素、<cewolf:img>元素开始标记和结束标记之间的代码行,指向Cewolf命名空间以定义这些元素的cewolf前缀的代码行,以及用于包括实际生成图表的Java类的jsp:useBean代码行。生成该示例所需的大多数工作都位于该JSP页面通过jsp:useBean代码行访问的Java类中。该Java类实现几个主要的Cewolf接口,从其produceDataset(Map)方法(实现Cewolf的DatasetProducer接口所需的方法)返回一个JFreeChart数据集子接口。produceDataset(Map)方法中的代码仅创建相应JFreeChart数据集接口的具体实现,与本文前述示例中完全相同。在本示例中,DefaultCategoryDataset被实例化,用数据进行填充,并从produceDataset(Map)返回,这是因为JSP页面需要可以实现提供的CategoryDataset接口以生成堆积垂直条形图的内容。Cewolf主页包括一个教程,该教程演示如何对web.xml文件进行修改以便在适当时候可以调用Cewolfservlet。该教程还解释如何实现DatasetProducer接口以便为JSP页面中的Cewolf自定义标记提供数据。示例6:使用ApacheBatik在SVG中生成图表无需任何专门的工作,JFreeChart即可提供现成的PNG和JPEG图像生成。由于图表实际上是由直线以及诸如矩形、圆形以及其他矢量形状组成的,因此SVG(可伸缩矢量图形)等基于矢量的格式似乎都非常适合图表。尽管JFreeChart并不直接提供SVG显示功能,但它可与Apache的BatikSVG工具包结合使用以形成其图表的SVG表示。BatikSVG工具包是一个基于Java的工具包,它用于操作SVG,免费提供。本示例中使用Batik1.7。分发中包括几个可执行的JAR文件。其中一个文件(batik.jar)是一个可执行的JAR,它运行一个名为Squiggle的SVG处理和查看工具(java–jarbatik.jar)。在本示例中,我们首先将在自己的Java代码中将Batik直接用作一个库,然后将使用可执行的JAR(batik.jar)运行Squiggle以查看生成的SVG文件。为了构建和运行本示例中与Batik有关的代码,必须在类路径(或者JDeveloper或其他IDE的项目)中包括六个JAR文件。图4显示了这六个JAR文件(六个以“Batik”开头的JAR文件)。在本示例中,生成的图表是一个显示发货员工资的三维条形图。这与前面的条形图示例(示例3)不同,因为它具有三维而非二维的外观,并被指定为一个水平条形图而非垂直条形图。以下两个代码清单分别显示了如何生成该图表以及如何以SVG格式写出。清单9:创建三维条形图/***Create3Dbarchartrepresentingsalariesofshippingclerks.**@paramaOrientationHorizontalorVerticalorientation.*@return3Dbarchart.*/publicJFreeChartcreateSalaryPerShippingClerkBarChart3D(PlotOrientationaOrientation){JFreeChartbarChart=null;try{finalStringQUERY_SALARY_PER_SHIPPING_CLERK="SELECTfirst_name||''||last_nameASname,salary"+"FROMemployees"+"WHEREjob_id='SH_CLERK'";finalCategoryDatasetbarDataset=newJDBCCategoryDataset(databaseAccess.getOracleDbConnection(),QUERY_SALARY_PER_SHIPPING_CLERK);barChart=ChartFactory.createBarChart3D(TITLE_COUNTRIES_PER_REGION,//titleLABEL_SHIPPING_CLERKS,LABEL_SALARIES,barDataset,aOrientation,true,//legenddisplayedtrue,//tooltipsdisplayedfalse);//noURLs}catch(SQLExceptionsqlEx){//exceptionhandlingcode...}returnbarChart;}上一个代码清单演示了创建三维条形图与创建二维条形图基本相同,只是ChartFactory类上调用的方法名不同。以下代码清单显示了如何将这个或任何其他生成的JFreeChart写出为SVG格式。清单10:以SVG格式显示JFreeChart生成的图表/***Write.svgfilebasedonprovidedJFreeChart.**@paramaChartCharttobewrittenoutasSVG.*@paramaFileNameNameoffile(withoutextension)toholdSVGXML.*@paramaWidthWidthofimage.*@paramaHeightHeightofimage.*/publicvoidwriteSvgBasedOnChart(JFreeChartaChart,StringaFileName,intaWidth,intaHeight){finalStringfileExtension=".svg";finalStringsvgNS=SVGDOMImplementation.SVG_NAMESPACE_URI;finalDOMImplementationdom=GenericDOMImplementation.getDOMImplementation();org.w3c.dom.Documentdocument=dom.createDocument(svgNS,"svg",null);SVGGraphics2DsvgGraphic=newSVGGraphics2D(document);aChart.draw(svgGraphic,newjava.awt.Rectangle(aWidth,aHeight));try{booleanuseCSS=true;//wewanttouseCSSstyleattributesOutputStreamoutputStream=newFileOutputStream(aFileName+fileExtension);Writeroutput=newOutputStreamWriter(outputStream,"UTF-8");svgGraphic.stream(output,useCSS);outputStream.flush();outputStream.close();}catch(IOExceptionioEx){System.err.println("ProblemencounteredtryingtowriteSVGfile:");ioEx.printStackTrace();}}将三维条形图传给上面的方法以便写出SVG时,会将该条形图写入到所提供的文件名。生成的SVG文件将只是一个扩展名为.svg的文本文件,包含符合SVG的XML内容。可以用任何文本编辑器查看该生成文件中的XML,但使用Batik、Inkscape或几乎是任何现代图形文件编辑器等工具查看SVG显示的图像,则更为有趣。实际上,可以在任何最新版本的FirefoxWeb浏览器中直接打开某个.svg文件来查看SVG,因为它附带了一个内置的SVG查看器。此处显示的图形是Batik的Squiggle显示生成的SVG文件的快照。图10:SVG格式的三维水平条形图(由BatikSquiggle显示)用SVG格式显示图表有几个好处,其中一个最明显的好处就是能够根据我们的需要放大图像且不会损失分辨率,这都多亏了SVG矢量图形的可伸缩性。其他好处包括使用Inkscape之类的工具或者甚至手动(如果需要的话)编辑生成的SVG来调整生成的图像也变得相对容易。示例7:使用iText在PDF中显示图表图表经常用于为管理人员、客户、股东和其他利益相关者提供的演示中。然而,通过Java应用程序或作为纯文本文件显示图表通常不适合这些类型的观众。将生成的图表添加到PDF中对于向不同的观众演示很有帮助。有几种Java到PDF的转换器适用于该目的。下面我们演示一个使用其中的一个Java到PDF库iText的简单示例。iTextJava到PDF库是免费提供的。我们的示例中使用的版本是itext-2.0.2,是一个相对较小的文件,易于下载。这个下载的编译JAR是一个可执行文件,可通过java–jaritext-2.0.2命令或单击Windows中的JAR运行。运行该JAR会弹出“iTextToolbox”人机界面(HMI),该界面可用于将文本或TIFF图像转换为PDF并提供其他实用工具功能。该示例没有使用这个HMI,而是将iText用作一个库并使用该库将JFreeChart生成的图表转换为PDF。下载iTextJAR后的第一个步骤是将它放在buil
/
本文档为【jfreechart数据库连接】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索