Quando se deve usar o evento f: viewAction ou preRenderView para inicializar dados para uma página em versos usando a anotação @PostConstruct?
Use <f:viewAction>
quando quiser executar um método antes de o HTML ser renderizado. Isso é particularmente útil se você deseja executar ações com base nos valores do modelo definidos por <f:viewParam>
durante a fase de atualização dos valores do modelo. Ou seja, eles não estão disponíveis no momento da @PostConstruct
execução. No JSF 2.0 / 2.1, essa tag não existia e você deve usar a preRenderView
solução alternativa.
Se o bean de apoio for @RequestScoped, eles fazem exatamente a mesma coisa? (e então fica a critério do desenvolvedor? (@PostConstruct parece "mais limpo").
Não, eles definitivamente não fazem a mesma coisa. A @PostConstruct
é intented para executar acções directamente após a construção do feijão e configuração de todas as dependências injectados e propriedades de gestão, tais como @EJB
, @Inject
, @ManagedProperty
, etc. Nomeadamente, as dependências injectados não estão disponíveis dentro construtor do feijão. Assim, ele será executado apenas uma vez por visualização, sessão ou aplicativo quando o bean tiver o escopo de visualização, sessão ou aplicativo. O <f:viewAction>
é, por padrão, chamado apenas na solicitação GET inicial, mas pode onPostback="true"
ser configurado por meio do atributo para ser chamado também nas solicitações de postback. O preRenderView
evento é invocado em cada solicitação HTTP (sim, isso também inclui solicitações ajax!).
Resumida, o uso @PostConstruct
se você quiser executar ações em dependências injetadas e propriedades gerenciadas que são definidas por @EJB
, @Inject
, @ManagedProperty
, etc durante a construção do feijão. Use <f:viewAction>
se também quiser realizar ações nas propriedades definidas por <f:viewParam>
. Se você ainda estiver no JSF 2.0 / 2.1, use em preRenderView
vez de <f:viewAction>
. Você pode, se necessário, adicionar uma verificação FacesContext#isPostback()
para executar a preRenderView
ação apenas na solicitação inicial.
Veja também:
Você precisa inicializar as propriedades do bean gerenciado? -> Então, use @ PostConstruct Caso contrário, você precisa trabalhar com parâmetros passados de outra visão? -> Em seguida, use " preRenderView "
fonte