是否可以在 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 中实现组件的动态树?的主要内容,如果未能解决你的问题,请参考以下文章