2010-08-10 59 views
7

我的JSF應用程序中存在重複ID的問題。我讀過in this post,其中一種可能的解決方案是使用命名容器。你能舉一些例子如何使用命名容器來避免重複的IDS問題嗎?我使用Facelets。Jsf如何創建命名容器

回答

12

這是使用JSF1.2和Facelets什麼工作對我來說:

我發現,無論是<ui:composition>也不<ui:component>實際上是一個命名容器,所以使用相同的組件不止一次在相同的形式將失敗,並重復的ID異常。這似乎是一個糟糕的設計,因爲組件的全部重點都是可重用性。爲了解決這個問題,我包括每個組件內的<f:subview>並在其上設置id作爲我的成分標籤的參數:

myComponent.xhtml:

<ui:component>  
    <f:subview id="#{id}"> 
     ....component code 
    </f:subview> 
</ui:component> 

和使用它的其他頁面很簡單(在設置taglib.xml和web之後)。xml正確):

<myTagLib:myComponent id="myCompA" /> 
+0

這完美地解決了我的問題。感謝Naganalf和BalusC! – mgamer 2010-08-12 07:28:59

+1

抱歉投下,但f:subview似乎並不打算解決OP中提到的帖子中描述的問題。這做了一些事情,可能會起作用。 – Toskan 2011-08-10 15:20:19

4

我建議退後一步調查爲什麼發生重複ID問題。一旦你確定了根本原因,那麼就按照「常規」的方式修復它,而不是創建你自己的UINamingContainer組件。

有重複的ID錯誤,這將有助於你進一步釘下來幾個可能的原因:

  • 相同 ID被用在不同UIComponent S中相同UINamingContainer組件中。
  • 物理上不同的成分綁定到相同 bean的相同UIComponent屬性。
  • 僅JSP:f:subview已在頁中聲明,而不是包括頁。
  • 相同包括網頁包括倍數相同UINamingContainer組件內倍。
  • 已經動態構建了一個組件(例如,new UIComponent()而沒有具有分配的ID。

這裏,UINamingContainer是下每個<h:form><h:dataTable><f:subview>

如果上述建議沒有幫助,那麼更新您的問題,包括儘可能小的代碼片段(因此,沒有所有無關的代碼/雜波像無關的組件,庫,HTML/CSS/JS /等)和只需複製'n'paste'n'running它沒有任何更改再現了完全相同的問題。

+1

這就像接下來的最後一個場景。我有一個facelets自定義組件,我在同一頁面中包含多次。我的facelets組件包含帶有問題標識的a4j:outputPanel。我需要這個ID,以便我可以reRender a4j:outputPanel。 將我的組件內容包裝到h:form中似乎對我來說不是一個好選擇。我寧願將它放入一些facelets提供的UINamingContainer中,但我認爲沒有這種東西。 – mgamer 2010-08-10 13:49:03

+1

JSF 1.x或2.x?你在哪裏調用自定義組件內部或外部的重新渲染? 「自定義組件」究竟是什麼意思,只是'ui:composition'? – BalusC 2010-08-10 14:18:01

+0

我在創建我的第一個facelets組件時遇到了同樣的問題。我會在另一個答案中分享對我有用的東西(當我從午餐回來時)。您可能想要更新您的問題以更具體。 – Naganalf 2010-08-10 18:56:20