<p:commandXxx process>
<p:ajax process>
<f:ajax execute>
process
Атрибут на стороні сервера і може вплинути тільки UIComponent
S , реалізують EditableValueHolder
(поля введення) або ActionSource
(командні поля). process
Атрибут повідомляє JSF, використовуючи розділений пробілами список ідентифікаторів клієнтів, які компоненти точно повинні бути оброблені в протягом всього життєвого циклу JSF після (часткового) відправки форми.
Потім JSF буде застосовувати значення запиту (знаходячи параметр запиту HTTP на основі власного ідентифікатора клієнта компонента, а потім встановлюючи його як подане значення у випадку EditableValueHolder
компонентів, або в черзі нового ActionEvent
у випадку ActionSource
компонентів), здійснювати перетворення, перевірку та оновлення модельних значень ( EditableValueHolder
лише компоненти) і нарешті викликати чергу ActionEvent
( ActionSource
лише компоненти). JSF пропустить обробку всіх інших компонентів, які не охоплені process
атрибутом. Також компоненти, rendered
атрибут яких оцінюється false
під час фази значень запиту застосувати, також будуть пропущені як частина захисту від підроблених запитів.
Зауважте, що для ActionSource
компонентів (таких як <p:commandButton>
) дуже важливо, щоб ви також включали сам компонент в process
атрибут, особливо якщо ви маєте намір викликати дії, пов'язані з компонентом. Отже нижченаведений приклад, який має намір обробляти лише певні компоненти входу, коли викликається певний компонент команди, не працює:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="foo" action="#{bean.action}" />
Це буде лише процес, #{bean.foo}
а не той #{bean.action}
. Вам також потрібно буде включити сам компонент команди:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@this foo" action="#{bean.action}" />
Або, як ви, очевидно, з’ясували, використовуючи, @parent
якщо вони є єдиними компонентами, які мають спільний батьків:
<p:panel><!-- Type doesn't matter, as long as it's a common parent. -->
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@parent" action="#{bean.action}" />
</p:panel>
Або, якщо вони обидва є єдиними компонентами батьківського UIForm
компонента, ви також можете використовувати @form
:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@form" action="#{bean.action}" />
</h:form>
Іноді це небажано, якщо форма містить більше вхідних компонентів, які ви хочете пропустити при обробці, частіше, ніж у випадках, коли ви хочете оновити інший компонент (и) вводу або деякий розділ інтерфейсу на основі поточного компонента введення в метод слухача ajax. Ви не хочете, щоб помилки перевірки інших вхідних компонентів не дозволяли виконувати метод слухача ajax.
Тоді є @all
. Це не робить особливого ефекту в process
атрибуті, а лише в update
атрибуті. А process="@all"
поводиться точно так само, як process="@form"
. HTML так чи інакше не підтримує надсилання декількох форм.
Існує, до речі, також, @none
що може бути корисним у випадку, якщо вам абсолютно нічого не потрібно обробляти, а лише хочете оновити деякі конкретні частини за допомогою update
, зокрема тих розділів, вміст яких не залежить від поданих значень або дій слухачів.
Слід зазначити, що process
атрибут не впливає на корисний навантаження HTTP запиту (кількість параметрів запиту). Значить, на поведінку HTML за замовчуванням при надсиланні "всього", що міститься в представленні HTML <h:form>
заповіту, це не вплине. Якщо у вас є велика форма і ви хочете зменшити навантаження HTTP-запиту лише на ці абсолютно необхідні в обробці, тобто лише ці, які охоплені process
атрибутом, тоді ви можете встановити partialSubmit
атрибут в компонентах PrimeFaces Ajax як у <p:commandXxx ... partialSubmit="true">
або <p:ajax ... partialSubmit="true">
. Ви також можете налаштувати це "глобально", відредагувавши web.xml
та додавши
<context-param>
<param-name>primefaces.SUBMIT</param-name>
<param-value>partial</param-value>
</context-param>
Крім того, ви також можете використовувати <o:form>
OmniFaces 3.0+, який за замовчуванням застосовує таку поведінку.
Стандартний JSF, еквівалентний специфічній PrimeFaces, process
походить execute
від <f:ajax execute>
. Він поводиться точно так само, за винятком того, що він не підтримує розділену комою рядок, в той час як PrimeFaces це робить (хоча я особисто рекомендую просто дотримуватися конвенції, розділеної пробілом), а також @parent
ключового слова. Також може бути корисно знати, що <p:commandXxx process>
за замовчуванням до @form
, <p:ajax process>
а <f:ajax execute>
за замовчуванням - @this
. Нарешті, також корисно знати, що process
підтримує так звані "селектори PrimeFaces", див. Також Як працюють PrimeFaces селектори, як у update = "@ (. MyClass)"?
<p:commandXxx update>
<p:ajax update>
<f:ajax render>
update
Атрибут на стороні клієнта і може вплинути на HTML представлення всіх UIComponent
с. update
Атрибут повідомляє JavaScript (один відповідає за обробку Ajax запит / відповідь), використовуючи розділений пробілами список ідентифікаторів клієнтів, які в частині необхідності дерева HTML DOM буде оновлюватися по мірі відповіді на формі представити.
Потім JSF підготує правильну відповідь на аякс для цього, що містить лише запитувані частини для оновлення. JSF буде пропускати всі інші компоненти, які не охоплені update
атрибутом у відповіді на ajax, тим самим залишаючи невеликим корисне навантаження відповіді. Також компоненти, чий rendered
атрибут оцінюється false
під час фази відповіді візуалізації, будуть пропущені. Зауважте, що хоча він і повернеться true
, JavaScript не може оновити його у дереві HTML DOM, якщо він був спочатку false
. Вам потрібно буде обгорнути його або оновити його батьківський натомість. Дивіться також оновлення / рендер Ajax не працює на компоненті, який надав атрибут .
Зазвичай ви хочете оновити лише ті компоненти, які дійсно потрібно " оновити " на стороні клієнта після (часткової) форми надсилання. Наведений нижче приклад оновлює всю батьківську форму через @form
:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" required="true" />
<p:message id="foo_m" for="foo" />
<p:inputText id="bar" value="#{bean.bar}" required="true" />
<p:message id="bar_m" for="bar" />
<p:commandButton action="#{bean.action}" update="@form" />
</h:form>
(зауважте, що process
атрибут пропущено як @form
уже встановлений за замовчуванням )
Хоча це може спрацювати нормально, оновлення компонентів вводу та команди в цьому конкретному прикладі непотрібне. Якщо ви не зміните значення моделі foo
та метод bar
внутрішнього action
використання (що, в свою чергу, буде неінтуїтивним в перспективі UX), немає сенсу їх оновлювати. Компоненти повідомлення є єдиними, які дійсно потребують оновлення:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" required="true" />
<p:message id="foo_m" for="foo" />
<p:inputText id="bar" value="#{bean.bar}" required="true" />
<p:message id="bar_m" for="bar" />
<p:commandButton action="#{bean.action}" update="foo_m bar_m" />
</h:form>
Однак це стає нудним, коли у вас їх багато. Це одна з причин існування селекторів PrimeFaces. Ці компоненти повідомлень мають у створеному HTML виведенні загальний клас стилів ui-message
, тому слід також зробити наступне:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" required="true" />
<p:message id="foo_m" for="foo" />
<p:inputText id="bar" value="#{bean.bar}" required="true" />
<p:message id="bar_m" for="bar" />
<p:commandButton action="#{bean.action}" update="@(.ui-message)" />
</h:form>
(Зверніть увагу , що ви повинні тримати ідентифікатори на компонентах повідомлень, в іншому випадку @(...)
не працюватиме! Знову ж , подивіться Як PrimeFaces селектор , як в оновленні = «@ (. MyClass)» робота? Для деталей)
@parent
Оновлює тільки батьківський компонент, який , таким чином , охоплює поточний компонент і всі брати і сестри та їхні діти. Це корисніше, якщо ви розділили форму в здорових групах з кожною відповідальністю. Ці @this
оновлення, очевидно, тільки поточний компонент. Зазвичай це потрібно лише тоді, коли вам потрібно змінити один із власних HTML-атрибутів компонента в методі дії. Напр
<p:commandButton action="#{bean.action}" update="@this"
oncomplete="doSomething('#{bean.value}')" />
Уявіть, що oncomplete
потреби в роботі з тим, value
що змінено action
, тоді ця конструкція не працювала, якби компонент не оновлювався, з простої причини, яка oncomplete
є частиною генерованого HTML-виводу (і, таким чином, всі вирази EL там оцінюються під час надання відповіді).
@all
Оновлює весь документ, який повинен використовуватися з обережністю. Зазвичай, ви хочете використовувати для цього справжній GET-запит або простою посиланням ( <a>
або <h:link>
) або перенаправленням після POST від ?faces-redirect=true
або ExternalContext#redirect()
. По process="@form" update="@all"
суті , має точно такий же ефект, як і безвідмовна (неповна) подача. У всій моїй кар'єрі JSF єдиний розумний випадок використання, з яким я стикався, - @all
це відображення сторінки помилок у повному обсязі, якщо виняток виникає під час запиту на ajax. Дивіться також Який правильний спосіб поводження з винятками JSF 2.0 для компонентів AJAXified?
Стандартний JSF, еквівалентний специфічній PrimeFaces, update
походить render
від <f:ajax render>
. Він поводиться точно так само, за винятком того, що він не підтримує розділену комою рядок, в той час як PrimeFaces це робить (хоча я особисто рекомендую просто дотримуватися конвенції, розділеної пробілом), а також @parent
ключового слова. І те, update
і render
за замовчуванням @none
(тобто "нічого").
Дивитися також: