У меня проблема с дублированием идентификаторов в моем приложении JSF. Я прочитал в этом посте , что одним из возможных решений является использование контейнера имен. Не могли бы вы привести пример использования контейнера именования, чтобы избежать дублирования идентификаторов? Я использую Facelets.
Вот что у меня сработало при использовании JSF1.2 и фейслетов:
Я обнаружил, что ни
, ни
на самом деле не являются именованием контейнер, поэтому использование одного и того же компонента более одного раза в одной и той же форме приведет к сбою с исключением повторяющегося идентификатора. Это кажется плохим дизайном, поскольку весь смысл компонентов заключается в возможности повторного использования. Чтобы обойти эту проблему, я включаю
в каждый компонент и устанавливаю его идентификатор в качестве параметра тега моего компонента:
myComponent.xhtml:
<ui:component>
<f:subview id="#{id}">
....component code
</f:subview>
</ui:component>
и его использование на других страницах просто (после правильной настройки taglib.xml и web.xml):
<myTagLib:myComponent id="myCompA" />
Я предлагаю сделать шаг назад и исследовать , почему возникает проблема с дублированием идентификаторов. После того, как вы установили основную причину, просто исправьте ее «обычным» способом, а не создавайте свой собственный компонент UINamingContainer
.
Существует несколько возможных причин ошибок повторяющихся идентификаторов, которые помогут вам решить эту проблему:
UIComponent
компонентах внутри тот же компонент UINamingContainer
. UIComponent
того же компонента . f: subview
объявлен на родительской странице вместо страницы include . UINamingContainer
компонента. новый UIComponent ()
) без присвоенного идентификатора . Здесь UINamingContainer
находится под каждым из
,
и
.
Если приведенные выше предложения не помогли, обновите свой вопрос, включив в него минимально возможный фрагмент кода (таким образом, без всего нерелевантного кода / беспорядка, такого как несвязанные компоненты, библиотеки, HTML / CSS / JS / и т. д.), который воспроизводит ту же проблему, просто скопировав ее и запустив без каких-либо изменений.