Когда использовать preRenderView против viewAction?

Когда следует использовать событие preRenderView для инициализации данных для страницы по сравнению с использованием viewAction? Они равны в использовании и имеют ли они одинаковый эффект?

Событие preRenderView

<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

или же

viewAction

<f:metadata>
  <f:viewAction action="#{myBean.initialize}"/>
</f:metadata>

1 ответ

Решение

На практике их можно использовать для достижения того же эффекта, но viewAction (новый с JSF2.2) имеет следующие улучшения:

  1. onPostback: viewAction поставляется с этим атрибутом, который позволяет вам указать, хотите ли вы, чтобы действие выполнялось при обратной передаче в то же представление (то есть при обновлении страницы или при нажатии кнопки и т. д.). По умолчанию false так что вам даже не нужно указывать это, если вам не нужно. Для достижения того же эффекта с preRenderView, тебе понадобиться

     <f:metadata>
         <f:event type="preRenderView" rendered="#{facesContext.postBack}" listener="#{myBean.initialize}"/>
     </f:metadata>
    
  2. phase: этот атрибут позволяет указать, что действие будет выполняться во время определенной фазы JSF. По умолчанию INVOKE_APPLICATION, но все остальные идентификаторы фазы JSF действительны здесь.

  3. if: Этот атрибут позволяет вам предоставить выражение значения, которое оценивает логический результат. Действие просмотра будет выполнено только в результате этого выражения.

  4. immediate: Этот атрибут теперь дает возможность viewAction быть выполненным во время APPLY_REQUEST_VALUES фаза (в отличие от значения по умолчанию INVOKE_APPLICATION фаза), позволяя ему вести себя как обычный UIComponent

В целом, viewAction это более чистый подход к выполнению команд вида.

Другие вопросы по тегам