Что действительно нужно делать <f: ajax execute = "@all" >? Это ОТПРАВЛЯЕТ только прилагаемую форму

Извините, если я толстый, но что такое execute = "@all" в теге f: ajax, который действительно должен был делать? Я ожидал, что он представит все элементы на странице, но, похоже, POST использует только значения в прилагаемой форме, а не все формы на странице.

Например

<h:body>
    <h:form id="form1">
        Input1/Form1 <h:inputText id="testinput" value="#{testBean.input1}" />                              
    </h:form>

    <h:form id="form2">
        Input2/form2 <h:inputText id="testinput2" value="#{testBean.input2}" />                             
        <h:commandButton value="Ok" actionListener="#{testBean.al}">
        <f:ajax execute="@all" />
        </h:commandButton>
    </h:form>
</h:body>

Только клик только по форме2.

Использование mojarra 2.0.2..

Ответы

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

См. также:

Ответ 2

Вот цитата из JavaServer Faces 2.0 - полная ссылка, стр. 352:

Ключи execute и render принимают набор специальных ключевых слов, каждый со значением, указанным в этой таблице:

@all (используя execute): каждый компонент на странице отправлен и обработан. Это полезно, если вы хотите сделать полностраничную отправку.

Я думаю, что это совершенно ясно указывает, что поля из всех форм должны быть отправлены с запросом AJAX.

Однако даже с Mojarra 2.0.3 этого не происходит. Несмотря на содержимое атрибута execute (если вы ставите список форм или @all), только входящая форма получает свои "поля". Так что это похоже на ошибку. Я поднимаю вопрос об этом, если нет изменений в представлениях?

Ответ 3

Это должно быть execute = ": form1 form2" (если у вас есть разделитель по умолчанию), но в любом случае нет, это не так. Он отправляет только второй.

Если вы поместите @all в первую форму, он отправит только первый. По крайней мере, на Safari 5/Firefox 3.6.3 в любом случае. Я думаю, нужно было бы посмотреть на javascript mojarra, чтобы узнать больше.

Ответ 4

Вы пробовали это?

<f:ajax execute="form1 form2" />

Он отправляет данные обеих форм, если вы их явно упоминаете?

AFAIK, вы правы: @all представляет всю страницу.