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 :

[Servlet] "getWriter()" a déjà été appelé pour cette réponse


Sujet :

Servlets/JSP Java

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut [Servlet] "getWriter()" a déjà été appelé pour cette réponse
    Hello,

    je bosse sur une servlet relativement basique et old-school.

    Principe :

    ma servlet est décomposée en deux parties :
    • au début du doGet, si mon paramètre "action" est null, on va dans un bloc if qui construit une page html via un response.getWriter()
    • sinon, si mon action!=null, c'est qu'on a soumis le formulaire précédemment généré, alors on execute un calcul qui génère un fichier, mon but étant d'afficher la popup de téléchargement de ce dit fichier


    A l'heure actuelle, tout fonctionne jusqu'au moment ou je tente d'afficher le fichier pour téléchargement.


    Voici ma classe :

    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
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    package fr.servlet;
     
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.InputStream;
    import java.io.FileInputStream;
    import java.io.OutputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
     
    import org.apache.log4j.Logger;
    import org.joda.time.DateTime;
     
    import fr.bean.TypeRecherche;
    import fr.servlet.CartographieHdd;
    import fr.servlet.SimeServlet;
     
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    public class CartoDonnees extends ServletGlobale {
     
    	public Logger LOGGER = Logger.getLogger(CartoDonnees.class);
    	public String util = new String("");
     
    	private static String 	SQL_LISTE_FLUX = "select distinct NO_FLUX from T_PARAM_CARTO order by NO_FLUX";
    	private static String 	SQL_LISTE_SOURCE = "select distinct NOM_SOURCE from T_PARAM_CARTO order by NOM_SOURCE";
    	private static String 	SQL_LISTE_ECHANGE = "select distinct NO_ECHANGE from T_PARAM_CARTO order by NO_ECHANGE";
     
     
     
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws IOException, ServletException {
     
     
    		try {
    			String action = request.getParameter("action");
    			LOGGER.info("action => " + action);
     
    			// generation du tableau de resultats
    			if (action != null && action.equals("download")) {
     
    				LOGGER.info(request.getParameter("dateDebut"));
    				LOGGER.info(request.getParameter("dateFin"));
    				LOGGER.info(request.getParameter("typeRecherche"));
    				LOGGER.info(request.getParameterValues("listeFlux"));
    				LOGGER.info(request.getParameterValues("listeSource"));
    				LOGGER.info(request.getParameterValues("listeEchange"));
     
    				String strDateFin = request.getParameter("dateFin");
    				String strDateDebut = request.getParameter("dateDebut");
     
    				String[] listeValeurs = {};
    				if(request.getParameterValues("listeFlux").length >0)
    					listeValeurs = request.getParameterValues("listeFlux");
    				else if(request.getParameterValues("listeSource").length >0)
    					listeValeurs = request.getParameterValues("listeSource");
    				else if(request.getParameterValues("listeEchange").length >0)
    					listeValeurs = request.getParameterValues("listeEchange");
     
    				Cartographie carto = new Cartographie();
    				String nomZipSortie = carto.executer(strDateDebut, strDateFin, listeValeurs, request.getParameter("typeRecherche"));
     
    					File file = new File(nomZipSortie);
    					byte[] buf = new byte[1024];
    					response.setContentType("application/zip");
    					response.setHeader("Cache-Control", "cache");
    					response.setHeader("Pragma", "cache");
    					response.setHeader("Content-disposition",
    							"attachment;filename=\"" + nomZipSortie + "\"");
    					response.setContentLength((int) file.length());
    					FileInputStream in = new FileInputStream(file);
    					OutputStream out = response.getOutputStream();
    					int count = 0;
    					while ((count = in.read(buf)) >= 0) {
    						out.write(buf, 0, count);
    					}
    					in.close();
    					out.close();
     
    					LOGGER.info("zip fini");
    					return;
     
    			// ihm de recherche ( accueil )	
    			} else {
    				PrintWriter out = response.getWriter();
    				LOGGER.debug("creation connection ");
    				Connection conn = getConnection();
     
    				LOGGER.debug("creation statement ");
    				Statement stmtDon = conn.createStatement();
     
     
    				LOGGER.debug("debut exec requetes [SQL_LISTE_FLUX]");
    				ResultSet rsetFlux = stmtDon.executeQuery(SQL_LISTE_FLUX);
    				ArrayList<String> listeFlux = new ArrayList<String>();
    				StringBuilder strListeFlux = new StringBuilder();
    				while(rsetFlux.next()){
    					listeFlux.add(rsetFlux.getString(1));
     
    					strListeFlux.append("<option value=\"" + rsetFlux.getString(1)
    					+ "\">" + rsetFlux.getString(1)
    					+ "</option>");
    				}
    				LOGGER.debug("debut exec requetes [SQL_LISTE_SOURCE]");
    				ResultSet rsetSource = stmtDon.executeQuery(SQL_LISTE_SOURCE);
    				ArrayList<String> listeSource = new ArrayList<String>();
    				StringBuilder strListeSource = new StringBuilder();
    				while(rsetSource.next()){
    					listeSource.add(rsetSource.getString(1));
     
    					strListeSource.append("<option value=\"" + rsetSource.getString(1)
    					+ "\">" + rsetSource.getString(1)
    					+ "</option>");
    				}
    				LOGGER.debug("debut exec requetes [SQL_LISTE_ECHANGE]");
    				ResultSet rsetEchange = stmtDon.executeQuery(SQL_LISTE_ECHANGE);
    				ArrayList<String> listeEchange = new ArrayList<String>();
    				StringBuilder strListeEchange = new StringBuilder();
    				while(rsetEchange.next()){
    					listeEchange.add(rsetEchange.getString(1));
     
    					strListeEchange.append("<option value=\"" + rsetEchange.getString(1)
    					+ "\">" + rsetEchange.getString(1)
    					+ "</option>");
    				}
     
    				StringBuilder typesRecherche = new StringBuilder();
    				int i=0;
    				for (TypeRecherche type : TypeRecherche.values()) {
     
    					if(i==0)
    						typesRecherche.append("<input type=radio checked name=typeRecherche value=\"" + type.name()
    								+ "\">" + type.getValeur().toLowerCase());
    					else
    						typesRecherche.append("<input type=radio name=typeRecherche value=\"" + type.name()
    								+ "\">" + type.getValeur().toLowerCase());
     
    					i++;
    				}
     
    				out.println("<html><head>");
    				out.println("");
    				out.println("<meta http-equiv =\"Content-Type\" content =\"text/html; charset =UTF-8\">");
    				out.println("<!--[if IE ]>");
    				out.println("<LINK rel=\"stylesheet\" type=\"text/css\" href=\"css/cartoDonneesIE.css\">");
    				out.println("<![endif]-->");
    				out.println("<!--[if !IE]> --><LINK rel=\"stylesheet\" type=\"text/css\" href=\"css/cartoDonnees.css\"><!-- <![endif]-->");
    				out.println("<LINK rel=\"stylesheet\" type=\"text/css\" href=\"css/jquery-ui-smooth.css\">");
    				out.println("<script type=\"text/javascript\" src=\"js/jquery-1.9.1.js\"></script>");
    				out.println("<script src=\"js/jquery-ui-1.10.3.custom.min.js\"></script>");
    				out.println("<script src=\"js/jquery.mask.min.js\"></script>");
    				out.println("<script type=\"text/javascript\" src=\"js/jquery.ui.datepicker-fr.js\"></script>");
    				out.println("<script type=\"text/javascript\" src=\"js/cartoDonnees.js\"></script>");
    				out.print("</head><body>");
    				out.print("<form name=\"formCartoDonnees\" method=POST action=\"CartoDonnees\" >");
    				out.print("<input type=hidden name=action value=search />");
    				out.print(""
    						+ "<div id=\"legende\">"
    						+ "<p>(*) Saisie Obligatoire</p>"
    						+ "</div>"
    						+
     
    						"<div class=retraitGauche >"
    						+ "<p>Date d&eacute;but :</p> "
    						+ "<div class=champsRequis>*</div>"
    						+ "<div><input type=text name=dateDebut /></div>"
    						+ "</div>"
    						+ "<div class=retraitGauche>"
    						+ "<p>Date fin :</p> "
    						+ "<div class=champsRequis >*</div>"
    						+ "<div><input type=text name=dateFin /></div>"
    						+ "</div>"
    						+ "<div class=retraitGauche><p>Type de recherche :</p><div>"
    						+ typesRecherche.toString()
    						+"</div></div>"
    						+"");
     
    				out.println("<div id=listes>");
    				out.println("<div class=retraitGauche><p>Liste des flux :</p><div><select name=listeFlux multiple=multiple size="+listeFlux.size()+">");
    				out.println(strListeFlux.toString());
    				out.println("</select></div></div>");
    				out.println("<div class=retraitGauche><p>Liste des sources :</p><div><select name=listeSource multiple=multiple size="+listeSource.size()+">");
    				out.println(strListeSource.toString());
    				out.println("</select></div></div>");
    				out.println("<div class=retraitGauche><p>Liste des &eacute;changes :</p><div><select name=listeEchange multiple=multiple size="+listeEchange.size()+">");
    				out.println(strListeEchange.toString());
    				out.println("</select></div></div>");
    				out.println("</div>");
    				//out.println("<br/>");
     
    				out.println("<div id=boutons ><input type=button name=Executer value=\"Ex&eacute;cuter\" /></div>");
    				out.println("</form>");
    				out.println("</body></html>");
    				out.flush();
    				out.close();
    				return;
    			}
     
    		} catch (Exception e) {
    			PrintWriter out = response.getWriter();
    			afficheException(out, e);
    			out.flush();
    			out.close();
    			LOGGER.fatal("exception ", e);
    			return;
    		}
     
    	}
     
    	protected void doPost(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
     
     
    	/**
    	 * @return
    	 * @throws SQLException
    	 */
    	public String getDriverManager() throws SQLException {
    		DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    		String url = "jdbc:oracle:thin:@" + getProperty("rack");
    		return url;
    	}
     
    	/**
    	 * @return
    	 * @throws SQLException
    	 */
    	public Connection getConnection() throws SQLException {
    		String url = getDriverManager();
     
    		Connection connDon = DriverManager.getConnection(url,
    				getProperty("user"), getProperty("mdp"));
    		return connDon;
    	}
    }

    J'ai eut beau essayer de faire des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    				out.flush();
    				out.close();
    				return;
    Rien n'y fait, j'ai toujours la même erreur.



    Vous avez une piste?
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  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
    le flush/close n'a rien à voir. On ne peux pas appeler à la fois getOutputStream et getWriter sur une objet HttpServletResponse. La question c'est, en regardant ton cas "download", je ne vois nulle part où getWriter aurait été appelé avant. J'en conclue donc que ta servlet est appelée via un requestdispatcher.forward et que, avant cet appel, on a utilisé getWriter.

    La seule solution, c'est de ne pas appeler le getWriter quand on aura besoin de l'outputstream.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Salut,

    pourtant non, j'accède à cette servlet via un lien du type .../CartoDonnees


    C'est ça que je trouve ... étrange :o

    Sinon, je peux essayer d'extraire la partie "download" dans une servlet à part ?
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  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 n'aurais pas un ServletFilter, qui interviendrait en amont?

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    J'ai regardé, non rien du tout.

    Pareil, dans le web.xml, rien de particulier
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Par contre y'a un truc, c'est que, une fois le war déployé, j'ai ma classe en triple sous cette forme :

    CartographieHdd.class
    CartographieHdd$1.class
    CartographieHdd$2.class
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  7. #7
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Bon,, c'est résolu en modifiant cette partie :

    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
    				CartographieHdd carto = new CartographieHdd();
    				String nomZipSortie = carto.executer(strDateDebut, strDateFin, listeValeurs, request.getParameter("typeRecherche"));
     
    				LOGGER.info(nomZipSortie);
     
    					File file = new File(nomZipSortie);
     
    					byte[] buf = new byte[1024];
    					response.setContentType("application/zip");
    					response.setHeader("Cache-Control", "cache");
    					response.setHeader("Pragma", "cache");
    					response.setHeader("Content-disposition",
    							"attachment;filename=\"" + nomZipSortie.replaceAll("sortie/", "") + "\"");
    					response.setContentLength((int) file.length());
    					FileInputStream in = new FileInputStream(nomZipSortie);
    					OutputStream out = response.getOutputStream();
    					int count = 0;
    					while ((count = in.read(buf)) >= 0) {
    						out.write(buf, 0, count);
    					}
    					in.close();
    					out.close();
    Et en particulier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileInputStream in = new FileInputStream(nomZipSortie);

    J'ai donc bien ma popup de download , nickel.

    Par contre, y'a un moyen de recharger la page après ? Car là, si je reclique sur le bouton de mon formulaire, il ne re-execute pas la requete .
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  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
    Les $ représente les classes anonyme que tu as mis dans ta classe CartographieHdd, c'est normal.

    Tu peux nous donner la stacktrace de l'exception que tu obtiens quand tu tente de récupérer request.getOutputStream() ?

  9. #9
    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
    Heu le new Fileinputstream n'aurais rien du change, puisqu'il n'a rien à voir avec HttpServletRequest, qui est celui qui déclenche l'erreur.

    A mon avis, la différence, c'est que t'as redéployé alors que tu ne l'avais pas fais la fois précédente => le code que tu nous a montré n'était pas celui que tu faisais rouler.

  10. #10
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    En effet ça paraitrait étonnant que ça vienne de là, je penche aussi pour le déploy, que j'ai pourtant bien effectué à chaque fois car je ne peux pas debug en local, donc obligé de faire un deploy sur le serveur à chaque fois -.-' .

    Il est donc possible que tomcat ai fait de siennes...
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

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

Discussions similaires

  1. [Vxi3] getOutputStream() a déjà été appelé pour cette réponse
    Par Mireill dans le forum Launchpad (ex-Infoview)
    Réponses: 0
    Dernier message: 23/01/2013, 16h28

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