Question

Quelqu'un peut-il clarifier comment nous pouvons utiliser cet extrait de code en général ou dans le monde réel?

<f:metadata>
    <f:viewParam id="id" value="#{bean.id}" />
    <f:viewAction action="#{bean.init}" />
</f:metadata>
Était-ce utile?

La solution

Paramètres GET du processus

Le <f:viewParam> gère le paramétrage, 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:

  • Obtenez la valeur du paramètre de requête par nom id.
  • Convertissez et validez-le si nécessaire (vous pouvez utiliser les attributs required, validator et converter et y imbriquer un <f:converter> et <f:validator> comme avec <h:inputText>)
  • Si la conversion et la validation réussissent, définissez-la comme 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 façon, 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 des 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" />

Exécution d'une action commerciale sur les paramètres GET

Vous pouvez utiliser <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 est d'utiliser <f:event> à la place.

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

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

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

Si vous souhaitez ignorer également les cas "Échec de la conversion / validation", procédez comme suit:

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

Utiliser <f:event> de cette manière est essentiellement une solution de contournement / 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 "passer" les paramètres d'affichage dans les liens de navigation en définissant l'attribut includeViewParams sur true ou en ajoutant le paramètre de requête includeViewParams=true.

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

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

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

avec la valeur du paramètre d'origine.

Cette approche nécessite que next.xhtml a également un <f:viewParam> sur le même paramètre, sinon il ne sera pas transmis.


Utiliser les formulaires GET dans JSF

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

<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 en gros 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 code 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 n'apparaîtrait sinon 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 les couvertures").


Voir aussi:

pot.com/2011/09/communication-in-jsf-20.html#ProcessingGETRequestParameters "rel=" noreferrer "> Communication dans JSF 2.0 - Traitement des paramètres de requête GET
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top