java - 如何创建具有动态属性的复合组件?

标签 java jsf jsf-2 composite-component

我有这个复合组件:

<cc:interface>
    <cc:attribute name="image_1" />
    <cc:attribute name="image_2" />
    <cc:attribute name="image_3" />
</cc:interface>

<cc:implementation>
    <div id="slider-container">
        <div id="slider-small">
            <h:graphicImage library="images" name="#{cc.attrs.image_1}" />
            <h:graphicImage library="images" name="#{cc.attrs.image_2}" />
            <h:graphicImage library="images" name="#{cc.attrs.image_3}" />
        </div>
    </div>
</cc:implementation>

我这样使用它:

<cs:small_slider 
    image_1="about/1.jpg"
    image_2="about/2.jpg"
    image_3="about/3.jpg"
/>

但仅限于三个属性。如果我必须使用相同的复合组件发送三个以上,我该怎么办,如下所示:

<cs:small_slider 
    image_1="about/1.jpg"
    image_2="about/2.jpg"
    image_3="about/3.jpg"
    image_4="about/4.jpg"
    image_5="about/5.jpg"
/>

我想这样做是为了重用该组件,并且我不想创建另一个组件。

更新: 遵循 @BalusC 方法呈现以下 HTML:

<!-- small slider --> 
<div id="slider-container"> 
    <div id="slider-small">
        <img src="/brainset/javax.faces.resource/1.jpg.xhtml?ln=images" />
        <img src="RES_NOT_FOUND" />
        <img src="RES_NOT_FOUND" /> 
    </div> 
    <div id="frame-slider-small"></div> 
</div><!-- end #slide-container --> 

它没有找到其他图像,只有第一个。我确信这些图像:“about/2.jpg”和“about/3.jpg”存在。

最佳答案

这是不可能的,而且也违反了DRY principle .

您最好的选择是将其作为 List<String> 传递相反,您可以使用 <ui:repeat> 对其进行迭代:

<cs:small_slider images="#{bean.images}" />

<cc:interface>
    <cc:attribute name="images" type="java.util.List" required="true" />
</cc:interface>

<cc:implementation>
    <div id="slider-container">
        <div id="slider-small">
            <ui:repeat value="#{cc.attrs.images}" var="image">
                <h:graphicImage library="images" name="#{image}" />
            </ui:repeat>
        </div>
    </div>
</cc:implementation>

或者将其定义为硬编码的逗号分隔字符串并使用 JSTL fn:split() 将它们分成 String[]您又将其输入 <ui:repeat> :

<cs:small_slider images="about/1.jpg,about/2.jpg,about/3.jpg" />

<cc:interface>
    <cc:attribute name="images" type="java.lang.String" required="true" />
</cc:interface>

<cc:implementation>
    <div id="slider-container">
        <div id="slider-small">
            <ui:repeat value="#{fn:split(cc.attrs.images, ',')}" var="image">
                <h:graphicImage library="images" name="#{image}" />
            </ui:repeat>
        </div>
    </div>
</cc:implementation>

与具体问题无关,尽量与 Java/JSF 命名约定保持一致。我会重命名你的small_slider.xhtmlrenameSlider.xhtml这样您就可以将其用作 <cs:smallSlider> ,这与所有普通的 JSF 组件非常一致。

关于java - 如何创建具有动态属性的复合组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6902600/

相关文章:

java - 带有常量变量的 For() 循环不打印任何输出

java - 无法将 JMenuItem 添加到 JPopupMenu 中的 JMenu

java - JAVA RMI 还在任何地方使用吗?

java定时器,如何实现timertask

jsf - 进行 jsf 表单验证的最佳方法

java - 处理 AFTER_FILTER_EVENT 类型的事件期间出现异常

javascript - 你可以使用<c :otherwise> with <c:if> or only with <c:when>?

jsf - 跳过所需的验证并调用应用程序

java - 如何同时使用导航规则和 f :ajax

jsf - @ViewScoped bean 在 JSF 中如何以及何时被销毁?