在类AjaxBehaviorRenderer(第 260 行)的源代码中,有一行显然将NamingContainer
Id 附加到mojarra.ab(...)
. 我从来没有遇到过它,所以我很好奇它什么时候使用:
RenderKitUtils.appendProperty(ajaxCommand, "com.sun.faces.namingContainerId", namingContainerId, true);
第 260 行
在类AjaxBehaviorRenderer(第 260 行)的源代码中,有一行显然将NamingContainer
Id 附加到mojarra.ab(...)
. 我从来没有遇到过它,所以我很好奇它什么时候使用:
RenderKitUtils.appendProperty(ajaxCommand, "com.sun.faces.namingContainerId", namingContainerId, true);
第 260 行
在上周处理规范问题 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 的环境,这并不重要。
根据balusC评论:
它只对基于 portlet 的应用程序(而不是基于 servlet 的应用程序)感兴趣。我不能准确地解释它的用途和用途(portlet/liferay 的人可能会),但 portlet 的特定功能称为“命名空间参数”。见https://web.liferay.com/web/meera.success/blog/-/blogs/liferay-requires-name-spaced-parameters