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
, он все равно будет отправлять только прилагающуюся форму. На это плохое поведение не следует полагаться. Они могут исправить это неправильное поведение на своей стороне рано или поздно.
Смотри также: