环境是 JSF 2、GlassFish、PrimeFaces。
我正在开发一个用于在非常复杂的模型中编辑数据的应用程序。
模型中的所有类都与其他类有关系,而这些类又与其他类有关系,依此类推。在许多情况下,对于给定的类,关系的“集群”(该类的整个扩展树)在树的许多地方都包含相同的类。
例如 :
- A 类与 B、C 和 D 类有关系。
- B类没有关系。
- C类与B类有关系。
- D类与E类有关系。
- E类与B类有关系。
现在我已经总结了上下文,这就是我的困扰。
已做出设计决定,将类的给定实例的所有数据放在同一页面中。对于给定的“根”类,当前的架构如下:
“根”类显示在 PrimeFaces TabView 中。选项卡是:
- “Main”:包含类的简单属性(字符串、整数、...)。
- 每个关系都有一个选项卡。
- 在每个选项卡中,都有一个指向相应 XHTML 文件的包含。
如果关系指向单个类,则指向的 XHTML 文件类似于此处描述的“根”形式。适当的对象作为参数传递给 include 指令中的 XHTML 文件。最多有 3 个嵌套的 TabView。
如果关系指向一个列表,则指向的 XHTML 文件显示一个带有“添加”、“编辑”和“删除”按钮的列表。适当的列表作为参数传递给 include 指令中的 XHTML 文件。
关于列表还有其他复杂性,但我暂时不会去那里。仅凭单一元素,我们就可以看出存在问题。
起初,我对要包含的所有 XHTML 文件使用相同的参数名称。这不起作用,因为参数对于视图是“全局的”。它似乎适用于初始显示,但是一旦一个选项卡中有更新,我就会得到一个 javax.el.PropertyNotFoundException 因为表单指向另一个对象。
为了缓解这个问题,我将参数名称更改为每个类都是唯一的。以前,所有参数都称为“元素”。修改后,A类的参数称为“aElement”,B类的参数称为“bElement”,依此类推。
如果集群中的所有类都不同,则此方法有效。如果发生冲突,我们又回到了与以前相同的问题:在两个不同的包含中,我们使用相同的参数名称,但具有不同的值。
我曾想过一种非常复杂的方法,但它使用 Javascript:
- 我向 XHTML 表单传递了一个附加参数,它是传递对象的唯一标识符。
- 我在 XHTML 表单中获取标识符,并将其放在一个隐藏字段中,该字段与表单的其余部分分开。
- 我确保隐藏字段永远不会更新,在表单获得焦点时读取其值,并使用该值通过 AJAX 请求检索正确的对象。
所以我的问题是:是否有“纯”Java/JSF 方式来处理这个问题?
TL;DR:感谢阅读!