首页 > 解决方案 > JSF 自定义组件

问题描述

我有一个要重写的遗留代码。它包含许多自定义 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.something 它停止工作,因为在预期的树中找不到作为 AJAX 源的子命令链接。

我认为应该可以在 PreRenderView 阶段做同样的事情,但是操作将不起作用,因为命令组件创建得太晚了。

应该如何实现这些组件:

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

标签: jsfjsf-2mojarra

解决方案


推荐阅读