有一个需求: 项目是BS的结构,想用JFreeChart来生成图表,图片显示的数据是从数据库里实时读取的,

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

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

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


我想问的问题是
1.这个流程对不对.
2.如果是bs结构应用我把生成的图片存在内存中的话,我怎么样控制生成图片的流的创建和关闭呢
在什么时候创建,什么时候关闭呢.
3.两种方法哪个更好一些.或者还有更好的方法..
评论
voff12 2007-03-19
楼上的肯定不是最优解,一个小小的东东,就要弄个server来支持,更大的浪费!!
roger 2007-03-19
没必要复杂化,就直接用第2种,如果性能有问题,单独弄个server做图片server
voff12 2007-03-19
能不能再具体一点?如果每次请求都生成一次,那就太浪费资源了,速度也会下降。可不可做个触发器,数据更新后,马上就生成图片,然后存下来。如果没有数据更新,就调用原因的图片?
gumpgz 2007-03-19
采用第一种做法,并使用listener来清除服务器上的图片。
这是最通用的做法。
chengren 2007-03-16
我就是在回答你的问题啊。因为你的这种2种打算都有漏洞啊。
1.生成文件的方法,产生的文件怎么维护呢?
2.至于动态流的方法则是对服务器资源的严重浪费。。。

当然如果你的工作必须要求你在这两种方法中选择的话,那么推荐的选择方法就是,你业务的重复性是否比较高呢?如果比较高的话,就采用生成文件的方式,尽量重用生成的图片,如果没有重用图片可能性的情况,你也就剩下动态流的输出了。
jfy3d 2007-03-16
java虫 写道



我用这个方法自己做过实验,生成速度还可以。就是用jfreechart生成的图片字体不太清晰感觉。


自体不清晰可以看看这个
http://www.blogjava.net/jfy3d/archive/2005/12/06/22804.html
jfy3d 2007-03-16
如果动态生成图片(方法2)
<img src="../image/jfree.jpeg">
实际是写servlet路径
<img src="../showimg.do">
showimg.do里生成图片然后response出来
java虫 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生成的图片字体不太清晰感觉。
ASDF1982 2007-03-16
jfy3d 写道
你本行不是作B/S方面的吧 描述的象socket
IE 下载完图片 这个请求就完成了

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


似乎明白点,不过这样一来的话 因为图片是在内存里的
那么在页面上这样写<img src="../image/jfree.jpeg">的话浏揽器又怎么访问这个路径呢
ASDF1982 2007-03-16
谢谢楼上的提醒,不过现在我问的问题能否帮助解答下
chengren 2007-03-16
如果你是在浏览器中展现图表的话,除非特定要求,否则尽量避免使用JFreeChart这种解决方案,性能和表现力都会成为你的很大的障碍。
flash,Javascript,vml应该都可以考虑。
giscat 2007-03-16
用第一种就可以了
jfy3d 2007-03-16
你本行不是作B/S方面的吧 描述的象socket
IE 下载完图片 这个请求就完成了

不需要你还关闭什么阿,你能写代码提前或推后关闭?
ASDF1982 2007-03-16
关键是BS结构 怎么知道什么时候关闭呢 我如果提前关闭了
那浏缆器还没加载怎么办?
jfy3d 2007-03-16
第一种适合可共享的图表,实时要求不是非常非常高的,很好的减少压力

第二种适合个例的,每个用户看到或查询都是不一样的。
第二种out完了应该就关闭了
ASDF1982
搜索本博客
存档
最新评论
评论排行榜