Ответ 1
execute="@all"
был просто серьезным надзором при разработке спецификации JSF2. JSF отвлекает слишком много своей основы на основе HTML-форм, забывая, что это, в конечном счете, действительно генератор кода HTML.
В HTML, представляя другую форму, чем охватывающая, запрещена. Поэтому execute="@all"
никогда не будет работать с этой точки зрения. Он будет вести себя точно так же, как execute="@form"
. Учитывая, что JSF - это всего лишь генератор кода HTML, эта же "проблема" поразит и JSF. Невозможно обработать сразу несколько компонентов <h:form>
.
Если вам действительно нужна эта функция по какой-то причине, вы должны сделать шаг назад и пересмотреть неправильный способ просмотра HTML-форм. Вы должны убедиться, что ваши формы сконструированы таким образом, что вам никогда не нужна информация из другой формы.
См. также:
PrimeFaces уже понял, что @all
был принципиально неправильным. Именно поэтому они никогда не поддерживали @all
в атрибуте process
, их эквивалент execute
. Они изначально также не поддерживали @all
в update
, их эквивалент render
. Тем не менее, единственным реальным случаем использования в мире, когда это имело смысл, было обращение с полной страницей ошибок во время исключения ajax, поэтому они в конечном итоге вернули update="@all"
после создания FullAjaxExceptionHandler
. process="@all"
будет по-прежнему иметь тот же эффект, что и process="@form"
.
Однако сама библиотека PrimeFaces также непреднамеренно сделала возможное поведение execute="@all"
возможным благодаря более поздней версии partialSubmit="true"
, в соответствии с которой вы явно указываете все другие формы, как показано ниже (PFS @(form)
просто для упрощения, также возможна жесткая коллекция, например, :formId1 :formId2 :formId3
и т.д.).
<p:commandButton ... process="@(form)" partialSubmit="true" />
Это работает, потому что partialSubmit="true"
готовит process="xxx"
на стороне клиента, а не на стороне сервера. Другими словами, вместо отправки всей закрывающей формы с сервера на клиент и последующей обработки указанных входов, он отправляет только указанные входы от сервера к клиенту, а затем обрабатывает их все. Обратите внимание, что если partialSubmit
отсутствует или установлен на false
, он все равно будет отправлять только прилагаемую форму. На это неправильное поведение не следует полагаться. Они могут рано или поздно исправить это неправильное поведение на своей стороне.