Я знаю, что мы не можем повторить идентификатор любого компонента, который у нас есть в одном и том же дереве представления.
У меня есть страница, которая включает другие страницы по определенному условию. Вот так...
<h:panelGroup rendered="#{bean.insertMode == 'SINGLE'}">
<ui:include src="_single.xhtml" />
</h:panelGroup>
<h:panelGroup rendered="#{bean.insertMode == 'DOUBLE'}">
<ui:include src="_double.xhtml" />
</h:panelGroup>
Теперь на этих страницах у меня есть «почти» одинаковая иерархия компонентов (комплекс) с различным поведением действий (не только вызовы методов, но и просмотр), например:
_single.xhtml
<p:inputText id="fieldID" value="#{bean.value}" />
<p:commandLink actionListener="#{bean.singleAction()}" />
_double.xhtml
<p:inputText id="fieldID" value="#{bean.value}" />
<p:commandLink actionListener="#{bean.doubleAction()}" />
Мой маленький пример работает нормально и отображается так, как должен, но я получаю
java.lang.IllegalStateException: Component ID fieldID has already been found in the view.
Я знаю, что JSF обрабатывает полные страницы, даже если они не включены, и поэтому я получаю это исключение.
Any smart way to solve this without changing the IDs of the components inside the include pages (Although it works, but the exception is annoying and seems something is wrong).
Я также не хочу обертывать каждую из страниц каким-либо компонентом-контейнером с другим идентификатором, чтобы у них был другой ПОЛНЫЙ идентификатор, например formId:fieldID, потому что главная страница также ссылается на эти компоненты внутри этих включений!
NamingContainer
на родительской странице или на дочерних страницах. Такой невидимый контейнер имен легко сделать с помощью составного компонента. - person rdcrng   schedule 12.09.2013