簡體   English   中英

Jsf如何創建命名容器

[英]Jsf How to create a Naming Container

我的JSF應用程序中存在重復ID的問題。 在這篇文章中讀過,其中一個可能的解決方案是使用命名容器。 你能給我一些例子來說明如何使用命名容器來避免重復的id問題嗎? 我使用Facelets。

這對我來說使用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" />

我建議退后一步,研究為什么會出現重復的ID問題。 一旦你確定了根本原因,然后只需修復它“通常”的方式,而不是創建自己的UINamingContainer組件。

重復ID錯誤有幾種可能的原因,這有助於您進一步確定錯誤:

  • 同一 UINamingContainer組件內的不同 UIComponent上使用相同的 ID。
  • 物理上不同的組件綁定到 一個 bean的相同 UIComponent屬性。
  • 僅限JSP: f:subview已在頁面而不是包含頁面中聲明。
  • 同樣包括頁面包含相同的多次 UINamingContainer組件。
  • 組件已動態構建(例如, new UIComponent() ), 但未分配ID。

這里, UINamingContainer位於<h:form><h:dataTable><f:subview>之下。

如果以上建議沒有幫助,那么更新您的問題以包含盡可能小的代碼片段(因此, 沒有所有不相關的代碼/混亂,如不相關的組件,庫,HTML / CSS / JS /等),它們通過以下方式重現完全相同的問題:只是復制'n'paste'n'運行它沒有任何變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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