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/ и т. Д.), Который воспроизводит точно такую ​​же проблему: просто скопируйте и запустите его без каких-либо изменений.

Другие вопросы по тегам