是否可以在 JSF 中实现组件的动态树?

Posted

技术标签:

【中文标题】是否可以在 JSF 中实现组件的动态树?【英文标题】:Is it possible to implement a dynamic tree of components in JSF? 【发布时间】:2011-09-10 09:14:04 【问题描述】:

我正在尝试在 JSF 1.2 (Mojarra) 中构建一个组件树,其中该树由多种类型的连接节点和叶节点组成。每个叶节点都需要以独特的方式呈现,并且需要回发潜在的变化。目的是允许用户更新处理逻辑,其中每个叶子节点代表一个操作,例如“值等于”或“值不等于”。

例如:

Root
|
+- InternalNode1 (type I_A)
|  |
|  +- LeafNode1 (type L_A)
|  |
|  +- LeafNode2 (type L_B)
|
+- InternalNode2 (type I_B)
   |
   +- LeafNode3 (type L_B)
   |
   +- LeafNode4 (type L_A)

每种类型的叶节点都需要进行不同的渲染,具体取决于该节点类型的需要。此外,树将是可修改的,并且可以使用 javascript 添加或删除节点,并将更新发布回服务器等。例如,在上面的树中,可以删除 LeafNode4,或者将其类型更改为 L_B。

这对 JSF 组件是否可行?我尝试使用多态 UI 组件是不是走错了路?

【问题讨论】:

【参考方案1】:

可以通过编程方式构建组件树,但这对于您的用例来说是错误的方法。允许用户代理操作此类服务器端代码通常是不安全的。

最好使用模型来管理您的树结构(本质上是approach Don Roby is suggesting。)然后可以像任何其他用户输入一样验证构成此模型的数据,以确保攻击者不会尝试将服务器端数据置于无效状态。

JSF 的声明式方法使开箱即用变得具有挑战性(您可以查看粗略的树渲染示例 here。)如果您不想拖入第 3 方库(或编写自己的控件)您最好在 JavaScript 中处理所有树 UI,并使用 JSF 隐藏字段将其传输到服务器或从服务器传输。

【讨论】:

感谢您的回复。我对您提到的自定义UIComponent 方法感兴趣,其中组件包含我的数据模型。我的麻烦是了解数据是如何在回发时重构的。如果数据模型的叶节点包含每个具有不同输入/选择/等的可插入类(多态),那么我是否需要组件的 decode 方法中的代码来解析它并重新构建树? JavaScript/hidden field 解决方案也很有趣。可以操作 JSON 树并对其进行解析,从而摆脱整个组件的想法。 @MGE - 通常,您将从请求参数映射中解码Renderer 中提交的数据。如果您想允许表单将数据发送回服务器,则可能无论如何都需要使用隐藏字段。您采用哪种方法很大程度上取决于个人喜好 - 您想要 bean 中的反序列化逻辑,Converter 还是 Renderer?您是否希望 Renderer 将树作为 html 发出或在 JS 中解析数据并在页面加载时重新创建?无论如何,您将不得不或多或少地编写 JavaScript。【参考方案2】:

你可能想看看<rich:tree>

【讨论】:

感谢您的回复。根据我采取的路线,我可能能够使用讨论的一些概念。但是,在我的工作地点,使用 RichFaces 可能不是一种选择:-)

以上是关于是否可以在 JSF 中实现组件的动态树?的主要内容,如果未能解决你的问题,请参考以下文章

JSF 部分屏幕更新处理完整的组件树

JSF组件的动态值绑定

JSF2:在运行时构建 JSF2 视图(整个组件树)

如何在 Ajax 请求期间在 JSF2 中动态添加组件

在表达式树中实现 Not,.net 4

是否可以在 JavaScript 中实现动态 getter/setter?