我正在编写一个自定义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将进行所有渲染,所以我只想弄清楚将属性列表传递给组件的自然方法是什么。

最佳答案

<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/>

这种设计具有局限性,因为它要求组件使用者定义固定数量的所包含图像。至少对于第一种设计,可以使用EL表达式将imageUrls和imageCaptions属性绑定(bind)到动态值。

考虑为您的组件定义一个model-一个可以用来迭代值的接口(interface)。例如,UIData(h:dataTable底层的组件类型)使用DataModel处理其内容-有关详细信息,请参见spec

这可能会导致标签设计如下:
<i:imageComponent width="480" height="320"
        value="#{backingBean.imageModel}" />

这种方法所需的 View 更少。

代替模型,考虑转发器设计(这将取决于用户/开发人员提供适当的绑定(bind)类型):
<i:imageComponent width="480" height="320"
        value="#{backingBean.someIterable}" var="img" >
    <i:image href="#{img.href}" caption="#{img.caption}"/>
<i:imageComponent/>

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

关于jsf - 定制JSF组件属性列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/840830/

10-11 22:25
查看更多