2010-06-09 9 views
7

Je souhaite créer un bouton permettant de naviguer vers une URL différente et de passer certains paramètres de requête dans l'URL. Le lien de sortie fonctionne mais je voudrais un bouton, le commandButton semble bon mais je peux passer des paramètres.JSF commandButton Paramètres de l'URL

Existe-t-il une solution?

Répondre

16

Le h:commandButton ne se déclenche pas une demande GET, mais une demande POST, de sorte que vous ne pouvez pas l'utiliser. Si vous êtes déjà sur JSF 2.0 et la page cible est dans le même contexte, vous pouvez utiliser le h:button pour cela:

<h:button value="press here" outcome="otherViewId"> 
    <f:param name="param1" value="value1" /> 
    <f:param name="param2" value="value2" /> 
</h:button> 

(pas h:form est nécessaire ici comme dans h:outputLink). Cela va créer un bouton qui va à otherViewId.jsf?param1=value1&param2=value2.

Mais si vous n'êtes pas encore sur JSF 2.0, alors votre meilleur est juste de saisir CSS pour styler le lien comme un bouton.

<h:outputLink styleClass="button"> 

avec quelque chose comme

a.button { 
    display: inline-block; 
    background: lightgray; 
    border: 2px outset lightgray; 
    cursor: default; 
} 
a.button:active { 
    border-style: inset; 
} 
5

Avec le bouton vous associez une action, qui est une méthode dans le backing bean Vous pouvez définir params dans la fève de support et de les lire lorsque vous appuyez sur le bouton, de la méthode liée à action. La méthode d'action doit retourner un String, qui sera lu par le gestionnaire de navigation pour vérifier s'il doit se déplacer vers une nouvelle page, selon la configuration dans le faces-config.xml.

<h:form> 
    <h:commandButton value="Press here" action="#{myBean.action}"> 
     <f:setPropertyActionListener target="#{myBean.propertyName1}" value="propertyValue1" /> 
     <f:setPropertyActionListener target="#{myBean.propertyName2}" value="propertyValue2" /> 
    </h:commandButton> 
</h:form> 

haricots Sauvegarde:

package mypackage; 


public class MyBean { 

    // Init -------------------------------------------------------------------------------------- 

    private String propertyName1; 
    private String propertyName2; 

    // Actions ----------------------------------------------------------------------------------- 

    public void action() { 
     System.out.println("propertyName1: " + propertyName1); 
     System.out.println("propertyName2: " + propertyName2); 
    } 

    // Setters ----------------------------------------------------------------------------------- 

    public void setPropertyName1(String propertyName1) { 
     this.propertyName1 = propertyName1; 
    } 

    public void setPropertyName2(String propertyName2) { 
     this.propertyName2 = propertyName2; 
    } 

} 

Cet exemple est tiré de here (blog BalusC, sans doute il viendra vous dire de vérifier ce lien, mais je suis plus rapide: P)

Bien sûr, pour réaliser ceci, le haricot doit être défini comme session scoped. Si vous voulez qu'il soit request scoped vous pouvez suivre les étapes here

Questions connexes