web-dev-qa-db-fra.com

Pour quoi <f: métadonnées>, <f: viewParam> et <f: viewAction> peuvent-ils être utilisés?

Quelqu'un peut-il préciser comment nous pouvons utiliser en général, ou dans un exemple concret, cet extrait de code?

<f:metadata>
    <f:viewParam id="id" value="#{bean.id}" />
    <f:viewAction action="#{bean.init}" />
</f:metadata>
142
Hanynowsky

Traiter les paramètres GET

Le <f:viewParam> gère la configuration, la conversion et la validation des paramètres GET. C'est comme le _<h:inputText>_, mais ensuite pour les paramètres GET.

L'exemple suivant

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

fait essentiellement ce qui suit:

  • Récupère la valeur du paramètre de la requête par son nom id.
  • Convertissez-le et validez-le si nécessaire (vous pouvez utiliser les attributs required, validator et converter et imbriquer un _<f:converter>_ et un _<f:validator>_ comme avec _<h:inputText>_)
  • Si la conversion et la validation réussissent, définissez-le comme une propriété de bean représentée par la valeur _#{bean.id}_ ou si l'attribut value est absent, définissez-le comme attribut de requête sur le nom id afin qu'il soit disponible par _#{id}_ dans la vue.

Ainsi, lorsque vous ouvrez la page en tant que _foo.xhtml?id=10_, la valeur du paramètre _10_ est définie dans le bean de cette manière, juste avant le rendu de la vue.

En ce qui concerne la validation, l'exemple suivant définit le paramètre sur _required="true"_ et n'autorise que les valeurs comprises entre 10 et 20. Tout échec de validation entraînera l'affichage d'un message.

_<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
</f:metadata>
<h:message for="id" />
_

Action commerciale sur les paramètres GET

Vous pouvez utiliser le <f:viewAction> pour cela.

_<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
<h:message for="id" />
_

avec

_public void onload() {
    // ...
}
_

Le _<f:viewAction>_ est cependant nouveau depuis JSF 2.2 (le _<f:viewParam>_ existe déjà depuis JSF 2.0). Si vous ne pouvez pas mettre à niveau, alors votre meilleur pari utilise <f:event> .

_<f:event type="preRenderView" listener="#{bean.onload}" />
_

Ceci est toutefois appelé à chaque demande . Vous devez vérifier explicitement si la demande n'est pas une publication:

_public void onload() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}
_

Si vous souhaitez également ignorer les cas "Conversion/Validation failed", procédez comme suit:

_public void onload() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
        // ...
    }
}
_

Utiliser _<f:event>_ de cette façon est essentiellement une solution de contournement ou un hack, c’est exactement pourquoi le _<f:viewAction>_ a été introduit dans JSF 2.2.


Passer les paramètres de vue à la vue suivante

Vous pouvez "transmettre" les paramètres de vue dans les liens de navigation en définissant l'attribut includeViewParams sur true ou en ajoutant un paramètre de demande _includeViewParams=true_.

_<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">
_

qui génère avec l'exemple ci-dessus _<f:metadata>_ essentiellement le lien suivant

_<a href="next.xhtml?id=10">
_

avec la valeur de paramètre d'origine.

Cette approche uniquement nécessite que _next.xhtml_ possède également un _<f:viewParam>_ sur le même paramètre, sinon il ne sera pas transmis.


Utiliser les formulaires GET dans JSF

_<f:viewParam>_ peut également être utilisé en combinaison avec des formulaires GET "plain HTML".

_<f:metadata>
    <f:viewParam id="query" name="query" value="#{bean.query}" />
    <f:viewAction action="#{bean.search}" />
</f:metadata>
...
<form>
    <label for="query">Query</label>
    <input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" />
    <input type="submit" value="Search" />
    <h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
     ...
</h:dataTable>
_

Avec fondamentalement ce bean _@RequestScoped_:

_private String query;
private List<Result> results;

public void search() {
    results = service.search(query);
}
_

Notez que le _<h:message>_ est pour le _<f:viewParam>_, pas le HTML simple _<input type="text">_! Notez également que la valeur d'entrée affiche _#{param.query}_ lorsque _#{bean.query}_ est vide, car la valeur soumise ne s'afficherait pas du tout en cas d'erreur de validation ou de conversion. Veuillez noter que cette construction n'est pas valide pour les composants d'entrée JSF (elle le fait déjà "sous le capot").


Voir également:

281
BalusC