Jsf Как создать контейнер имен
У меня проблема с дублированными идентификаторами в моем приложении JSF. В этом посте я читал, что одним из возможных решений является использование контейнера имен. Можете ли вы привести пример использования контейнера именования, чтобы избежать дублирования идентификаторов? Я использую Facelets.
2 ответа
Вот что сработало для меня, используя JSF1.2 и facelets:
Я обнаружил, что ни <ui:composition>
ни <ui:component>
на самом деле является контейнером именования, поэтому использование одного и того же компонента более одного раза в одной и той же форме завершится с ошибкой с дублированием идентификатора. Это кажется плохим дизайном, поскольку весь смысл компонентов заключается в возможности повторного использования. Чтобы обойти эту проблему, я включаю <f:subview>
внутри каждого компонента и установите его идентификатор в качестве параметра моего тега компонента:
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
собственность того же боба. - Только JSP:
f:subview
объявлен на родительской странице вместо страницы включения. - Одна и та же страница включения включена несколько раз внутри одной и той же
UINamingContainer
составная часть. - Компонент был построен динамически (например,
new UIComponent()
) без присвоения идентификатора.
Вот, UINamingContainer
находится под каждым <h:form>
, <h:dataTable>
а также <f:subview>
,
Если приведенные выше предложения не помогли, обновите свой вопрос, включив в него наименьший возможный фрагмент кода (таким образом, без всякого неуместного кода / беспорядка, например, несвязанных компонентов, библиотек, HTML/CSS/JS/ и т. Д.), Который воспроизводит точно такую же проблему: просто скопируйте и запустите его без каких-либо изменений.