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

Servlets/JSP Java Discussion :

Ouverture d'une popup pour ouvrir/enregistrer un fichier depuis une servlet


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Ouverture d'une popup pour ouvrir/enregistrer un fichier depuis une servlet
    Bonjour !

    j'ai un problème pour ouvrir un popup d'ouverture/enregistrement de ficher dans ma servlet.

    ce que je fais :

    1) depuis une jsp, je fais appel à une servlet en utilisant AJAX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	function dataExport()
    	{
    		var ajaxRequest4 = new Ajax.Request("Export_data", {
    			method : 'post',
    			asynchronous : true,
    			onSuccess : function() {
    				alert('Success');
    			},
    			onFailure : function() {
    				alert('Something went wrong...');
    			}
    		});
    		return false;
    	}

    2) une fois dans ma servlet , je créer un fichier excel que je remplis et enregistre dans un répertoire c:/Temp

    3) je veux pouvoir ouvrir via un pop ouvrir/enregistrer ce fichier mais rien ne se passe à l'écran et aucune exception n'est levée.

    voici le code de ma servlet :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    public class Export_data extends HttpServlet
    {
       private static final long serialVersionUID = 1L;
     
       /**
        * @see HttpServlet#HttpServlet()
        */
       public Export_data()
       {
          super();
       }
     
       /**
        * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
        *      response)
        */
       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
       {
       }
     
       /**
        * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
        *      response)
        */
       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
       {
          try
          {
    		 //création nom de fichier
             String FileName = "Export_DELAI_";
             String format = "ddMMyyHmmss";
             java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(format);
             java.util.Date date = new java.util.Date();
             FileName += formater.format(date);
             FileName += ".xls";
     
             // chemin du ficher.
             String FilePathAndName = "C:\\Temp\\" + FileName;
             FileOutputStream fileOut = new FileOutputStream(FilePathAndName);
     
     
    		 //création éléments Excels.
             HSSFWorkbook workbook = new HSSFWorkbook();
             HSSFSheet worksheet = workbook.createSheet("POI Worksheet");
             worksheet.setColumnWidth((short) 0, (short) (15 * 256));
             worksheet.setColumnWidth((short) 1, (short) (14 * 256));
             worksheet.setColumnWidth((short) 2, (short) (20 * 256));
             worksheet.setColumnWidth((short) 3, (short) (20 * 256));
             worksheet.setColumnWidth((short) 4, (short) (17 * 256));
             worksheet.setColumnWidth((short) 5, (short) (20 * 256));
             worksheet.setColumnWidth((short) 6, (short) (20 * 256));
             worksheet.setColumnWidth((short) 7, (short) (16 * 256));
             worksheet.setColumnWidth((short) 8, (short) (14 * 256));
             worksheet.setColumnWidth((short) 9, (short) (17 * 256));
     
            // création de la première ligne 
             HSSFRow initialRow = worksheet.createRow((short) 0);
             HSSFCell initialCell = null;
             HSSFCellStyle EnTeteCellStyle = workbook.createCellStyle();
             HSSFFont font = workbook.createFont();
             font.setFontName("Trebuchet MS");
             font.setColor(HSSFColor.WHITE.index);
             HSSFPalette palette = workbook.getCustomPalette();
             palette.setColorAtIndex(HSSFColor.RED.index, (byte) 163, (byte) 2, (byte) 52);
     
             EnTeteCellStyle.setFont(font);
             EnTeteCellStyle.setFillForegroundColor(HSSFColor.RED.index);
             EnTeteCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
             EnTeteCellStyle.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
             EnTeteCellStyle.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
             EnTeteCellStyle.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
             EnTeteCellStyle.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
             // initialCell.setCellStyle(EnTeteCellStyle);
     
    		 //récupération des noms de colonnes
             DBConnection conn = new DBConnection();
             ResultSet dataTab = conn.getDataExport();
             ResultSetMetaData rsmd = dataTab.getMetaData();
             int columnCount = rsmd.getColumnCount();
             for (int i = 1; i < columnCount + 1; i++)
             {
                String name = rsmd.getColumnName(i);
                initialCell = initialRow.createCell((short) i);
                initialCell.setCellValue(new HSSFRichTextString(rsmd.getColumnName(i)));
                initialCell.setCellStyle(EnTeteCellStyle);
             }
     
     
             // insertion des données dans le documents excel.
             HSSFCellStyle DataCellStyle = workbook.createCellStyle();
             HSSFFont Datafont = workbook.createFont();
     
             Datafont.setFontName("Trebuchet MS");
             DataCellStyle.setFont(Datafont);
             DataCellStyle.setFillForegroundColor(HSSFColor.WHITE.index);
             DataCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
             DataCellStyle.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
             DataCellStyle.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
             DataCellStyle.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
             DataCellStyle.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
     
             int nbreRow = 1;
             while (dataTab.next())
             {
                nbreRow++;
                HSSFRow currentrow = worksheet.createRow((short) nbreRow);
                HSSFCell currentCell = null;
                for (int j = 1; j <= columnCount; j++)
                {
                   System.out.print("\n\t valeur :" + dataTab.getString(j));
                   currentCell = currentrow.createCell((short) j);
                   currentCell.setCellStyle(DataCellStyle);
                   currentCell.setCellValue(new HSSFRichTextString(dataTab.getString(j)));
                }
             }
             workbook.write(fileOut);
             fileOut.flush();
             fileOut.close();
     
     
    		//Ouverture du fichier dans une popup.
             File myfile = new File(FilePathAndName);
             response.setContentType("text/xls");
             response.setHeader("Content-Disposition", "attachment; filename=" + FileName); 
             InputStream in = new FileInputStream(myfile);
             ServletOutputStream outs = response.getOutputStream();
             try
             {
                int bit = in.read();
                while ((bit) >= 0)
                {
                   outs.write(bit);
                   bit = in.read();
                }
             }
             catch (Exception e)
             {
                e.printStackTrace(System.out);
             }
             outs.flush();
             outs.close();
             in.close();
     
             conn.close();
     
          }
          catch (FileNotFoundException e)
          {
             e.printStackTrace();
          }
          catch (IOException e)
          {
             e.printStackTrace();
          }
          catch (SQLException e)
          {
             e.printStackTrace();
          }
          catch (Exception e)
          {
             e.printStackTrace();
          }
       }
    }
    quelqu'un aurait une idée ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je ne suis pas expert en javascript, mais je ne pense pas que tu puissi initier un téléchargement de fichier en ajax. Pourquoi tu n'utilise pas un formulaire classique avec un bouton pour ça?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    j'aimerai juste que les actions de création du fichier excel et de proposition de téléchargement se fasse consécutivement sans que l'utilisateur n'appuie sur un nouveau bouton.

    par contre , le déroulement du code est le suivant :

    bouton 'classique' --> fonction javascript --> appel AJAX --> servlet.

    d'après ce que tu me dis je peux agir au niveau de mon bouton classique pour faire ce téléchargement ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu crée ton bouton qui envoie le post vers la servlet. Ou mieux tu modifie ta servlet en GET, puisqu'elle ne prend pas de paramètre et tu fait un simple lien.

    Et dans la servlet, tu fais les deux opérations: création du ficheir excel et envoi de ce fichier vers les response.getOutpustream, exactement comme tu le fais déjà. Et d'office, le navigateur demandera ce qu'il faut faire de ce fichier (ouvrir? Sauver?)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    ok , je vais regarder ce qu'est une GET car j'avoue que je ne sais absolument pas ce que c'est. en tout cas merci de me donner une piste.

    Cordialement,

    megayaya

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le GET, c'est l'opération de base, celle que tu déclenche avec un simple lien. 90% de ton application est formée de GET en général. Le POST c'est l'opération typiquement utilisée par les formulaires.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    humm j'avoue que je ne pense pas tout comprendre, j'ai du apprendre sur le tas et ma compréhension des termes et des mechanisme n'est pas au top .

    moi actuellement j'ai mon input :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="button" value="Exporter" onclick="dataExport();">
    qui appelle la fonction javascript que j'ai linké dans mon premier post.
    tu me demande de ne plus passer par l'appel javascript ( qui utilise l'AJAX)
    et de directement spécifier un lien dans mon input qui pointe vers la servlet ?

    c'est ce que j'en ai compris en tout cas corrige moi si j'ai faux

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui, si tu continue à travailler en post, utilise ceci:

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <form action="chemin/vers/ta/servlet"/>
       <input type="submit" value="Recuperer le Excel"/>
    </form>

    Si tu travaille en GET (en gros tu met ton code dans doGet et non doPost au niveau de la servlet)


    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href="chemin/vers/ta/servlet">Recuperer le Excel</a>

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    c'est bien ce que j'avais compris.


    j'ai donc l'url de ma servlet et j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="/Export_data">click me to export</a>
    mais quand je clique ( en localhost sous eclipse)
    ca me met : erreur 404 la ressource demandée (/Export_data n'est pas disponible)

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    u dois mettre le chemin vers ta servlet dans le lien. Et je doute que ce soit /Export_data, vu quele chemin doit commencer par le nom de l'application. Donc soit tu met


    chemin/relatif/vers/la/servlet

    soit tu met

    /application/chemin/absolu/vers/la/servlet


    Pour le chemin relatif, tout dépend de où est ton jsp par rapport à où est configurée ta servlet


    Pour le chemin absolu, ça nécessite de connaitre le nom de l'application et où est configurée ta servlet.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/11/2014, 17h55
  2. Genre de popup pour ouvrir une page
    Par Ylias dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/10/2007, 10h19
  3. [C#]créer une popup pour saisir la date avec le calendrier
    Par JuniorS dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/09/2006, 16h58
  4. [VB.net] Probleme avec une dll pour l'enregistrer
    Par Diablo_22 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 09/08/2006, 21h41
  5. une astuce pour ouvrir la base de registre d'un autre disque
    Par bouassouille dans le forum Windows XP
    Réponses: 4
    Dernier message: 07/10/2005, 01h53

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