上週在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.source
,javax.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的環境,這並不重要。
這對於基於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
@BalusC我把你的評論作爲答案。如果你想自己做,只需回答,我會接受你的。我不喜歡問題仍然存在 – Ced