0

在类AjaxBehaviorRenderer(第 260 行)的源代码中,有一行显然将NamingContainerId 附加到mojarra.ab(...). 我从来没有遇到过它,所以我很好奇它什么时候使用:

RenderKitUtils.appendProperty(ajaxCommand, "com.sun.faces.namingContainerId", namingContainerId, true);

第 260 行

4

2 回答 2

2

在上周处理规范问题 790时,应该解决ajax 渲染其他表单导致其视图状态丢失的问题,我该如何添加回来?,这是由 Portlet 专家 Neil Griffin 向我解释的。

看起来portlet 可以有多个JSF 视图呈现到同一个HTML 文档,每个都有自己的视图状态。在 portlet 中,有一个特殊的UIViewRoot实例实现NamingContainer. 在常规渲染期间,所有表单、输入和命令都将具有以视图自己的客户端 ID 为前缀的 ID 和名称。这将在同步回发期间正常工作。Portlet 可以通过这种方式识别要恢复的确切视图。

但是,在异步回发期间,jsf.js将创建一堆额外的特定于 ajax 的请求参数,例如javax.faces.source,javax.faces.partial.event等。这些请求参数名称不以视图自己的客户端 ID 为前缀。因此,portlet 无法将它们与特定视图相关联。因此impl issue 3031

还有另一个问题是 ajax 响应中的视图状态标识符没有以这种方式正确命名。因此,portlet 实现必须在所谓的“JSF 桥”中定制部分响应编写器。在实施规范问题 790 期间将考虑到这一点。与当前实施中那样嗅探“portlet 环境”不同,将检查UIViewRoot instanceof NamingContainer哪个更灵活且独立于 portlet。Mojarra 特有的com.sun.faces.namingContainerId也将被删除。相反,这个值将被渲染,<partial-response id="...">以便jsf.js可以从那里提取。

总而言之,如果您只针对基于 servlet 的环境,这并不重要。

于 2016-06-18T08:46:10.963 回答
0

根据balusC评论:

它只对基于 portlet 的应用程序(而不是基于 servlet 的应用程序)感兴趣。我不能准确地解释它的用途和用途(portlet/liferay 的人可能会),但 portlet 的特定功能称为“命名空间参数”。见https://web.liferay.com/web/meera.success/blog/-/blogs/liferay-requires-name-spaced-parameters

于 2016-05-11T01:30:10.073 回答