在同一视图中使用多个包含相同页面

时间:2013-02-06 21:01:53

标签: jsf-2 primefaces

环境是JSF 2,GlassFish,PrimeFaces。

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

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

例如:

  • A类与B,C和D类有关系。
  • B级没有任何关系。
  • C类与B级有关系。
  • D类与E类有关系。
  • E级与B级有关系。

现在我已经总结了背景,这就是困扰我的事情。

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

“root”类显示在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:感谢阅读!

1 个答案:

答案 0 :(得分:0)

对于非常复杂的性质,CDI提供了更多,然后提供简单的JSF2。您可以使用生成器,在运行时,您可以自由地评估和修改对象。

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