[英]UIForm with prependId=“false” breaks <f:ajax render>
我對事實背后的想法有一個疑問,那就是只有UIForm
才具有屬性prependId
。 為什么在NamingContainer
接口中未指定屬性? 您現在可能會說這是由於向后兼容性,但是我更希望破壞兼容性,讓實現該接口的用戶也為prependId事情實現方法。
從我的角度來看,關於UIForm
組件中的UIForm
的主要問題是,它將破壞findComponent()
我希望如果我使用prependId
,則NamingContainer
行為將發生變化,不僅與呈現有關,而且還與想要搜索時有關組件樹中的組件。
這里有個簡單的例子:
<h:form id="test" prependId="false">
<h:panelGroup id="group"/>
</h:form>
現在,當我想獲取panelGroup組件時,我希望將字符串"group"
傳遞給方法findComponent()
,但找不到任何東西,我必須改用"test:group"
。
具體的問題是,將ajax與prependId="false"
。 ajax標記在屬性更新和處理中期望值關心命名容器。 有點奇怪,當我使用prependId="false"
,我必須指定完整的ID或路徑,但是可以。
<h:form id="test" prependId="false">
<h:panelGroup id="group"/>
</h:form>
<h:form id="test1" prependId="false">
<h:commandButton value="go">
<f:ajax render="test:group"/>
</h:commandButton>
</h:form>
好的,這段代碼可以毫無問題地呈現,但是由於找不到它,因此不會更新panelGroup。 PartialViewContext
將僅包含id "group"
作為renderIds的元素。 我不知道這是否可以預期,可能是這樣,但是我不知道代碼。 現在我們到了點,因為方法作為參數傳遞的表達式是"group"
,所以方法findComponent()
找不到組件,該方法希望"test:group"
找到組件。
一種解決方案是編寫自己的findComponent()
,這是我選擇處理此問題的方式。 在這種方法中,我像正常的UIComponent
一樣處理一個組件NamingContainer
並將其prependId屬性設置為false。 我將必須為每個提供prependId屬性的UIComponent
這樣做,這很糟糕。 反射將有助於繞過類型的靜態定義,但它仍然不是一個真正干凈的解決方案。
另一種方法是在NamingContainer
接口中引入prependId屬性,並將findComponent()
的行為更改為如上所述。
最后提出的解決方案是更改ajax標記的行為以傳遞整個id,但這只能解決ajax問題,不能解決findComponent()
實現背后的編程問題。
您對此有何看法,為什么會這樣實施? 我不能成為第一個遇到此問題的人,但找不到相關主題?
實際上,當使用<h:form prependId="false">
時,由<f:ajax render>
完成的UIComponent#findComponent()
失敗。 此問題是已知的,並且是“無法解決”的問題 : JSF規范問題573 。
在我的愚見,他們不應該添加prependId
屬性的UIForm
在JSF 1.2時代。 這樣做只是為了使j_security_check
用戶滿意,他們希望為此使用帶有JSF輸入組件的JSF表單( j_security_check
需要准確的輸入字段名稱j_username
和j_password
,而配置不能修改它們)。 但是他們並沒有完全意識到,在JSF 1.2中引入了另一項改進,使您可以繼續使用<form>
而不是堅持使用<h:form>
。 然后CSS / jQuery純粹主義者開始濫用prependId="false"
以避免轉義分隔符:
在他們選擇不佳的CSS選擇器中。
只是永遠不要使用prependId="false"
。
對於j_security_check
,只需使用<form>
或新的Servlet 3.0 HttpServletRequest#login()
。 另請參閱使用j_security_check在Java EE / JSF中執行用戶認證 。
對於CSS選擇器,萬一您絕對需要一個ID選擇器(因此不需要更可重用的類選擇器),只需將所需的組件包裝在純HTML <div>
或<span>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.