簡體   English   中英

帶有prependId =“ false”的UIForm中斷<f:ajax render>

[英]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_usernamej_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM