如何触发组件#includeCompositeComponent()调用?

时间:2014-06-25 08:34:55

标签: jsf composite-component omnifaces

我们正在开发一个JSF 2.1 / Facelet Web应用程序。

我们有一个复杂的复合组件,作为一个开关/案例,包含一个基于渲染属性条件的其他复合。

<h:body>
    <composite:interface>
        <composite:attribute name="form" type="com.my.Form" required="true" />
    </composite:interface>

    <composite:implementation>

        <my:form1 rendered="#{cc.attrs.form.type eq 'form1'}"/>
        <my:form2 rendered="#{cc.attrs.form.type eq 'form2'}"/>
        <my:form3 rendered="#{cc.attrs.form.type eq 'form3'}"/>
        <my:form4 rendered="#{cc.attrs.form.type eq 'form4'}"/>
        <my:form5 rendered="#{cc.attrs.form.type eq 'form5'}"/>
        ...
        <my:form10 rendered="#{cc.attrs.form.type eq 'form10'}"/>
        <my:form11 rendered="#{cc.attrs.form.type eq 'form11'}"/>
    </composite:implementation>
</h:body>

每种potentiel复合形式都相对复杂。 正如您可能猜到的那样,问题在于渲染性能非常差。

我尝试使用omnifaces Components#includeCompositeComponent(),但没有成功。 实际上,我无法弄清楚何时/何地/如何触发此事。 我尝试过postAddToView事件监听器,接口的组件类型为encodeBegin方法,但是它们都不起作用。

有没有人能以正确的方式给我一个起点?

1 个答案:

答案 0 :(得分:0)

您需要在视图构建期间触发它。 postAddToView事件侦听器方法必须有效。也许你做错了。这是一个启动示例:

<h:panelGroup>
    <f:event type="postAddToView" listener="#{bean.build}" />
</h:panelGroup>

有了这个,假设您有form.getType() form1,因此希望包含<my:form1 id="form1">中的xmlns:my="http://java.sun.com/jsf/composite/somelibrary"

public void build(ComponentSystemEvent event) {
    if (Faces.isPostback() && Faces.isRenderResponse()) {
        return;
    }

    UIComponent parent = event.getComponent();
    String libraryName = "somelibrary";
    String resourceName = form.getType() + ".xhtml";
    String id = form.getType();
    UIComponent composite = Components.includeCompositeComponent(parent, libraryName, resourceName, id);
    // ... You can set its attributes here, if necessary.
}