f:param ne fonctionne pas avec p:commandLink ou h:commandLink sur la chaîne de requête
f:param
fonctionne très bien avec h:link
, mais pas avec p:commandLink
ou h:commandLink
.
Par exemple, j'ai deux pages test_first.xhtml
et test_second.xhtml
, et un backing bean java TestBean.java
.
- Je commencer à courir test_first.xhtml
.
Si je clique sur link1
, qui est un h:link
, la page de redirection vers test_second.xhtml
. Avec l'aide de f:param
, la barre d'adresse du navigateur affiche .../test_second.xhtml?id=1
. Sur cette page, testBean.userId
est imprimé.
Si je clique sur link2
ou link3
, la redirection de la page de test_second.xhtml
. Toutefois, la barre d'adresse affiche uniquement .../test_second.xhtml
, il n'y a PAS de ?id=#
! Et testBean.userId
ne pas publiées sur cette page.
Comment puis-je faire commandLink
travailler avec f:param
? Parfois, je veux le lien de ne pas rediriger vers une autre page mais de faire appel de certaines méthodes de haricot en fonction des données.
test_first.xhtml:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head/>
<h:body>
<h:form>
<h:link value="link1" outcome="test_second" >
<f:param name="id" value="1"/>
</h:link>
<br/><br/>
<h:commandLink value="link2" action="test_second?faces-redirect=true" >
<f:param name="id" value="2" />
</h:commandLink>
<br/><br/>
<p:commandLink value="link3" action="test_second?faces-redirect=true">
<f:param name="id" value="3" />
</p:commandLink>
<br/><br/>
</h:form>
</h:body>
</html>
test_second.xhtml:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<f:metadata>
<f:viewParam name="id" value="#{testBean.userId}" />
</f:metadata>
<h:head/>
<h:body>
<h:form>
This is the second page.
<h:outputText value="Selected id is #{testBean.userId}" />
<h:commandButton value="Print page id" action="#{testBean.print()}" />
</h:form>
</h:body>
</html>
TestBean.java
@ManagedBean
@SessionScoped
public class TestBean implements Serializable{
private Integer userId;
public void print() {
System.out.println(userId);
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
}
- Connexes: stackoverflow.com/questions/4317684/...
Vous devez vous connecter pour publier un commentaire.
Vous avez mal interprété le sens de ces deux balises, à savoir
<h:lien>
et<h:commandLink>
, par conséquent, vous aussi mal interprété le sens de<f:param>
attaché à l'une des deux. Dans anycase il est utile de toujours lire la documentation avant de poser les questions pour obtenir plus de perspicacité.En d'autres termes, dans
<h:link>
balise imbriquée<f:param>
va finir comme un paramètre de requête de l'URL générée, alors que dans les<h:commandLink>
balise imbriquée<f:param>
va finir comme un paramètre de la requête avec une valeur donnée.Alors que le premier est évident, le second mérite une meilleure élaboration. Pour comprendre ce qu'il fait, considérer que, si nous abstraire les détails
<h:commandLink>
envoie une requête POST et s'attache tout imbriqués<f:param>
balises, comme les paramètres de la demande. Mais c'est à vous de décider comment vous allez gérer eux, comme la navigation est entièrement entre vos mains.Donc, la première option est de définir une codé en dur
action
attribut, qui de cas d'utilisation est douteux, comme dansaction="second-page"
de la manière dont vous n'avez pas passer n'importe quel paramètre de requête à tous les. Ce qui va être fait est de Poster sur le même point de vue et de le transmettre à la seconde sans entreprendre aucune action. Tout à fait stupide d'action.La deuxième option est de spécifier une méthode d'action, comme dans
action="#{bean.action}"
. Dans ce cas vous devez gérer la navigation dans la méthode d'action, c'est à dire le retournull
/void
de la méthode pour une publication, ou le retour d'une navigation en cas de résultat comme une chaîne pour en faire un en avant à la vue spécifiée. Comme pour les paramètres de la requête que vous avez passé avec<f:param>
ils seront disponibles à la norme ACI signifie comme@ManagedProperty("#{param.name}")
sur une demande d'étendue de haricot, ou en appelantExternalContext#getRequestParameterMap()
dans toute l'étendue de haricots, par exemple, dans la méthode d'action, comme dansString param = externalContext.getRequestParameterMap().get("name")
. Alors maintenant, vous avez votre paramètre de la méthode d'action que vous êtes libre d'utiliser comme vous le souhaitez, juste adhérer à un ensemble de règles qui existent pour les Url.Deux choses reste à mentionner. Rappelez-vous que les paramètres de la demande transmise à l'appel de la commande link sera disponible uniquement à l'intérieur de cette même demande, comme vous vous en doutez il à survivre à une
faces-redirect=true
que, fondamentalement, les feux d'une autre demande. L'autre option est de spécifierincludeviewparams=true
de passer à travers les paramètres de la vue actuelle, si c'est souhaité, comme mentionné dans la réponse à faire.Vous pourriez le faire par la concaténation des paramètres avec
&
directement à l'attribut action:Mise à jour de 1
Vous pouvez également envisager d'ajouter
&includeViewParams=true
. Cette façon de voir les paramètres de votre cible, la navigation sera inclus automatiquement.