mojarra 何时将命名容器添加到可选参数列表中



在类AjaxBehaviorRenderer(第260行)的源代码中,有一行显然将NamingContainer ID附加到mojarra.ab(...)的可选参数列表中。我从未遇到过它,所以我很好奇何时使用它:

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

260路

在上周处理规范问题 790 时,这应该可以解决 a.o. ajax 渲染其他形式会导致其视图状态丢失,我该如何将其添加回来?这是由 Portlet 人员 Neil Griffin 向我解释的。

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

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

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

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

根据栏杆C评论:

它只对基于 Portlet 的应用程序(而不是基于 servlet 的应用程序)感兴趣。 我无法确切解释它为什么以及用于什么(portlet/liferay 盖伊可能),但 Portlet 特定的功能称为"命名空间 参数"。请参阅 https://web.liferay.com/web/meera.success/blog/-/blogs/liferay-requires-name-spaced-parameters

最新更新