我的页面上有一个带有Facet的自定义组件
<jtcomp:blockUI ...>
<f:facet name="events">
<f:param name="filtering" value="true"/>
<f:param name="sorting" value="true"/>
<f:param name="paging" value="true"/>
</f:facet>
...
</jtcomp:blockUI>
在渲染器类中,我打算收集所有UIParameter(f:param)。首先,我得到如下的方面
UIComponent facet = blockUI.getFacet("events");
好。现在我想我可以调用facet.getChildren()并迭代所有的孩子。但是我已经调试并想通了如果f:facet包含多个f:param组件,我只能这样做。如果它只有一个f:这样的param
<jtcomp:blockUI ...>
<f:facet name="events">
<f:param name="filtering" value="true"/>
</f:facet>
...
</jtcomp:blockUI>
上面的调用已经提供了这个组件。我的意思是,facet是一个UIParameter。因此,整个逻辑看起来像
// collect all f:param
List<UIParameter> uiParams = new ArrayList<UIParameter>();
if (facet instanceof UIParameter) {
// f:facet has one child and that's f:param
uiParams.add((UIParameter) facet);
} else if (facet != null && facet.getChildren() != null) {
// f:facet has no or more than one child
for (UIComponent kid : facet.getChildren()) {
if (kid instanceof UIParameter) {
uiParams.add((UIParameter) kid);
}
}
}
这是一个预期的JSF行为还是只是一个Mojarra bug(我使用的是Mojarra 2.1.0-b02)?我知道,在JSF2之前,只有一个组件被允许在f:facet中。也许他们仍然会检查它,如果只有一个子组件可用,则不会实例化FacetsMap。而不是包含所有子组件的FacetsMap,然后子组件自绑定为父组件的构面。
你怎么看?我在JSF规范中找不到任何东西。提前感谢您的回复!答案 0 :(得分:2)
好的,在ComponentSupport的方法addComponent中找到答案。的java
/**
* Add the child component to the parent. If the parent is a facet,
* check to see whether the facet is already defined. If it is, wrap the existing component
* in a panel group, if it's not already, then add the child to the panel group.
* If the facet does not yet exist, make the child the facet.
*/
public static void addComponent(FaceletContext ctx, UIComponent parent, UIComponent child)
所有facets子项自动包含在UIPanel中,以便我的代码正常工作。
答案 1 :(得分:1)
我不知道它在哪里指定,但我在官方Java EE教程中找到了评论。
来自Java EE 6 tutorial(包括JavaServer Faces 2.0):
分面只能有一个孩子,所以一个 h:如果需要,需要panelGroup标签 分组多个组件 在f:facet
中
也许将你的参数包裹在h:panelGroup
内可以帮助你。