我已经创建了facelet模板:

left-right.xhtml

<ui:composition>
    <ui:include name="left" />
    <hr />
    <ui:include name="right" />
</ui:composition>


之后,如果我将此模板与ui:decorate一起使用,则可以正常工作:

index.xhtml

<ui:decorate template="left-right.xhtml">
    <ui:define name="left">FOO</ui:define>
    <ui:define name="right">BAR</ui:define>
</ui:decorate>


但是,如果我将此模板用作自定义facelet标签,则无法使用。

custom-taglib.xml

<facelet-taglib>
    <tag>
        <tag-name>leftright</tag-name>
        <source>left-right.xhtml</source>
    </tag>
</facelet-taglib>


index.xhtml

<custom:leftright>
    <ui:define name="left">FOO</ui:define>
    <ui:define name="right">BAR</ui:define>
</custom:leftright>


ui:define标签内的内容未包含在模板中:(

因此,问题是,如果将Facelet模板呈现为facelet自定义标签,该如何对其参数化?

最佳答案

(请注意,您的left-right.xhtml中存在语法错误,应该使用<ui:insert>而不是<ui:include>,但我认为这只是粗心的过分简化)
标记文件不能视为模板客户端。您需要根据具体的功能要求采用不同的方法。如果您使用的是JSF 2.x,那么composite component将是您需要的最接近的。您可以将零件定义为<f:facet>,并在复合实现中通过<cc:renderFacet>进行渲染。
例如。
/resources/custom/leftRight.xhtml

<cc:interface>
    <cc:facet name="left" required="true" />
    <cc:facet name="right" required="true" />
</cc:interface>
<cc:implementation>
    <cc:renderFacet name="left" />
    <hr />
    <cc:renderFacet name="right" />
</cc:implementation>

用法:
<custom:leftRight>
    <f:facet name="left">FOO</f:facet>
    <f:facet name="right">FOO</f:facet>
</custom:leftRight>

但是,如果您仍在使用JSF 1.x,则无法创建复合组件。您需要坚持<ui:decorate>
也可以看看:

When to use <ui:include>, tag files, composite components and/or custom components?

关于jsf - Facelet自定义标签的参数化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9115047/

10-10 11:18