我们正在开发一个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方法,但是它们都不起作用。
有没有人能以正确的方式给我一个起点?
答案 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.
}