gpt4 book ai didi

jsf - facelet自定义标签的参数化

转载 作者:行者123 更新时间:2023-12-04 22:24:50 25 4
gpt4 key购买 nike

我已经创建了 facelet 模板:

左-右.xhtml

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

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

索引.xhtml

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

但是,如果我将此模板用作自定义 facelet 标记,则它不起作用。

自定义标签库.xml

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

索引.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> .

另见:

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

25 4 0