2013-02-06 136 views
1

环境是JSF 2,GlassFish,PrimeFaces。使用多个包含同一视图中的同一页面

我正在编写一个用于编辑非常复杂模型中的数据的应用程序。

模型中的所有类都与其他类有关系,而这些类又与其他类有关系,依此类推。在许多情况下,对于给定的类,关系的“集群”(整个类的扩展树)在树中的许多地方包含相同的类。

例如:

  • A类具有关系到类B,C和D.
  • 类B没有关系。
  • C类有关系,B类
  • 类d已关系到E类
  • E级有关系,B类

现在,我总结了下,这里有什么烦恼我。

已做出设计决定,将全部类的给定实例的数据放在同一页中。对于给定的“根”类,当前的体系结构如下所示:

“根”类显示在PrimeFaces TabView中。这些标签是:

  • “Main”:包含类的简单属性(String,Integer,...)。
  • 每个关系都有一个选项卡。
  • 在每个选项卡中,有一个包含指向相应的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:感谢您的阅读!

+0

“我为所有包含的XHTML文件使用了相同的参数名称” - 我明白参数是关于要包含的url的吗? “我得到一个javax.el.PropertyNotFoundException,因为表单指向另一个对象” - 你如何更新表单?你在做'update =“@ form”'? –

回答

0

对于非常复杂的本质CDI有更多提供普通的JSF2。您可以使用生产者,在运行时可以自由评估和修改对象。

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

相关问题