自定义JSF组件属性列表

时间:2009-05-08 16:59:59

标签: jsf attributes custom-controls

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

1 个答案:

答案 0 :(得分: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/>

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


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

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

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

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