动态<ui:include>不起作用</ui:include>

时间:2011-04-21 14:40:53

标签: java spring jsf-2

我想使用动态ui:include,就像这样。

<ui:repeat value="#{FormsService.getTemplates(component.form)}"
                var="template">
    <ui:include src="forms/#{template.id}.xhtml"/>
</ui:repeat>

不知何故,这总是导致包含“forms / .xhtml”,好像#[template.id}将为空。 但我知道#{template.id}不是空的。即只是将它打印出来就能给我预期的价值。那么这里出了什么问题?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

这些标签有点令人困惑,因为&lt; ui:repeat&gt;实现为UIComponent和&lt; ui:include&gt;逻辑在TagHandler中。构建组件树时,例如在restoreView阶段,添加了一个UIRepeat组件,但#{template.id}将无法正确评估。它不会评估,因为UIRepeat变量“template”仅在组件处理期间可用,而不是在树构造期间可用。

你有两个选择。首先是你可以使用&lt; c:forEach&gt;而不是&lt; ui:repeat&gt;。这是一个简单的解决方案,可能适合您。它有一个小缺点:如果您有多个相同模板的出现,组件树将包含每个出现的模板组件的单独副本。因此,内存和CPU性能都会受到影响。

另一种选择是使用真正的动态包含组件。不幸的是我还没有找到一个。我设法实现了这样的组件,但它不是一个非常方便的解决方案,因为它还需要稍微修改的UIRepeat版本。我们不得不采用这种方法,因为&lt; c:forEach&gt;的性能损失。对我们来说太沉重了。