我已经创建了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/