环境是JSF 2,GlassFish,PrimeFaces。
我正在开发一个在非常复杂的模型中编辑数据的应用程序。
模型中的所有类都与其他类有关系,而其他类又与其他类有关系,依此类推。在许多情况下,对于给定的类,关系的“簇”(类的整个扩展树)在树中的许多位置包含相同的类。
例如:
现在我已经总结了背景,这就是困扰我的事情。
已经做出设计决定,将所有类的给定实例的数据放在同一页面中。对于给定的“根”类,当前的体系结构如下:
“root”类显示在PrimeFaces TabView中。标签是:
如果关系指向单个类,则指向的XHTML文件类似于此处描述的“根”形式。适当的对象作为参数传递给include指令中的XHTML文件。最多有3个嵌套的TabView。
如果关系指向列表,则指向的XHTML文件将显示一个列表,其中包含“添加”,“编辑”和“删除”按钮。足够的列表作为参数传递给include指令中的XHTML文件。
关于名单还有其他复杂性,但我暂时不会去那里。只需使用单个元素,我们就可以看到存在问题。
首先,我为所有要包含的XHTML文件使用了相同的参数名称。这不起作用,因为参数是视图的“全局”。它似乎适用于初始显示,但只要在一个选项卡中有更新,我就会得到一个javax.el.PropertyNotFoundException,因为该表单指向另一个对象。
为了缓解这个问题,我将参数名称更改为每个类的唯一名称。之前,所有参数都被称为“元素”。修改后,A类的参数称为“aElement”,B类的参数称为“bElement”等。
如果群集中的所有类都不同,则此方法有效。如果发生碰撞,我们会回到与以前相同的问题:在两个不同的包含中,我们使用相同的参数名称,具有不同的值。
我考虑过一种非常复杂的方法,但它使用的是Javascript:
所以我的问题是:是否有一种“纯粹的”Java / JSF方法来处理这个问题?
TL; DR:感谢阅读!
答案 0 :(得分:0)
对于非常复杂的性质,CDI提供了更多,然后提供简单的JSF2。您可以使用生成器,在运行时,您可以自由地评估和修改对象。
您可以跟踪已生成的内容并相应地调整命名。例如,在地图中保存每个占用的名称。祝你好运。