Когда использовать 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) имеет следующие улучшения:

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

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

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

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

В целом, viewAction - это более чистый дизайн для выполнения команд представления.