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>
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:
id
.required
, validator
et converter
et imbriquer un _<f:converter>
_ et un _<f:validator>
_ comme avec _<h:inputText>
_)#{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" />
_
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.
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.
_<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").