101 votes

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

Quelle est la différence entre définir les paramètres de vue comme ceci:

 <f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
 

Et en définissant la propriété dans le ManagedBean comme ceci:

 @ManagedProperty(value = "#{param.id}")
private Integer id;
 

148voto

BalusC Points 498232

<f:viewParam>:

  • Définit la valeur au cours du modèle de mise à jour des valeurs de phase (puisqu'il s'étend UIInput).

  • La valeur définie n'est pas disponible pendant l' @PostConstruct, de sorte que vous besoin d'un supplément de <f:event type="preRenderView" listener="#{bean.init}" /> à l'intérieur de l' <f:metadata> faire initialisation/préchargement basée sur l'ensemble des valeurs. Depuis JSF 2.2 vous pouvez utiliser <f:viewAction> à la place.

  • Permet imbriquée <f:converter> et <f:validator> pour les plus fines de conversion et de validation. Même un <h:message> peut être fixé.

  • Peut être inclus en tant que chaîne de requête GET à l'aide de includeViewParams attribut de l' <h:link> ou includeViewParams=true paramètre de la requête dans l'URL.

  • Peut être utilisé sur un @RequestScoped haricot, mais il exige de la fève à être @ViewScoped si vous souhaitez que l'affichage des paramètres de survivre à toute validation de défaillances causées par des formes enfermé dans la vue, sinon, vous devez manuellement conserver tous les paramètres de la demande pour les demandes suivantes en <f:param> à la commande des composants.

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"). Invoquant la page par http://example.com/context/user.xhtml?id=123 va passer l' id paramètre par le biais du convertisseur et de l'ensemble de l' User objet comme un haricot de la propriété.


@ManagedProperty:

  • Définit la valeur immédiatement après l'haricot de construction.

  • La valeur de consigne est disponible pendant l' @PostConstruct qui permet l'initialisation/préchargement d'autres propriétés sur la base de la valeur de consigne.

  • N'autorise pas pour déclaratif de conversion/de validation en vue.

  • Propriété de gestion d' #{param} n'est pas autorisée sur les haricots avec une portée plus large que la demande de la portée, de sorte que le haricot est nécessaire pour être @RequestScoped.

  • Si vous vous fiez à une propriété gérée de #{param} d'être présent dans le billet suivant les demandes, alors vous avez besoin de l'inclure en tant que <f:param> dans la 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 avez à gérer la validation de vous-même chaque fois qu' user est null par se tripoter FacesContext#addMessage() ou quelque chose.


Vous pouvez les utiliser à la fois lorsque les deux @PostConstruct et includeViewParams sont obligatoires. Vous ne serez pas en mesure d'appliquer fine de conversion et de validation plus.


Voir aussi:

6voto

user1643352 Points 196

2 autres différences:

  • @ManagedProperty n'est utilisable qu'avec les haricots gérés par JSF, pas avec les haricots gérés par CDI ( @Named );
  • <f:viewParam> ne fonctionne qu'avec les paramètres des demandes GET.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X