web-dev-qa-db-fra.com

Primefaces - commandButton ne fonctionne pas

Je suis confronté à un problème avec commandButton, cela ne fonctionne que lorsque le type est soumis. Quelqu'un peut-il jeter un coup d'œil et me faire savoir s'il existe une solution à cela? Le code ci-dessous est très simple et a la proposition d'illustrer ce dont j'ai besoin. La méthode test () n'est pas exécutée. La méthode runSubmit est exécutée avec succès.

J'ai besoin que la méthode de test soit exécutée sans soumission car la page d'origine a des validations qui sont exécutées pendant la soumission, la méthode test () doit être exécutée sans soumission car c'est une opération préliminaire avant la soumission.

J'utilise PrimeFaces 4.0, JDK 7, Tomcat 6 et JSF 2.0 (Apache), mais je pense que cela se produit également à Mojarra.

    SESSION:

package com.andre.bean;

public class AndreBean {

public void runSubmit() {
System.out.println("Submit executed");
}

public String test() {
System.out.println("Not submit executed");
return "true";
}

}

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:head>

<h:form id="test">
<p:commandButton id="ns" value="not submit" type="button" action="#{andreBean.test}" ajax="false"></p:commandButton>
<p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}"></p:commandButton>

</h:form> 

</html>

Merci beaucoup André

13
Andre

Que se passe-t-il?

Vous obtenez un comportement correct. Dans le bouton PrimeFaces avec type = "button" fonctionne comme dans le HTML de base - il ne provoque aucune demande. Comme Guide de l'utilisateur PrimeFaces dit:

Les boutons poussoirs sont utilisés pour exécuter du javascript personnalisé sans provoquer de requête ajax/non ajax . Pour créer un ensemble de boutons-poussoirs, tapez "bouton".

<p:commandButton type="button" value="Alert" onclick="alert('Prime')" />

Si vous voulez "parler à" le bean, vous devez utiliser type = "submit" (qui est par défaut dans p: commandButton). Cependant ... contrairement au comportement des boutons de soumission en HTML, dans PrimeFaces, cette soumission ne forcera pas la redirection vers une nouvelle page, mais toutes les communications seront gérées par des demandes sous-jacentes AJAX.

Par conséquent, seul votre deuxième bouton exécutera la méthode des beans:

<p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}" />

Que vouliez-vous probablement obtenir?

Si vous ne voulez pas envoyer tout votre formulaire au bean, vous pouvez limiter la portée des composants qui sont traités avec l'attribut "process" de p: commandButton:

<h:form id="test">
    <p:inputText value="#{andreBean.value}"/>
    <p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}" process="@this" />
</h:form>

Avec le bean suivant, vous verrez la différence:

public class AndreBean {

    private String value;

    public void runSubmit() {
        System.out.println("Submit executed");
    }

    public String getValue() {
        System.out.println("getValue");
        return value;
    }

    public void setValue(String value) {
        System.out.println("setValue: " + value);
        this.value = value;
    }

}

Si vous ne limitez pas les composants exécutés dans la console, vous obtenez:

getValue

setValue: foobar

Submit executed

... et avec des composants limités uniquement à process = "@ this" vous obtenez seulement:

Submit executed

J'espère que cela pourra aider.

34
ppawel

Parfois, la solution consiste simplement à ajouter immediate="true", il change le point, dans le style de vie JSF, dans lequel l'action du bean est déclenchée.

13
Richard P.