环境是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:感谢您的阅读!
“我为所有包含的XHTML文件使用了相同的参数名称” - 我明白参数是关于要包含的url的吗? “我得到一个javax.el.PropertyNotFoundException,因为表单指向另一个对象” - 你如何更新表单?你在做'update =“@ form”'? –