我想创建一个可以像:
一样使用的组件<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联系起来以及如何保存已经构建的图表图像(为每个请求生成新的相同图像可能会导致性能问题)等等。
答案 0 :(得分:1)
P.S。我正在考虑的一个解决方案是不使用和使用一些servlet来流式传输图像。但我不知道如何正确实现它以及如何将jsf组件与servlet联系起来以及如何保存已经构建的图表图像(为每个请求生成新的相同图像可能会导致性能问题)等等。
只需给它一个URL作为属性,使其最终为<img src="url">
,并让该URL指向servlet。让servlet根据请求参数或URL中的pathinfo提供的信息生成/返回图像。
关于缓存,只需将其存储在磁盘文件系统或DB中的某个唯一标识符中,并让每个请求上的servlet检查它是否存在并进行相应处理。
为此,所有标准<h:graphicImage>
已足够。只需使URL动态化即可。