Когда mojarra добавляет контейнер имен в список необязательных параметров?
В источнике класса AjaxBehaviorRenderer (строка 260) есть строка, которая, очевидно, добавляет NamingContainer
Идентификатор списка необязательных параметров mojarra.ab(...)
, Я никогда не сталкивался с этим, поэтому мне любопытно, когда он используется:
RenderKitUtils.appendProperty(ajaxCommand, "com.sun.faces.namingContainerId", namingContainerId, true);
линия 260
2 ответа
Во время работы над спецификацией 790 на прошлой неделе, которая должна решить ao Рендеринг другой формы с помощью ajax приводит к потере состояния его представления, как мне добавить это обратно? Это мне объяснил Нил Гриффин, парень из портлета.
Похоже, что портлеты могут иметь несколько представлений JSF, отображаемых в одном и том же HTML-документе, каждое со своим собственным состоянием представления. В портлетах есть специальный UIViewRoot
экземпляр, который реализует NamingContainer
, Во время обычного рендеринга все формы, входы и команды будут иметь идентификаторы и имена с префиксом собственного идентификатора клиента представления. Это будет хорошо работать во время синхронных обратных передач. Портлет может таким образом идентифицировать точное представление для восстановления.
Однако во время асинхронных обратных передач jsf.js
создаст кучу дополнительных специфичных для ajax параметров запроса, таких как javax.faces.source
, javax.faces.partial.event
и т. д. Эти имена параметров запроса не имеют префикса с собственным идентификатором клиента представления. Поэтому портлет не может связать их с определенным представлением. Отсюда и выпуск 3031.
Существовала еще одна проблема, связанная с тем, что идентификаторы состояния представления в ответах ajax не были должным образом распределены между именами. Поэтому реализация портлета должна была настраивать средство частичного ответа в так называемом "мосту JSF". Это будет учтено при реализации спецификации 790. Вместо того, чтобы анализировать "среду портлета", как в текущей реализации, будут проверяться UIViewRoot instanceof NamingContainer
который является более гибким и независимым от портлетов. Мохарра-специфичный com.sun.faces.namingContainerId
также будет удален. Вместо этого это значение будет <partial-response id="...">
таким образом jsf.js
можно просто извлечь оттуда.
В общем, не очень важно, если вы ориентируетесь только на среды сервлетов.
Согласно комментарию balusC:
Это интересно только для приложений на основе портлетов (не для приложений на основе сервлетов). Я не могу точно объяснить, почему и для чего он используется (может, портлет / liferay), но особенность портлета называется "параметры пространства имен". См. https://web.liferay.com/web/meera.success/blog/-/blogs/liferay-requires-name-spaced-parameters