将facelet标记转换为复合组件

时间:2016-08-06 15:45:00

标签: jsf primefaces facelets

前一段时间,基于@BalusC答案中的一个(真的不知道其中哪一个)我写了一个facelet标签,它是一种按钮生成器,它生成一个可变数量的按钮并排放置每一个都有一些参数通过属性传递。

现在我想将facelet标记转换为复合组件(因为在后者上,我有cc:interface标记,它向其他想要使用自定义组件的开发人员提供信息)。

在重写过程中,我必须处理动态生成按钮的动作属性。在 facelet标记方法中,我不必将它们声明为方法,因此我可以将它们的名称作为简单字符串传递,并将它们作为简单字符串处理在facelet标记内并调用操作方法。在复合组件方法中,我似乎必须将方法名称作为实际方法名称传递(通过使用cc:attribute的method-signature属性)。问题是:因为我以前不知道按钮的数量(它会生成按钮),我无法在cc:interface部分声明动作方法。

我的工作facelet标签的简化版本是:

<c:set var="idValues" value="#{fn:split(ids,',')}" />
<c:set var="actionValues" value="#{fn:split(actions,',')}" />
<c:set var="numberOfButtons" value="#{fn:length(idValues)}" />

<h:panelGrid id="#{id}" columns="#{numberOfButtons}">
    <c:forEach begin="0" end="#{numberOfButtons-1}" varStatus="i">
        <p:commandButton id="#{idValues[i.index]}"
                         action="#{bean[actionValues[i.index]]}" />
    </c:forEach>
</h:panelGrid>

并且facelet标签可以像这样使用:

<my:button id="idButton" 
           ids="btnSave,btnCancel"
           actions="onSave,onCancel"
           bean="#{myBean}" />

[编辑]

由@BalusC在答案中消化,在taglib.xml文件中添加如下代码足以让Eclipse自动完成工作正常:

<tag>
    <tag-name>button</tag-name>
    <source>tags/bottons.xhtml</source>
    <attribute><name>id</name></attribute>
    <attribute><name>ids</name></attribute>
    <attribute><name>actions</name></attribute>
    <attribute><name>bean</name></attribute>
</tag>

0 个答案:

没有答案