2016-04-21 62 views
0

在類別AjaxBehaviorRenderer (line 260)的來源中,有一行顯然將NamingContainer ID附加到可選參數列表mojarra.ab(...)。我從來沒有碰到過,所以我很好奇,當它被用於:mojarra何時將可命名容器添加到可選參數列表中?

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

線260

+1

這對於基於portlet的應用程序(不是基於servlet的應用程序)來說只是有趣的。我無法準確解釋爲什麼以及它用於什麼(portlet/liferay人員可能),但portlet特定功能稱爲「名稱空間參數」。見例如https://web.liferay.com/web/meera.success/blog/-/blogs/liferay-requires-name-spaced-parameters相關問題:https://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-861和https://java.net/jira/browse/JAVASERVERFACES-3031 – BalusC

+0

@BalusC我把你的評論作爲答案。如果你想自己做,只需回答,我會接受你的。我不喜歡問題仍然存在 – Ced

回答

1

上週在spec issue 790上工作時,應該解決a.o. 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中,有一個實現NamingContainer的特殊UIViewRoot實例。在正常呈現期間,所有表單,輸入和命令都將具有以視圖自己的客戶端ID爲前綴的ID和名稱。這將在同步回發期間正常工作。 Portlet可以通過這種方式識別要恢復的確切視圖。

然而,在異步回發,則jsf.js將創建一堆如javax.faces.sourcejavax.faces.partial.event等。這些請求參數名不與視圖的自己的客戶端ID前綴附加特定Ajax的請求參數。因此,portlet無法將它們與特定的視圖相關聯。因此impl issue 3031

有在不被正確命名空間這樣Ajax響應視圖狀態標識符的另一個問題。因此,Portlet實現必須在所謂的「JSF橋」中定製部分響應寫入器。這將在執行規範問題790時考慮到。不像在當前的實現中那樣嗅探「portlet環境」,將會在UIViewRoot instanceof NamingContainer上進行檢查,這是更靈活和不依賴於portlet的。莫哈拉特定的com.sun.faces.namingContainerId也將被刪除。相反,此值將呈現爲<partial-response id="...">,以便jsf.js可以從那裏提取。

總而言之,如果您只針對基於servlet的環境,這並不重要。