如何实现自定义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 () { ... }
因此,一种方法是在提交时使用 propertyChangedListener
来设置数据( Collection
) 绘制图表,然后使用
组件。但我想创建自己的组件来接收数据并绘制图表。
我正在使用facelets,但这确实不是那么重要。有什么想法如何创建所需的组件吗?
PS 我正在考虑的一个解决方案是不使用
并使用一些 servlet 来流图像。但我不知道如何正确实现这一点,以及如何将 jsf 组件与 servlet 结合起来,以及如何保存已经构建的图表图像(为每个请求生成新的相同图像可能会导致性能问题,恕我直言)等等。
I want to create a component which can be used like:
<mc:chart data="#{bean.data}" width="200" height="300" />
where #{bean.data}
returns a collection of some objects or chart model object or something else what can be represented as a chart (to put it simple, let's assume it returns a collection of integers).
I want this component to generate html like this:
<img src="someimg123.png" width="200" height="300"/>
The problem is that I have some method which can receive data and return image, like:
public RenderedImage getChartImage (Collection<Integer> data) { ... }
and I also have a component for drawing dynamic image:
<o:dynamicImage width="200" height="300" data="#{bean.readyChartImage}/>
This component generates html just as I need but it's parameter is array of bytes or RenderedImage i.e. it needs method in bean
like this:
public RenderedImage getReadyChartImage () { ... }
So, one approach is to use propertyChangedListener
on submit to set data (Collection<Integer>
) for drawing chart and then use <o:dynamicImage />
component. But I'd like to create my own component which receives data and draws chart.
I'm using facelets but it's not so important indeed. Any ideas how to create the desired component?
P.S. One solution I was thinking about is not to use <o:dynamicImage/>
and use some servlet to stream image. But I don't know how to implement that correctly and how to tie jsf component with servlet and how to save already built chart images (generating new same image for each request can cause performance problems imho) and so on..
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
但我不知道如何正确实现这一点,以及如何将 jsf 组件与 servlet 结合起来,以及如何保存已经构建的图表图像(为每个请求生成新的相同图像可能会导致性能问题 URL 作为属性,使其最终为
并让该 URL 指向 servlet。让servlet根据请求参数或URL中的pathinfo提供的信息生成/返回图像。
至于缓存,只需通过某个唯一标识符将其存储在磁盘文件系统或数据库中的某个位置,然后让 servlet 在每个请求上检查它是否存在并进行相应处理。
为此,所有标准
就已经足够了。只需将 URL 设为动态即可。Just give it an URL as attribute so that it ends up as
<img src="url">
and let that URL point to the servlet. Let the servlet generate/return the image based on the information provided by request parameters or pathinfo in the URL.As to the caching, just store it somewhere in the disk file system or a DB by some unique identifier and let the servlet on every request check if it is there and handle accordingly.
For this all the standard
<h:graphicImage>
would be already sufficient. Just make the URL dynamic.