Quelle est la différence entre la définition de paramètres d'affichage comme ceci:
<f:metadata>
<f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
Et définir la propriété dans le ManagedBean comme ceci:
@ManagedProperty(value = "#{param.id}")
private Integer id;
<f:viewParam>
:Définit la valeur uniquement pendant la phase de mise à jour des valeurs du modèle (car elle s'étend UIInput
).
La valeur définie n'est pas disponible pendant @PostConstruct
, vous avez donc besoin d'un <f:event type="preRenderView" listener="#{bean.init}" />
supplémentaire à l'intérieur du <f:metadata>
pour effectuer l'initialisation/préchargement en fonction des valeurs définies. Depuis JSF 2.2, vous pouvez utiliser <f:viewAction>
Pour cela à la place.
Permet l'imbrication <f:converter>
et <f:validator>
pour une conversion/validation plus fine. Même un <h:message>
peut être attaché.
Peut être inclus en tant que chaîne de requête GET en utilisant l'attribut includeViewParams
de <h:link>
ou includeViewParams=true
Paramètre de requête dans n'importe quelle URL.
Peut être utilisé sur un bean @RequestScoped
, mais il nécessite que le bean soit @ViewScoped
si vous voulez que les paramètres d'affichage survivent à toute validation échecs causés par les formulaires inclus dans la vue, sinon vous devez conserver manuellement tous les paramètres de demande pour les demandes suivantes par <f:param>
dans les composants de la commande.
Exemple :
<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" />
avec
private User user;
et un @FacesConverter("userConverter")
. L'appel de la page par http://example.com/context/user.xhtml?id=12 passera le paramètre id
via le convertisseur et définira l'objet User
comme propriété de bean.
@ManagedProperty
:Définit la valeur immédiatement après la construction du bean.
La valeur définie est disponible pendant @PostConstruct
qui permet une initialisation/préchargement facile d'autres propriétés en fonction de la valeur définie.
Ne permet pas la conversion/validation déclarative en vue.
La propriété gérée de #{param}
N'est pas autorisée sur les beans avec une portée plus large que la portée de la demande, donc le bean doit être @RequestScoped
.
Si vous comptez sur une propriété gérée de #{param}
Présente dans les requêtes POST POST) suivantes, vous devez l'inclure en tant que <f:param>
Dans le UICommand
Composants.
Exemple :
@ManagedProperty("#{param.id}")
private Long id;
private User user;
@EJB
private UserService userService;
@PostConstruct
public void init() {
user = userService.find(id);
}
Mais vous devez gérer la validation vous-même chaque fois que user
est null
en jouant avec FacesContext#addMessage()
ou quelque chose.
Vous pouvez les utiliser tous les deux lorsque @PostConstruct
et includeViewParams
sont obligatoires. Vous ne pourrez plus appliquer de conversion/validation à granularité fine.
2 autres différences:
@ManagedProperty
est utilisable uniquement avec les beans gérés par JSF, pas avec les beans gérés par CDI (@Named
); <f:viewParam>
ne fonctionne qu'avec les paramètres des requêtes GET.