JSF定制组件

时间:2018-10-08 10:25:43

标签: jsf jsf-2 mojarra

我有一个将要重写的旧代码。它包含许多自定义的JSF组件。当它们在树中时,大多数都只是在原地构建了其他组件的子树(来自JSF核心或其他惯例)。例如,在xhtml中,我有:

<custom-component atributes...>
    <child-component/>
    <child-component/>
</custom-component>

然后在此组件的PostAddToViewEvent实现中,例如:

UIComponent rootChildElement = JSFUtil.findAncesstorOfType(this, HtmlForm.class);
List<UIComponent> guiListChildren = this.getChildren();
if (rootChildElement == null) {
    rootChildElement = new HtmlForm();
} else {
    rootChildElement = new UINamingContainer();
}
rootChildElement.getChildren().addAll(this.getChildren());

但是在调试过程中,我注意到JSF处理针对此类自定义组件的AJAX请求时,即使将子级添加到创建的表单中,也将从XHTML页面中再次构建子级,然后再次添加。这导致执行AJAX时,这些孩子实际上位于树中的两个位置。

这在JSF 2.0.3中有效,但是当我们想升级到JSF 2.1时,它却停止了工作,因为预期在树中找不到作为AJAX源的子代中的命令链接成为。

我认为应该可以在PreRenderView阶段执行相同的操作,但是随后动作将不起作用,因为命令组件创建得太晚了。

这些组件应如何实现:

  • 复合成分
  • facelet标签
  • 标签装饰器?
  • 还有别的吗?

在这里修改组件树是否安全?如果我有一个组件,那不会重新分配子组件,而是向其自身添加一些新项,例如命令按钮或其他组件?

0 个答案:

没有答案