Jsf Как создать контейнер именования
У меня проблема с дублированными идентификаторами в моем приложении JSF. Я прочитал в этом сообщении, что одним из возможных решений является использование Naming Container. Можете ли вы привести мне пример использования контейнера для именования, чтобы избежать дублирования проблемы с идентификаторами? Я использую Facelets.
Ответы
Ответ 1
Это то, что сработало для меня, используя 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" />
Ответ 2
Я предлагаю сделать шаг назад и исследовать причину возникновения проблемы с дублирующимся идентификатором. После того, как вы пригвоздили основную причину, просто исправьте ее "обычным" способом, а не создайте свой собственный компонент UINamingContainer
.
Существует несколько возможных причин дублирования ошибок идентификатора, которые должны помочь вам еще больше убрать его:
- Тот же идентификатор используется для разных
UIComponent
внутри одного и того же компонента UINamingContainer
.
- Физически разные компоненты связаны с одним и тем же свойством
UIComponent
того же bean.
- Только JSP:
f:subview
объявлен на родительской странице, а не на странице включения.
- Одна и та же страница включает несколько раз внутри одного и того же компонента
UINamingContainer
.
- Компонент динамически построен (например,
new UIComponent()
) без присвоения идентификатора.
Здесь UINamingContainer
находится под каждым <h:form>
, <h:dataTable>
и <f:subview>
.
Если приведенные выше предложения не помогают, обновите свой вопрос, чтобы включить наименьший возможный фрагмент кода (таким образом, без всякого ненужного кода/беспорядка, такого как несвязанные компоненты, библиотеки, HTML/CSS/JS/etc), который воспроизводит точные та же проблема, просто скопировав ее, не изменив ее без каких-либо изменений.