Respostas:
<f:viewParam>
:Define o valor apenas durante a fase de atualização dos valores do modelo (desde que se estenda UIInput
).
O valor definido não está disponível durante @PostConstruct
, então você precisa de um adicional <f:event type="preRenderView" listener="#{bean.init}" />
dentro do <f:metadata>
para fazer a inicialização / pré-carregamento com base nos valores definidos. Desde o JSF 2.2 você pode usar <f:viewAction>
para isso.
Permite conversão / validação aninhada <f:converter>
e <f:validator>
mais refinada. Até mesmo um <h:message>
pode ser anexado.
Pode ser incluído como string de consulta GET usando o includeViewParams
atributo de <h:link>
ou o includeViewParams=true
parâmetro de solicitação em qualquer URL.
Pode ser usado em um @RequestScoped
bean, mas requer que o bean o seja @ViewScoped
se você quiser que os parâmetros de visualização sobrevivam a quaisquer falhas de validação causadas por formulários incluídos na visualização, caso contrário, você precisa reter manualmente todos os parâmetros de solicitação para as solicitações subsequentes <f:param>
no comando componentes.
Exemplo :
<f:metadata>
<f:viewParam id="user_id" name="id" value="#{bean.user}"
required="true" requiredMessage="Invalid page access. Please use a link from within the system."
converter="userConverter" converterMessage="Unknown user ID."
/>
</f:metadata>
<h:message for="user_id" />
com
private User user;
e um @FacesConverter("userConverter")
. Invocar a página por http://example.com/context/user.xhtml?id=123 passará o id
parâmetro pelo conversor e definirá o User
objeto como uma propriedade de bean.
@ManagedProperty
:Define o valor imediatamente após a construção do bean.
O valor definido está disponível durante o @PostConstruct
qual permite uma inicialização / pré-carregamento fácil de outras propriedades com base no valor definido.
Não permite conversão / validação declarativa em vista.
A propriedade gerenciada de #{param}
não é permitida em beans com um escopo mais amplo do que o escopo de solicitação, portanto, o bean deve ser @RequestScoped
.
Se você confiar que uma propriedade gerenciada estará #{param}
presente nas solicitações POST subsequentes, será necessário incluí-la <f:param>
nos UICommand
componentes.
Exemplo :
@ManagedProperty("#{param.id}")
private Long id;
private User user;
@EJB
private UserService userService;
@PostConstruct
public void init() {
user = userService.find(id);
}
Mas você mesmo precisa gerenciar a validação sempre que user
estiver null
mexendo com FacesContext#addMessage()
ou algo assim.
Você pode usar ambos quando @PostConstruct
e includeViewParams
forem obrigatórios. Você só não poderá mais aplicar conversão / validação de baixa granularidade.
@ManagedProperty
um parâmetro de solicitação impossível.
<f:event type="preRenderView">
ou no próximo JSF 2.2 <f:viewAction>
.
2 outras diferenças:
@ManagedProperty
é utilizável apenas com beans gerenciados por JSF, não com beans gerenciados por CDI ( @Named
);
<f:viewParam>
funciona apenas com parâmetros de solicitações GET.