频道直达:新闻 - 组网 - 安全 - 服务器 - 存储 - 系统 - 应用 - 开发 - 数据库 - 前沿 - 技术人 - 培训 - 求职 - 读书 - 教程 - 专题 - 产品 - 案例 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

使用JFreeChart显示您的Oracle数据库数据(6)

作者: Dustin Marx/Michael G. Martin 出处:Oracle 2007-10-10 13:14    砖    好    评论   进入论坛
阅读提示:本文讲解如何使用JFreeChart轻松绘制Oracle数据库数据图表,并可以选择多种高质量的图表类型。在本文中,我们将使用Oracle数据库10g快捷版(XE)中的HR模式数据提供一个该过程的示例。

示例 4:在 Java Servlet 中生成图表

该示例演示了如何在 servlet 容器中生成一个 JFreeChart。如前一个示例所示,JFreeChart 可以向 BufferedImage 显示任何图表。以下代码清单利用此功能并向 JFreeChart 生成的图像添加一个示例公司徽标。最终图像和 servlet 输出流被传递给 JFreeChart 的 ChartUtilities 类进行写操作。

清单 5:在 Java Servlet 中生成图表

/**
* Processes requests for both HTTP GET and POST methods.
* @param request servlet request
* @throws javax.servlet.ServletException
* @throws java.io.IOException
* @param response servlet response
      */
protected void processRequest(HttpServletRequest request, 
     HttpServletResponse response)
throws ServletException, IOException {
        
ImageType imageType = ImageType.valueOf(request.getParameter("type"));
int imageWidth = Integer.valueOf(request.getParameter("width"));
int imageHeight = Integer.valueOf(request.getParameter("height"));
float imageQuality = Float.valueOf(request.getParameter("quality"));
        
if (imageType.equals(ImageType.PNG)) {
response.setContentType("image/png");
} else if (imageType.equals(ImageType.JPEG)) {
response.setContentType("image/jpg");
}
        
HrJobsData data = 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: 自定义图表生成器

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

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title Salary Ranges</title>
</head>
<body>
<h1 style="text-align:center">Job Salary Ranges</h1>
<img src="<%=request.getContextPath()%>/GetChart?type=PNG&width=800&height=400&quality=.9">
  </img>
</body>
</html>

图 8 显示了调用该 servlet 返回一个 JFreeChart 图像的最终结果。

图8:PNG格式的Servlet构建的时间间隔条形图


共13页: 上一页 [1] [2] [3] [4] [5] 6 [7] [8] [9] [10] [11] [12] [13] 下一页
【内容导航】
 第 1 页:JFreeChart 简介  第 2 页:下载并“安装”JFreeChart
 第 3 页:示例1:使用饼形图直接绘制 HR 模式数据图表  第 4 页:示例2:使用三维饼形图间接绘制HR模式数据图表
 第 5 页:示例3:在Swing中生成条形图  第 6 页:示例4:在Java Servlet中生成图表
 第 7 页:示例5:使用Cewolf在JSP中生成图表  第 8 页:示例6:使用Apache Batik在SVG中生成图表
 第 9 页:示例7:使用iText在PDF中显示图表  第 10 页:示例8:自定义小图
 第 11 页:示例9:使用XML为JFreeChart提供输入数据  第 12 页:示例9的清单程序
 第 13 页:其他JFreeChart特性
专题
Sun以10亿美元并购开源数据库厂商MySQL
甲骨文Oracle 11g正式发布
Oracle数据库开发之PL/SQL基础应用
Oracle较真SAP-商业管理软件之战一触即发
Oracle数据库开发基础教程
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·SQL Server入门到精通 (查看120205次)
·SQL Server 2008/2005全解 (查看100798次)
·Oracle数据库开发指南 (查看48189次)
·MySQL数据库备份 (查看46621次)
·Oracle SQL 内置函数大全 (查看44460次)
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。