在f:facet中找到一个或多个组件 - 它是否按设计工作?

时间:2011-04-01 10:03:46

标签: jsf jsf-2

我的页面上有一个带有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规范中找不到任何东西。提前感谢您的回复!

2 个答案:

答案 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内可以帮助你。