Jsf Как создать контейнер имен - PullRequest
7 голосов
/ 10 августа 2010

У меня проблема с дублированными идентификаторами в моем приложении JSF. Я прочитал в этом посте , что одним из возможных решений является использование контейнера имен. Не могли бы вы привести пример использования контейнера именования, чтобы избежать дублирования идентификаторов? Я использую Facelets.

Ответы [ 2 ]

12 голосов
/ 11 августа 2010

Вот что у меня получилось с использованием 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" />
4 голосов
/ 10 августа 2010

Я предлагаю сделать шаг назад и выяснить , почему возникает проблема с дублирующимся идентификатором.После того, как вы уничтожили основную причину, просто исправьте ее «обычным» способом, а не создавайте свой собственный UINamingContainer компонент.

Существует несколько возможных причин ошибок дублирующегося идентификатора, которые помогут вам в дальнейшем выявить его.:

  • Один и тот же ID используется для различных UIComponent s внутри того же UINamingContainer компонента.
  • Физически разные компоненты связаны с таким же UIComponent свойством того же компонента.
  • Только JSP: f:subview объявлено на родительской странице вместо include page.
  • такая же включаемая страница включена множественный раз внутри одного и того же UINamingContainer компонента.
  • Компонент был создан динамически (например, new UIComponent()) без с назначенным идентификатором.

Здесь UINamingContainer находится под каждым <h:form>, <h:dataTable> и <f:subview>.

Если приведенные выше предложения не помогают, tЗатем обновите ваш вопрос, включив в него наименьший возможный фрагмент кода (таким образом, без всего нерелевантного кода / беспорядка, таких как несвязанные компоненты, библиотеки, HTML / CSS / JS / и т. д.), который воспроизводит точно такую ​​же проблему, просто скопировав 'n'paste'n'rrning без каких-либо изменений.

...