facelet自定义标签的参数化

时间:2012-02-02 15:33:02

标签: jsf facelets

我创建了facelet模板:

左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标记,则它不起作用。

定制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自定义标记,我该如何对其进行参数化?

1 个答案:

答案 0 :(得分:4)

(请注意,left-right.xhtml中存在语法错误,您应该使用<ui:insert>代替<ui:include>,但我认为它只是粗心过度简化)

标记文件不能视为模板客户端。您需要根据具体的功能要求对其进行不同的处理。如果您使用的是JSF 2.x,那么composite component将是您最需要的。您可以将部件定义为<f:facet>,并在复合实现中按<cc:renderFacet>进行渲染。

E.g。

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

另见: