博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

关于jfreechart创建web报表图片的流程初解

Posted on 2008-04-01 11:18  袁立  阅读(149)  评论(0编辑  收藏  举报

注解:以下步骤最好能够结合jfreechart的源代码

查看了jfreechart组件的源代码后,发现该组件生成Web报表图片的流程大致分为以下两个步骤:

第一步: 图片文件的创建
 
 1.通过org.jfree.chart包下的ChartFactory工厂类提供的一些静态方法创建一个JFreeChart类型的对象。
 2.通过org.jfree.chart.servlet包下的ServletUtilities类提供的一些静态保存方法保存生成的图片并返回图片的名字。

 下面讲解一下第二步的过程:

 注解:ServletUtilities类的saveChartAsJPEG()方法做了如下操作:

 a.通过调用ServletUtilities类的createTempDir()临时目录创建方法,确保当前应用程序运行环境(如Web服务器)的临时目录(temp)是否存在,若不 

 存在,则创建它。

 b.确定图片文件的前缀部分,若session为空,则标记为即时文件(即访问到该图片后立刻删掉该图片文件),否则标记为临时文件(即等 

 到用户会话失效后才删除生成的临时图片文件)。
 
 注:String prefix = ServletUtilities.tempFilePrefix;//临时文件
            if (session == null) {
               prefix = ServletUtilities.tempOneTimeFilePrefix;//即时文件
            }

 c.创建一个空图片文件对象:
 File tempFile = File.createTempFile(prefix, ".jpeg",new File(System.getProperty("java.io.tmpdir")));

 d.通过调用org.jfree.chart包下的ChartUtilities类的保存方法将组件画出的图片对象写入刚才生成的空图片文件中:
 ChartUtilities.saveChartAsJPEG(tempFile, chart, width, height, info);
 
 e.如果session不为空,则将该文件注册到org.jfree.chart.servlet包下的ChartDeleter类的集合中,这个类实现了   

 HttpSessionBindingListener监听接口,等到用户会话session失效时,系统将删除所有的临时图片文件,但不知为何
 没有看到效果???????????????
 
 f.返回生成图片文件名称(return tempFile.getName())。


第二步:图片文件的读取
 
 注解:该组件专门提供了一个访问图片的Servlet,它在org.jfree.chart.servlet包里,名为DisplayChart。
 
 1.必须在Web程序的web.xml中配置这个servlet。具体配置如下:

 <servlet>
      <servlet-name>DisplayChart</servlet-name>
      <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
   </servlet>

 <servlet-mapping>
      <servlet-name>DisplayChart</servlet-name>
      <url-pattern>/servlet/DisplayChart</url-pattern>
   </servlet-mapping>

 其中<servlet-name>和<url-pattern>可以自定义,而<servlet-class>取决于它在你那个组件的位置。

 2.在图片业务逻辑类部分定义图片访问路径,并将其保存到作用域。

 a.String fileUrl = (DisplayChart servlet)配置的 url-pattern + "?filename = " + 第一步返回的图片名字;       
 b.request.setAttribute("fileUrl", fileUrl);

 3.在图片显示页面操作如下:
 <img src="${requestScope.fileUrl}"/>或者<img src="<%=request.getParameter("fileUrl")%>"/>