论坛首页 Java企业应用论坛

JFreeChart图表生成在内存中,在页面显示的问题

浏览 13858 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-16  
有一个需求: 项目是BS的结构,想用JFreeChart来生成图表,图片显示的数据是从数据库里实时读取的,

有两种打算:
          一种想法是用户请求的时候在服务器中生成图片并保存在服务器的一个文件夹里面.
        一种想法是在内存中生成图片用户请求完毕后关闭流.

首先想问一下在用户端显示图片是不是下面的流程:

   用户首先发出请求到服务器端,服务器端接受请求并生成HTML文档发送到客户端,之后浏揽器装载文件,遇到图片文件先在本地找,找不到的话根据url向服务器发送请求,服务器端有一个写图片的数据流把图片写到本地客户端的一个临时文件夹下,浏览器,这时候图片就显示了.


我想问的问题是
    1.这个流程对不对.
   2.如果是bs结构应用我把生成的图片存在内存中的话,我怎么样控制生成图片的流的创建和关闭呢
       在什么时候创建,什么时候关闭呢.
   3.两种方法哪个更好一些.或者还有更好的方法..
   发表时间:2007-03-16  
第一种适合可共享的图表,实时要求不是非常非常高的,很好的减少压力

第二种适合个例的,每个用户看到或查询都是不一样的。
第二种out完了应该就关闭了
0 请登录后投票
   发表时间:2007-03-16  
关键是BS结构 怎么知道什么时候关闭呢 我如果提前关闭了
那浏缆器还没加载怎么办?
0 请登录后投票
   发表时间:2007-03-16  
你本行不是作B/S方面的吧 描述的象socket
IE 下载完图片 这个请求就完成了

不需要你还关闭什么阿,你能写代码提前或推后关闭?
0 请登录后投票
   发表时间:2007-03-16  
用第一种就可以了
0 请登录后投票
   发表时间:2007-03-16  
如果你是在浏览器中展现图表的话,除非特定要求,否则尽量避免使用JFreeChart这种解决方案,性能和表现力都会成为你的很大的障碍。
flash,Javascript,vml应该都可以考虑。
0 请登录后投票
   发表时间:2007-03-16  
谢谢楼上的提醒,不过现在我问的问题能否帮助解答下
0 请登录后投票
   发表时间:2007-03-16  
jfy3d 写道
你本行不是作B/S方面的吧 描述的象socket
IE 下载完图片 这个请求就完成了

不需要你还关闭什么阿,你能写代码提前或推后关闭?


似乎明白点,不过这样一来的话 因为图片是在内存里的
那么在页面上这样写<img src="../image/jfree.jpeg">的话浏揽器又怎么访问这个路径呢
0 请登录后投票
   发表时间:2007-03-16  

采用工具类ChartUtil和DisplayChart(jfreechart的servlet)输出

将javabean里的生成图片的方法写的一个工具类ChartUtil里面。

1 .添加工具类ChartUtil
public class ChartUtil {
// 产生时间序列图,返回图片名称
public  static String generatePieChart(DefaultPieDataset dataset,String title,int width,int height,HttpSession session, PrintWriter pw) {    
  
String filename = null;    
 try {    
 if (session != null)    
 {    
ChartDeleter deleter = (ChartDeleter)session.getAttribute("JFreeChart_Deleter");    
 session.removeAttribute("JFreeChart_Deleter");    
 session.setAttribute("JFreeChart_Deleter", deleter);    
}    
JFreeChart chart = ChartFactory.createPieChart3D(    
title,  // chart title    
dataset, // data    
true,  // include legend    
true,    
false );    
//  Write the chart image to the temporary directory    
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());    
//If the last parameter is null, the chart is a "one time"-chart and will be deleted after the first serving.    
//If the last parameter is a session object, the chart remains until session time out.    
filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);    
//  Write the image map to the PrintWriter    
 ChartUtilities.writeImageMap(pw, filename, info,true);    
 pw.flush();    
} catch (Exception e) {    
 System.out.println("Exception - " + e.toString());    
 e.printStackTrace(System.out);    
 filename = "picture_error.png"; }    
return filename;    
}    
}   


2、在action里统计数据,设置好数据集dataset。传到页面

3、 在页面里取出
DefaultPieDataset piedataset=(DefaultPieDataset)request.getAttribute("piedataset"); 
String p = ChartUtil.generatePieChart(piedataset," 项目收支线图",500,300,null, new PrintWriter(out));    
String p1 = request.getContextPath() + "/servlet/DisplayChart?filename=" + p;


<td><img src="<%= p1 %>" width=500 height=300 border=0 usemap="#<%= p %>"></td>  


4、在web.xml中添加
<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>


我用这个方法自己做过实验,生成速度还可以。就是用jfreechart生成的图片字体不太清晰感觉。
0 请登录后投票
   发表时间:2007-03-16  
如果动态生成图片(方法2)
<img src="../image/jfree.jpeg">
实际是写servlet路径
<img src="../showimg.do">
showimg.do里生成图片然后response出来
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics