2010-04-27 42 views
1

我想创造出可以像使用的组件:如何实现绘制图表的自定义JSF组件?

<mc:chart data="#{bean.data}" width="200" height="300" /> 

其中#{bean.data}返回某些对象或图表模型对象或者别的什么东西可以表示为一个图表的集合(把它简单,让我们假定它返回一个整数集合)。

我想这个组件生成HTML这样的:

<img src="someimg123.png" width="200" height="300"/> 

的问题是,我有一个可以接收数据并返回图像,像一些方法:

public RenderedImage getChartImage (Collection<Integer> data) { ... } 

我也有一个零件用于绘制动态图像

<o:dynamicImage width="200" height="300" data="#{bean.readyChartImage}/> 

这个组件生成HTML就像我的需要,但它的参数是一个字节或RenderedImage的,即它需要方法bean像这样的数组:

public RenderedImage getReadyChartImage() { ... } 

所以,一个方法是使用上提交设置数据propertyChangedListenerCollection<Integer>)绘制图表,然后使用<o:dynamicImage />组件。但是我想创建一个接收数据并绘制图表的我自己的组件。

我使用的是小面,但它的确不是那么重要。任何想法如何创建所需的组件?

P.S.我考虑的一个解决方案是不使用<o:dynamicImage/>并使用一些servlet来流式传输图像。但我不知道如何正确地实现这一点,如何才能将JSF组件与servlet和如何保存已建成图表图像等等(每个请求会导致恕我直言性能问题产生新的相同的图像)..

回答

1

PS我在考虑的一个解决方案是不使用和使用一些servlet来流式传输图像。但我不知道如何正确实现,以及如何将jsf组件与servlet联系起来,以及如何保存已经建好的图表图像(为每个请求生成新的相同图像都可能导致性能问题,恕我直言),等等......

只要给它一个URL作为属性,使其最终为<img src="url">,让该URL指向的servlet。让servlet根据请求参数或URL中的pathinfo提供的信息生成/返回映像。

至于高速缓存,只是存储在某个地方的磁盘文件系统或通过一些独特的标识符DB,让每个请求检查该servlet,如果它是存在的,相应的处理。

这一切的标准<h:graphicImage>就已经足够了。只需使URL动态。

+0

我能够做只是因为我想一个自定义组件(我缺乏关于JSF的自定义组件的一些知识,但我今天得到了它)。但是,您的建议仍然非常有帮助,我将在明天使用它来完成另一项任务。 – Roman 2010-04-28 22:30:19

+0

不客气。 – BalusC 2010-04-28 22:35:06