1

环境是 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:感谢阅读!

4

1 回答 1

0

对于非常复杂的性质,CDI 提供了比普通 JSF2 更多的功能。您可以使用生产者,并且在运行时您可以自由地评估和修改对象。

您可以跟踪已经生成的内容并相应地调整命名。例如,将每个占用的名称保存在地图中。祝你好运。

于 2013-02-06T21:18:48.520 回答