web-dev-qa-db-fra.com

ViewParam vs @ManagedProperty (value = "# {param.id}")

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;
95
ehsun7b

<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.


Voir également:

142
BalusC

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.
5
user1643352