IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Formulaire ré entrant automatique


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Par défaut Formulaire ré entrant automatique
    Bonjour, un défit:

    J'aimerais faire un formulaire ré entrant qui boucle tout seul (sans que l'on soit obligé de demander à un utilisateur d'appuyer sur un bouton à chaque retour du serveur, pour refaire un appel
    Bien-sur, selon une valeur dans un bean il s'arrêterait tout seul.

    Sauriez vous comment faire?

    Merci de votre attention.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je ne comprends pas, peux-tu être plus clair dans la description de ton besoin ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    Citation Envoyé par bibouilles Voir le message
    Sauriez vous comment faire?
    je ne suis pas sur non plus de comprendre ce que tu veux faire, mais je dirais que le push pourrait t’intéresser !

    Un exemple sur le site de primefaces
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Par défaut
    En fait, je cherche à ce que, avec Prime face ou jquery,
    après avoir cliqué sur un formulaire,
    une fois le traitement fait au niveau du serveur,
    et que les beans sont rafraichit sur le client,
    simuler une autre soumission du formulaire en fonction d'un boolean d'un bean, mais qui viens d’être retourné.
    (je ne souhaite pas faire du push, mais merci tout de même, cela pourra me servir dans l'avenir.)

    1)Avec en partant d'un onsuccess sur le <p:commandButton, j'ai l'impression que l’événement se produit avant le ré affichage des beans.
    2)De plus, comme la première fois, j'ai cliqué sur un commandButton, j'ai l'impression que je suis obligé de traper un évènement au niveau de ce commandButton et lancer la re soumission à cet endroit.
    3)Pour l'aiguillage en fonction du boolean sur le client, j’hésite entre du genre: if (#{monBean.stop}){alert('stop');} else {alert('continue');} et <fn:if test="${monBean.stop}">
    4)Pour la re soumission du formulaire je ne sais pas ce qui est le mieux et comment (je préfèrerais le faire en JSF ou primeface si c'était possible, sinon en jquery)

    Désolé pour l'imprécision

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    J'ai du mal à comprendre l'intérêt

    Si j'ai bien compris, tu envois le formulaire une fois et après, il se soumet tout seul, sans intervention de l'utilisateur... c'est bien ça ?
    Si oui, quel intérêt, les prochaines soumissions sont forcément "prévues" par le serveur, de ce fait, lors de la première soumission, il suffit de boucler (côté serveur) pour faire les opérations suivantes... ou alors un truc m'échappe
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Par défaut
    C'est parce que la somme des traitements va pouvoir prendre des heures,
    je veux donc les faire un par un, mais automatiquement avec cumul de l'affichage du résultat sur le poste client entre deux.
    C'est pour que l'utilisateur ne soit pas obligé de surveiller sans cesse l'IHM pour lancer le traitement suivant à chaque fois.
    De cette manière il pourra voir facilement où en sont les traitements sans perdre de temps entre chaque traitement, qui pourront même se faire pendant qu'il dort

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par bibouilles Voir le message
    C'est parce que la somme des traitements va pouvoir prendre des heures,
    je veux donc les faire un par un, mais automatiquement avec cumul de l'affichage du résultat sur le poste client entre deux.
    C'est pour que l'utilisateur ne soit pas obligé de surveiller sans cesse l'IHM pour lancer le traitement suivant à chaque fois.
    De cette manière il pourra voir facilement où en sont les traitements sans perdre de temps entre chaque traitement, qui pourront même se faire pendant qu'il dort
    Je ne vois pas pourquoi une autre soumission du formulaire si rien ne change entre les deux !
    Tu soumet un fois et tu lances tes traitements à la chaine, ensuite entre chaque traitement tu push pour rafraichir les informations nécessaire à l'affichage de l'utilisateur.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Comme ça, si le desktop a un soucis, si firefox fait une msie à jour, si l'onglet est fermé, il faut tout recommencer à 0? Si tu as un process long à exécuté, fait le dans un Thread séparé, et prévois une page de suivi avec un simple tag refresh, par exemple...

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Par défaut
    Je pense que tchize_ m’a tout à fait compris, car en plus des PB techniques que l’on peut avoir durant tout le traitement, il me faut savoir où il en est.

    Merci beaucoup tchize_ pour cette proposition technique qui me semble parfaitement convenir, car en plus si effectivement je perds la session utilisateur, le traitement continue et je pourrais constamment afficher où il en est

    Seulement je suis un peu trop novice pour l’implémenter facilement

    Auriez-vous des exemples du genre ?
    A première vue voici les défis techniques que je vais devoir rencontrer :

    1) Lancer et lire un thread à partir d’un Bean (peut être par l'intermédiaire d'un singleton?)

    2) Pouvoir lancer dynamiquement un refresh auto au niveau du client (je connais <META HTTP-EQUIV=Refresh CONTENT="60"> mais c’est statique

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Par défaut
    Alkahan, En fait du coup le push est finalement exactement ce qu'il me faut , comme cela je ne serais pas obligé d'attendre que l'affichage se rafraichisse au passage du refresh auto

    Par contre j'ai bien vu la page http://www.primefaces.org/showcase/push/notify.xhtml , mais je ne ne voi pas comment accéder au ManagedBean à partir de me Thread pour y lancer la méthode Send (si c'est bien ce qu'il faut faire).


    Pour ce qui est du lancement de Thread je me suis débrouillé tout seule, pour ceux à qui cela intéresse voici le code :

    le Thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    public class CreatorThread extends Thread {
     
    	private boolean  process = false;
     
    	public CreatorThread(){		
    	}
     
    	public void run() {
    		long sleeptime = 1000 * 1;
    		long expirationtime = 1000 * 3;
    	    long delta = 0 , ltime = 0;
    	    long startTime = new java.util.Date().getTime();
    	    System.out.println("started");
    	    while(process){
    	      try {
     
    	        ltime = new java.util.Date().getTime();
    	        delta = ltime - startTime;
    	        System.out.println("delta: "+delta);
    	        if ( delta > expirationtime ) {
    	        destroy();
    	          System.out.println("stop!");
    	        }
    	        Thread.sleep(sleeptime);
    	      } //eof while
    	      catch (InterruptedException ex) {
    	        System.out.println("Fatal Error !" + ex );
    	      }
    	    }//while process
    	  }//run
     
    	  /**
               * Initalization of the prestatements
               * @param conn Connection
               */
    	  public void init() {
    	    try {
    	      if (process == false) {
    	        process = true;
    	        this.start(); //call the run by extends Thread
    	      }
    	    }
    	    catch(Exception e) {
    	      System.out.println("init error "+e);
    	    }
    	  }
     
    	  public void destroy() {
    	    process = false;
    	    System.out.println("destroy");
     
    	  }
    }
    Le Singleton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    import java.util.Hashtable;
    import java.util.List;
     
    public class CreatorSingleton {
     
    	  private static final CreatorSingleton  INSTANCE = new CreatorSingleton();
     
    	  private CreatorThread creatorThread;
    	  private Hashtable<Integer,List<String>> jobs;
    	  private Hashtable<Integer,String> results;
     
    	  public static CreatorSingleton getInstance() {
    	    return INSTANCE;
    	  }
     
    	  private CreatorSingleton() {
    	    this.creatorThread = new CreatorThread();
    	    this.creatorThread.init();
    	  }
    	}

    L'appel à partir du bean:

    CreatorSingleton.getInstance();

  11. #11
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par bibouilles Voir le message
    Alkahan, En fait du coup le push est finalement exactement ce qu'il me faut , comme cela je ne serais pas obligé d'attendre que l'affichage se rafraichisse au passage du refresh auto

    Par contre j'ai bien vu la page http://www.primefaces.org/showcase/push/notify.xhtml , mais je ne ne voi pas comment accéder au ManagedBean à partir de me Thread pour y lancer la méthode Send (si c'est bien ce qu'il faut faire).
    En fait, tu n'as visiblement pas compris, tu n'as pas besoin d'appeler la méthode send mais uniquement appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EventBus eventBus = EventBusFactory.getDefault().eventBus();
    eventBus.publish("MonCanal", MonInfo);
    Le plus important ensuite est l'action que tu va exécuté sur les pages qui écoute sur "MonCanal" !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Par défaut
    l'idée du push est tentante mais je suis en primefaces 3.0.M3 (avec Java 1.6, et Tomcat 7)

    alors que l'EventBus semble être disponible qu'à partir de la version 5.0.

    Je me retrouve donc avec une migration de tout mon projet de primefaces 3.0.M3 en primefaces 5.0 avec toutes les dépendances que cela engendre.

    J'ai juste changé la jar de primefaces et modifié mon code pour que cela compile,

    mais je n'ai maintenant plus interaction entre mes pages et mes beans

    voici l'erreur:

    GRAVE: Error Rendering View[/login.xhtml]
    javax.el.ELException: /login.xhtml: Property 'sendNewEmail' not found on type ...LoginManagedBean

    ce managed bean:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @ManagedBean
    @SessionScoped
    public class LoginManagedBean extends AbstractManagedBean {
    ...
        public void sendNewEmail(final ActionEvent pActionEvent) {
    est appelé par login.xhtml ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <p:commandButton value="#{msg.genButtonLabelSend}" actionListener="#{loginManagedBean.sendNewEmail}"
    je n'ai pas modifié ce code et cela marchait avant

    est il simple à passer de primefaces 3.0.M3 à 5.0 pour faire du push?

    J'ai trouvé, pour juste cette partie, qu'il il faut changer la déclaration xmlns:p dans les xhtml
    de
    http://primefaces.prime.com.tr/ui
    en
    http://primefaces.org/ui


    mais sauriez vous si il y a d'autres choses à faire ou lib dépendantes à mettre à jour ou installer?

  13. #13
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par bibouilles Voir le message
    est il simple à passer de primefaces 3.0.M3 à 5.0 pour faire du push?
    sauriez vous quoi faire svp?
    oui, utilise les APIs push de la version 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RequestContext.getCurrentInstance().push("MonCanal", MonInfo);
    Cependant, tu te trouve dans une version qui n'est pas une version final, donc je te conseil au moins de passer en version 3 final.
    Eventuellement, regarde si tu peux passer en version 3.5 qui est la dernière version de la 3.x.
    Mais dans ce dernier cas le code du push sera le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PushContext pushContext = PushContextFactory.getDefault().getPushContext();
    pushContext.push("MonCanal", MonInfo);
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Par défaut
    Merci de l'info Alkhan, finalement il semble que j'ai réussit à passer en 5.0 en faisant je ce que j'ai dit ci dessus

    mais j'avais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Exception in thread "Thread-2" java.lang.NoClassDefFoundError: org/atmosphere/cpr/BroadcasterListener
    	at org.primefaces.push.EventBusFactory.<init>(EventBusFactory.java:26)
    	at org.primefaces.push.EventBusFactory.<clinit>(EventBusFactory.java:25)
    	at fr.pasteur.brclims.bl.CreatorThread.destroy(CreatorThread.java:63)
    	at fr.pasteur.brclims.bl.CreatorThread.run(CreatorThread.java:32)
    Caused by: java.lang.ClassNotFoundException: org.atmosphere.cpr.BroadcasterListener
    	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    	... 4 more
    au lancement de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    EventBus eventBus = EventBusFactory.getDefault().eventBus();
    eventBus.publish("/notify", new FacesMessage("summary", "detail"));
    à partir de mon Thread CreatorThread.java décrit ci dessus

    Je rappel que j'avais juste changé la jar de primefaces.
    J'ai donc ajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <dependency>
        <groupId>javax.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.1</version>
    </dependency>
     
    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>5.0</version>
    </dependency>
     
    <dependency>
        <groupId>org.atmosphere</groupId>
        <artifactId>atmosphere-runtime</artifactId>
        <version>2.1.3</version>
    </dependency>    
     
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>
    dans mon pom

    Je n'ai plus d'erreur mais rien ne s'affichait J'ai donc

    ajouté dans

    webapp/WEB-INF/web.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      <servlet>
        <servlet-name>Push Servlet</servlet-name>
        <servlet-class>org.primefaces.push.PushServlet</servlet-class>
        <async-supported>true</async-supported>
      </servlet>
     
      <servlet-mapping>
        <servlet-name>Push Servlet</servlet-name>
        <url-pattern>/primepush/*</url-pattern>
      </servlet-mapping>
    Et cela a l’ère de marcher YES!
    mais cela m'ouvre un popup 3 secondes (FacesMessage)

    on peut écrire dans une balise du client?

  15. #15
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Par défaut
    rien de plus simple: dans la function js handleMessage.
    Merci à vous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/04/2007, 17h42
  2. Réponses: 9
    Dernier message: 08/04/2007, 22h11
  3. [Formulaire]Remplir champs automatiquement
    Par goutbouyo dans le forum IHM
    Réponses: 5
    Dernier message: 30/03/2007, 17h34
  4. Réponses: 3
    Dernier message: 19/03/2006, 20h38
  5. Melange de formulaire, popup, refresh automatique
    Par reseau-emploi dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 06/02/2005, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo