Quando usar f: viewAction / preRenderView versus PostConstruct?

Quando alguém deve usar o evento f:viewAction ou preRenderView para inicializar dados para uma página versus usar a anotação @PostConstruct ? É a razão para usar um ou outro baseado no tipo de escopo do backing bean, por exemplo: Se o backing bean for @RequestScoped , a opção de usar f:viewAction ou preRenderView sobre @PostConstruct para inicializar o bean de apoio antes da renderização? a visão ser irrelevante, pois os dois resultariam no mesmo efeito?

f: viewAction ou preRenderView

    
    

ou

@PostConstruct

 public class MyBean { @PostConstruct public void initialize() { } } 

    Quando alguém deve usar o evento f: viewAction ou preRenderView para inicializar os dados de uma página usando a anotação @PostConstruct?

    Use o quando quiser executar um método antes de o HTML ser renderizado. Isso é particularmente útil se você quiser executar ações com base nos valores do modelo definidos por durante a fase de atualização dos modelos de modelo. Ou seja, eles não estão disponíveis no momento em que o @PostConstruct é executado. No JSF 2.0 / 2.1, essa tag não existia e você tem que usar a solução alternativa preRenderView .

    Se o bean auxiliar for @RequestScoped, eles efetivamente farão exatamente a mesma coisa? (e então é a escolha do desenvolvedor? (@PostConstruct parece “mais limpo”).

    Não, eles definitivamente não fazem efetivamente a mesma coisa. O @PostConstruct tem a @PostConstruct de executar ações diretamente após a construção e configuração de todas as dependencies injetadas e propriedades gerenciadas, como @EJB , @Inject , @ManagedProperty , etc. Ou seja, as dependencies injetadas não estão disponíveis dentro do construtor do bean. Isso será executado apenas uma vez por visualização, session ou aplicativo quando o bean for visualizado, com session ou com escopo de aplicativo. O é, por padrão, chamado apenas na solicitação GET inicial, mas pode onPostback="true" ser configurado através do onPostback="true" para ser chamado em solicitações de postback. O evento preRenderView é invocado em todas as solicitações HTTP (sim, isso também inclui solicitações ajax!).

    Resumido, use @PostConstruct se você quiser executar ações em dependencies injetadas e propriedades gerenciadas que são definidas por @EJB , @Inject , @ManagedProperty , etc durante a construção do bean. Use se você também quiser executar ações nas propriedades definidas por . Se você ainda estiver no JSF 2.0 / 2.1, use preRenderView vez de . Você pode, se necessário, adicionar uma verificação no FacesContext#isPostback() para executar a ação preRenderView somente na solicitação inicial.

    Veja também:

    • O que pode ser usado para , e ?
    • ViewParam vs @ManagedProperty (value = “# {param.id}”)
    • É possível desativar o ouvinte f: event type = “preRenderView” no postback?

    Você precisa inicializar as propriedades do bean gerenciado? -> Então, use @ PostConstruct Caso contrário, você precisa trabalhar com params passados ​​de outra view? -> Então, use ” preRenderView