分类: Oracle
2008-04-23 17:35:12
该示例演示了如何在 servlet 容器中生成一个 JFreeChart。如前一个示例所示,JFreeChart 可以向 BufferedImage 显示任何图表。以下代码清单利用此功能并向 JFreeChart 生成的图像添加一个示例公司徽标。最终图像和 servlet 输出流被传递给 JFreeChart 的 ChartUtilities 类进行写操作。
清单 5:在 Java Servlet 中生成图表
/** * Processes requests for both HTTP |
清单 5 中的代码显示了 getHrJobData() 方法提供的数据。此处并未显示该方法的实现,但该方法只不过是一个从持久性源检索数据的方法。由于该代码在一个 servlet 容器中执行,因此应使用一个数据源利用该 servlet 容器的事务支持和该数据源的连接缓冲池。使用数据源还将以与供应商无关的方式提供到我们代码的数据库连接。
从 servlet 的 doGet 和 doPost 方法调用 processRequest 方法。servlet 希望传入图像类型、宽度、高度和质量。目前,servlet 支持用简单枚举类型表示的 PNG 或 JPEG 类型的图像。数据对象是表示我们希望绘制成图表的数据的 XML 对象。servlet 根据传入的图像类型设置正确的内容类型,然后调用 writeImage 创建图像并通过 HTTP 响应输出流发送。
清单 6: 自定义图表生成器
private void writeImage(ImageType imageType,HrJobsData data, OutputStream outputStream, int width, int height, float quality) { try { double[][] minWages = new double[1][data.getHrJob().size()]; double[][] maxWages = new double[1][data.getHrJob().size()]; String[] categories = new String[data.getHrJob().size()]; int index = 0; for (HrJob hrJob :data.getHrJob()) { minWages[0][index] = hrJob.getMinimumSalary(); maxWages[0][index] = hrJob.getMaximumSalary(); categories[index] = hrJob.getJobTitle(); index++; } DefaultIntervalCategoryDataset dataset = new DefaultIntervalCategoryDataset(minWages,maxWages); dataset.setCategoryKeys(categories); JFreeChart chart = ChartFactory.createBarChart("Job Salary Ranges", "Job Title", "Salary Range", dataset, PlotOrientation.HORIZONTAL, false, false, false); IntervalBarRenderer renderer = new IntervalBarRenderer(); ((CategoryPlot)chart.getPlot()).setRenderer(renderer); BufferedImage img = chart.createBufferedImage(width, height); BufferedImage logo = getLogo(); Graphics2D graphics2D = (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); } else if (imageType.equals(imageType.PNG)) { // PNG scales the quality from 0-9 int pngQuality = (int) (quality * 9); ChartUtilities.writeBufferedImageAsPNG( outputStream, img, true, pngQuality); } } catch (IOException ex) { // . . . exception handling goes here . . . } } |
我们要绘制成图表的数据表示各个职位的工资范围。具有 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,可以使用标准的 HTML img 标记。清单 7 显示了一个简单的 JSP 页面,该页面使用一个嵌入的 img 标记调用 servlet 并在 Web 页面中显示一个生成的图表。
清单 7: 调用 Servlet 以生成图表的 JSP
|
图 8 显示了调用该 servlet 返回一个 JFreeChart 图像的最终结果。
图8:PNG格式的Servlet构建的时间间隔条形图 |