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 :

[FacesContext] comment provoquer un 'oncomplete' ?


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut [FacesContext] comment provoquer un 'oncomplete' ?
    Bonjour,

    Pour télécharger un fichier excel depuis un commandLink jsf je fais ceci :
    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
    File export = exporterVolumes(typeTemps, typeInst, Long.parseLong(profilId), dateDebut, dateFin);
     
    HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment; filename=\"Export_details_deal_numero_" + id + ".xls\"");
     
    FileInputStream is = new FileInputStream(export);
    byte buffer[] = new byte[1024];
    int nbLecture = 0;
     
    // Envoyer le flux dans la réponse
    OutputStream os = response.getOutputStream();
    while ((nbLecture = is.read(buffer)) != -1) {
      os.write(buffer, 0, nbLecture);
    }
    os.flush();
    os.close();
     
    facesContext.responseComplete();
    Quand je clique sur un bouton ou un lien dans mon appli, je lance une popup d'attente, pour empecher que l'utilisateur clique 1000 fois sur le bouton.
    Je fais le show() sur le 'onclick' et le hide() sur le 'oncomplete'.

    Or ici, il semble que le commandLink ne recoive jamais de complete, vu que le popup ne s'en va jamais.

    Est ce que qqun sait comment faire pour envoyer un complete, ou quel evenement je dois attendre à la place ?
    Et si je fais n'importe quoi, n'hésitez pas à me le dire.

    Merci d'avance

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Tu peux afficher le code de la page JSF?

  3. #3
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    J'ai déjà rencontré ce problème, et ce n'estpas quelque chose de trivial à résoudre.
    Déjà, je pense que tu peux clairement oublier le oncomplete pour ce cas là.
    Il n'existe pas d'événement Javascript permettant de signaler l'apparition de la popup de sauvegarde du document.
    Comme je galèrais à résoudre ce problème, j'avais posé la question sur un forum anglophone, dont voici une piste :

    No such event exists. You need to take a different approach to solve this.

    1. target the download link to a hidden iframe with a name (target="myhiddeniframe")
    2. on click of the download link, show your loading spinner
    3. set the onload attribute of the iframe to a callback that hides your spinner

    Net effect: you "spin" while the pdf is generated, and "unspin" when the "File download" dialog appears (as opposed to when the "File download" dialog is closed).
    Maintenant, il existe une autre façon plus Richfaces: Tu utilises un booléen dans un bean, qui sera à faux tant que le document ne sera pas généré. A la fin de ton code Java, donc juste avant le facesContext.responseComplete(), tu mets ce booléen à true.

    Au niveau JSF, tu mets un <a4j:push> (ou poll ?) qui va périodiquement (genre toutes les secondes ou plus, selon le temps moyen de la génération du document) tester la valeur de ce booléen au niveau du serveur.
    Dès que ce booléen passe à true, tu clos la modalPanel.
    Pour bien faire, l'idéal étant d'activer ce push au moment où l'utilisateur clique sur le bouton de génération du document (là où tu affiches la modal).

    Suis-je assez clair ?
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par romaintaz Voir le message
    Au niveau JSF, tu mets un <a4j:push> (ou poll ?) qui va périodiquement (genre toutes les secondes ou plus, selon le temps moyen de la génération du document) tester la valeur de ce booléen au niveau du serveur.
    Dès que ce booléen passe à true, tu clos la modalPanel.
    Pour bien faire, l'idéal étant d'activer ce push au moment où l'utilisateur clique sur le bouton de génération du document (là où tu affiches la modal).
    Pourquoi ne pas utiliser showWhenRendered de la modalPanel? Après le téléchargement du fichier, il y'a redirection sur la même page, si le booléen est à false, la modalPanel ne s'ouvrira pas.

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    C'est un gros paté, je te remet que l'essentiel :

    le lien (dans une <h:form>)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <h:commandLink id="exportQP" action="#{transactionForm.exporterQP()}">
       <h:graphicImage value="/img/boutons/excel.gif" style="border: none;" />
     
       <rich:componentControl for="popup_rapide" operation="show" event="onclick" />
       <rich:componentControl for="popup_rapide" operation="hide" event="oncomplete" />
    </h:commandLink>
    et la popup (en dehors de la form)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <rich:modalPanel id="popup_rapide" shadowDepth="0">
      <h:graphicImage value="/img/patience.gif" />
    </rich:modalPanel>

Discussions similaires

  1. Comment provoquer le téléchargement d'un fichier?
    Par PerpetualSnow dans le forum ASP.NET
    Réponses: 6
    Dernier message: 21/08/2009, 10h44
  2. comment provoquer un rollback ?
    Par isoman dans le forum JPA
    Réponses: 4
    Dernier message: 24/04/2009, 19h00
  3. Comment provoquer l'arrêt de ma macro?
    Par jeanmarccassis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/12/2008, 18h49
  4. Comment provoquer le pack() d'une Jframe depuis un JPanel sans ref sur la JFrame
    Par cdtkoenig dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 21/07/2008, 19h11
  5. [CF][VB.NET/PPC] Comment provoquer un Beep ?
    Par borgfabr dans le forum Windows Mobile
    Réponses: 2
    Dernier message: 29/04/2005, 15h56

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