如何为绘制图表实现自定义JSF组件?

时间:2010-04-27 23:18:34

标签: java jsf servlets facelets custom-component

我想创建一个可以像:

一样使用的组件
<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 () { ... }

因此,一种方法是在提交时使用propertyChangedListener来设置绘制图表的数据(Collection<Integer>),然后使用<o:dynamicImage />组件。但我想创建自己的组件来接收数据并绘制图表。

我正在使用facelets,但确实不那么重要。有关如何创建所需组件的任何想法吗?

P.S。我正在考虑的一个解决方案是不使用<o:dynamicImage/>并使用一些servlet来流式传输图像。但我不知道如何正确实现它以及如何将jsf组件与servlet联系起来以及如何保存已经构建的图表图像(为每个请求生成新的相同图像可能会导致性能问题)等等。

1 个答案:

答案 0 :(得分:1)

  

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

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

关于缓存,只需将其存储在磁盘文件系统或DB中的某个唯一标识符中,并让每个请求上的servlet检查它是否存在并进行相应处理。

为此,所有标准<h:graphicImage>已足够。只需使URL动态化即可。