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

时间:2016-04-21 14:03:25

标签: jsf rendering jsf-2.2 mojarra naming-containers

在课程AjaxBehaviorRenderer (line 260)的来源中,有一行显然会将NamingContainer ID附加到mojarra.ab(...)的可选参数列表中。我从来没有遇到它,所以我很好奇它何时被使用:

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

第260行

2 个答案:

答案 0 :(得分:2)

上周工作spec issue 790时,应该解决问题。 Rendering other form by ajax causes its view state to be lost, how do I add this back?,这是一个portlet家伙Neil Griffin向我解释的。

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

但是,在异步回发期间,jsf.js将创建一组额外的特定于ajax的请求参数,例如javax.faces.sourcejavax.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的环境,那么这并不重要。

答案 1 :(得分:0)

根据balusC评论:

  

这对基于portlet的应用程序(不是基于servlet的应用程序)来说很有趣。   我无法准确解释为什么以及它用于什么(一个portlet / liferay   可能),但portlet特定的功能称为“命名空间   参数“。见https://web.liferay.com/web/meera.success/blog/-/blogs/liferay-requires-name-spaced-parameters