3

我正在编写一个自定义 JSF 组件,它将为一组指定的图像呈现图像转换。组件要使用的图像列表将由组件的用户指定。

主要组件将进行渲染,生成的标记不是 html。

我只是在学习 JSF,我想知道是否有一个既定的模式可以将参数属性列表传递给自定义组件:

用户是否期望传递如下属性:
<i:imageComponent width="480" height="320" imageUrls="img1Url1, imgUrl2" imageCaptions="imageCaption1, imageCaptions2"/>

然后我可以使用转换器将这些属性转换为服务器列表,或者这会更自然吗?

<i:imageComponent width="480" height="320">
<i:image id="im1" href="url1" caption="caption1"/>
<i:image id="im2" href="url2" caption="caption2"/>
<i:imageComponent/>

在我的例子中,主要的 imageComponent 将进行所有渲染,所以我只想弄清楚将属性列表传递给组件的自然方式是什么。

4

1 回答 1

3
<i:imageComponent width="480" height="320" imageUrls="img1Url1, imgUrl2"
    imageCaptions="imageCaption1, imageCaptions2"/>

这种设计容易出错,因为它要求两个单独的列表保持同步。

<i:imageComponent width="480" height="320">
    <i:image id="im1" href="url1" caption="caption1"/>
    <i:image id="im2" href="url2" caption="caption2"/>
<i:imageComponent/>

这种设计是有限制的,因为它要求组件消费者定义固定数量的包含图像。至少在第一个设计中,imageUrlsimageCaptions属性可以使用 EL 表达式绑定到动态值。


考虑为您的组件定义一个模型- 一个可用于迭代值的接口。例如,UIData ( h:dataTable底层的组件类型)使用DataModel来处理其内容 - 请参阅规范了解详细信息。

这可能会导致这样的标签设计:

<i:imageComponent width="480" height="320"
        value="#{backingBean.imageModel}" />

这种方法需要更少的视图混乱。


代替模型,考虑中继器设计(这将依赖于用户/开发人员提供适当的绑定类型):

<i:imageComponent width="480" height="320"
        value="#{backingBean.someIterable}" var="img" >
    <i:image href="#{img.href}" caption="#{img.caption}"/>
<i:imageComponent/>

这种方法的优点是后端不需要任何特殊类型。

于 2009-05-08T19:44:05.550 回答