[英]When does mojarra adds a naming container to the list of optional parameters?
在类AjaxBehaviorRenderer的源代码中(第260行),有一行代码显然将NamingContainer
Id附加到mojarra.ab(...)
的可选参数列表中。 我从没碰过它,所以对于何时使用它感到好奇:
RenderKitUtils.appendProperty(ajaxCommand, "com.sun.faces.namingContainerId", namingContainerId, true);
260行
上周在处理规格问题790时应解决的问题ao 通过ajax渲染其他形式会导致其视图状态丢失,我该如何重新添加呢? ,这是Portlet专家Neil Griffin向我解释的。
看起来portlet可以具有多个JSF视图,这些视图呈现到同一HTML文档,每个视图都有自己的视图状态。 在portlet中,有一个特殊的UIViewRoot
实例,该实例实现NamingContainer
。 在常规渲染期间,所有表单,输入和命令都将具有以视图自身的客户端ID开头的ID和名称。 在同步回发期间,这将正常工作。 Portlet可以这种方式标识要还原的确切视图。
但是,在异步回发期间, jsf.js
将创建一堆额外的特定于Ajax的请求参数,例如javax.faces.source
, javax.faces.partial.event
等。这些请求参数名称不带有视图自身的前缀。客户编号。 因此,Portlet无法将它们与特定视图关联。 因此, 隐含问题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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.