Понимание процесса/обновления PrimeFaces и атрибутов JSF f:ajax execute/render

что именно process и update в основе схемы PrimeFaces p:commandXxx компоненты и execute и render на f:ajax тег?

что работает во время проверки? Что делает update атрибут делает, а не обновляет значение для компонента из задней части? Do process значение атрибута привязки к модели? Что именно делать @this, @parent, @all и @form в обоих атрибутами?

приведенный ниже пример работает нормально, но я немного запутался в basic концепция.

<p:commandButton process="@parent"
                 update="@form"
                 action="#{bean.submit}" 
                 value="Submit" />

3 ответов


<p:commandXxx process> <p:ajax process> <f:ajax execute>

на process атрибут находится на стороне сервера и может влиять только на UIComponents реализация EditableValueHolder (поля ввода) или ActionSource (команда поля). The process атрибут сообщает JSF, используя разделенный пробелом список идентификаторов клиента, какие компоненты точно должны быть обработаны через весь жизненный цикл JSF при (частичной) форме отправки.

JSF затем применит запрос значения (поиск параметра HTTP-запроса на основе собственного идентификатора клиента компонента, а затем либо установка его в качестве отправленного значения в случае EditableValueHolder компоненты или очередь новый ActionEvent в случае ActionSource компоненты), выполнить преобразование, проверку и обновление значений модели (EditableValueHolder только компоненты) и, наконец, вызовите queued ActionEvent (. Также, компоненты которого значение 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="@all" ведет себя точно так же, как process="@form". HTML не поддерживает отправку нескольких форм одновременно.

есть, кстати, и @none что может быть полезно в случае, если вы абсолютно не нужно ничего обрабатывать, но только хотите обновить некоторые конкретные части через update, особенно те разделы чье содержимое не зависит от отправленных значений или прослушивателей действий.

следует отметить, что и нет влияние на полезную нагрузку HTTP-запроса (количество параметров запроса). Значение, поведение HTML по умолчанию отправки "всего", содержащегося в HTML-представлении <h:form> не будут затронуты. Если у вас большая форма и вы хотите уменьшить полезную нагрузку HTTP-запроса только до этих абсолютно необходимых в обработка, то есть только эти охвачены process атрибут, то вы можете установить partialSubmit атрибут в компонентах Ajax PrimeFaces, как в <p:commandXxx ... partialSubmit="true"> или <p:ajax ... partialSubmit="true">. Кроме того, вы также можете использовать <o:form> OmniFaces 3.0+, который по умолчанию для этого поведения.

стандартный JSF на эквивалентной основе схемы PrimeFaces конкретные process is execute С <f:ajax execute>. Он ведет себя точно так же, за исключением того, что он не поддерживает строку, разделенную запятыми, в то время как PrimeFaces one делает (хотя я лично рекомендую просто придерживаться Конвенции с разделением пространства), ни @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 всех UIComponents. The update атрибут сообщает JavaScript (тот, который отвечает за обработку запроса/ответа ajax), используя разделенный пробелом список идентификаторов клиентов, какие части в дереве HTML DOM должны быть обновлены в ответ на отправку формы.

JSF затем подготовит правильный ответ ajax для этого, содержащий только запрошенные части для обновление. JSF пропустит все другие компоненты, которые не охвачены update атрибут в ответе ajax, тем самым сохраняя полезную нагрузку ответа небольшой. Кроме того, компоненты, чьи значение false во время рендеринга фаза ответа будет пропущена. Обратите внимание, что даже если он вернется true, JavaScript не может обновить его в дереве HTML DOM, если он был изначально false. Вам нужно будет обернуть его или обновить его родителя. См. также Ajax update/render не работает на компоненте, который отрисовал атрибут.

обычно вы хотите обновить только компоненты которого действительно необходимо "обновить"на стороне клиента при (частичной) форме отправки. В приведенном ниже примере обновляется вся родительская форма через @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, как в update="@(.myClass) " работа? за деталь)

на @parent обновляет только родительский компонент, который, таким образом, охватывает текущий компонент и всех братьев и сестер и свой ребенок. Это более полезно, если вы разделили форму на разумные группы с каждой своей собственной ответственностью. The @this обновления, очевидно, только текущий компонент. Обычно это необходимо только тогда, когда вам нужно изменить один из собственных атрибутов HTML компонента в методе действия. Е. Г.

<p:commandButton action="#{bean.action}" update="@this" 
    oncomplete="doSomething('#{bean.value}')" />

представь, что oncomplete необходимо работать с value что изменилось в action, тогда эта конструкция не работала бы, если компонент не обновляется, по той простой причине, что oncomplete является частью сгенерированного вывода HTML (и, таким образом, все выражения EL там оцениваются во время ответа рендеринга).

на @all обновляет весь документ, который следует использовать с осторожностью. Как правило, вы хотите использовать true GET-запрос для этого либо по простой ссылке (<a> или <h:link>) или редирект после пост ?faces-redirect=true или ExternalContext#redirect(). В эффектах,process="@form" update="@all" имеет точно такой же эффект, как и не-ajax (неполный) submit. В моем вся карьера JSF, единственный разумный вариант использования, с которым я столкнулся для @all должен отображать страницу ошибки полностью в случае возникновения исключения во время запроса ajax. См. также каков правильный способ борьбы с исключениями JSF 2.0 для AJAXified компонентов?

стандартный JSF на эквивалентной основе схемы PrimeFaces конкретные update is render с <f:ajax render>. Он ведет себя точно так же, за исключением того, что он не поддерживает строку, разделенную запятыми, в то время как PrimeFaces один делает (хотя я лично рекомендую просто придерживаться разделенного пространством соглашения), ни @parent ключевое слово. Оба!--35--> и render по умолчанию @none (то есть "ничего").


Читайте также:


Если вам трудно запомнить значения по умолчанию (я знаю, что у меня есть...) вот краткая выдержка из ответа BalusC это:

Component    | Submit          | Refresh
------------ | --------------- | --------------
f:ajax       | execute="@this" | render="@none"
p:ajax       | process="@this" | update="@none"
p:commandXXX | process="@form" | update="@none"

по процессу (в спецификации JSF это называется execute) вы говорите JSF ограничить обработку компонентом, который указан, все остальное просто игнорируется.

update указывает, какой элемент будет обновлен, когда сервер ответит на ваш запрос.

@all : каждый компонент обрабатывается договора.

@это: запрашивающий компонент с атрибутом execute обработано / визуализировано.

@form: обрабатывается/визуализируется форма, содержащая запрашивающий компонент.

@parent: обрабатывается/визуализируется родитель, содержащий запрашивающий компонент.

с помощью Primefaces вы даже можете использовать селекторы JQuery, проверьте этот блог:http://blog.primefaces.org/?p=1867