9
votes

java.lang.illegalStateException: getOutputStream () a déjà été appelé pour cette réponse

Je reçois l'exception suivante lorsque j'essaie de demander le chargement des images du serveur sur le côté du client:

241132533 [TP-Processor1] Erreur [/jSpapps].[JSP] - servlet.service () pour servlet JSP a jeté une exception java.lang.illegalStateException: GetOutPutStream () a déjà été appelé pour cette réponse

Quelqu'un peut-il m'expliquer cette exception et comment se remettre dessus?


0 commentaires

11 Réponses :


7
votes

Quelqu'un peut-il vous expliquer cette exception

Vous essayez d'écrire des données binaires sur intervention.getoutoutPutStream () Utilisation du code Java RAW à l'intérieur d'un fichier JSP qui utilise déjà réponse.getwriter () pour écrire tout texte de modèle. Voir aussi la partie partie des Javadocs liés.

Et aussi comment se remettre?

Écrivez le code Java dans une vraie classe Java à la place. Créez une classe que étend < Code> httpServlet , déplacez tout ce code Java à là, carapez-le dans web.xml et modifiez l'URL de la demande pour appeler le servlet à la place.

Voir aussi:


3 commentaires

désolé mais j'ai besoin de mettre mon code dans le fichier JSP, et je charge l'image par


@ama: Tourner view_image.jsp dans un servlet mappé sur ViewImage et appelez-le comme dans votre fichier JSP.


C'est correct. Le problème est dans view_image.jsp . Il devrait être remplacé par une classe de servlet.



0
votes

Tourner view_image.jsp dans un servlet mappé sur ViewImage et appelez-le comme xxx

dans votre fichier JSP.


0 commentaires

0
votes

Essayez supprimer tous les textes de modèle em> du fichier JSP. Par exemple,

1 <%@
2    ....
3 %>
4 <%
5    ....
6 %>


0 commentaires

2
votes

Assurez-vous que l'élimination de toutes les sorties de votre View_Image.jsp . Les pauses de ligne simples peuvent être responsables de la production génératrice.

Par exemple, si vous avez ces déclarations ... xxx

... Vous devriez les écrire de cette façon xxx

Si vous souhaitez regarder le code de servlet compilé, vous ne devez pas voir out.write ("\ r \ n") avant la réponse de votre image.

meilleur Way serait de changer votre View_Image.jsp dans un servlet, mais si vous ne pouvez pas le faire, supprimer les pauses de la ligne dans le JSP est une solution de contournement.


1 commentaires

(Mon) Intellij le rend automatiquement, merci d'avoir souligné!



1
votes

Essayez cela, ce n'est pas le meilleur des solutions, mais cela fonctionne. xxx

où "in" est l'INPUTStream (si vous l'utilisez), "OUT2" est le nouveau réponse .getoutoutPutStream () et "out" est le Par défaut jspwriter .


0 commentaires

8
votes

Je viens de tomber sur cette ancienne question car j'avais le même problème. À la fin, il était assez facile de se débarrasser de l'exception: appelez simplement out.clear () avant: xxx

out.clear () < / Code> m'a également aidé à vous débarrasser de toutes ces lignes vides à partir de <% @ page importer = ... et similaire.


2 commentaires

Désolé mais je viens de regarder la documentation, et je ne trouve pas de méthode Effacer dans la classe SERVLEOutPutStream classe?


En fait, dans une variable présente dans le JSP;) cela fonctionne parfaitement pour moi merci pour cela.



1
votes
    <%@page import="java.sql.DriverManager"%>
    <%@page import="java.io.InputStream"%>
    <%@page import="java.sql.Connection"%>
    <%@page import="java.sql.PreparedStatement"%>
    <%@page import="java.sql.ResultSet"%>
    <%@page import="java.sql.Statement"%>

  <%
    Connection con=null;
    ResultSet rs = null;
    Statement st = null;
    String sql = null;
    try {
            Class.forName("com.mysql.jdbc.Driver");
            con=DriverManager.getConnection("test","root","root"); 
            st = con.createStatement();
            sql = "select image from projects where projectid='1'";
            System.out.println(sql);
            rs = st.executeQuery(sql); 
            String imgLen = "";
            out.clear();
            while (rs.next()) 
            {
                imgLen = rs.getString(1);
                System.out.println(imgLen.length());
                int len = imgLen.length();
                byte[] rb = new byte[len];
                InputStream readImg = rs.getBinaryStream(1);
                int index = readImg.read(rb, 0, len);
                response.reset();
                response.setContentType("image/jpg");
                response.getOutputStream().write(rb, 0, len);
                response.getOutputStream().flush();
                response.getOutputStream().close();
            }
            st.close();
            rs.close();
            if (true) return;
        } catch (Exception e) {e.printStackTrace();}
    %>

1 commentaires

Il vaut mieux si vous ajoutez des explications à votre réponse afin d'aider les autres à comprendre les problèmes / erreurs.



0
votes

Je viens de rencontrer le même problème dans mon travail récent.

Nous avons un filtre de servlet dans lequel nous utilisons la méthode servleResponse.getwriter () pour écrire le corps, et dans un contrôleur MVC de printemps, nous utilisons également une réponse.GetOutoutPutStream () Pour écrire quelque chose comme des images (tableau d'octets) dans le corps.

Étant donné que chaque demande passera par filtre et basé sur Java API Doc:

"Soit cette méthode (GetWriter ()) ou getOutputtream () peut être appelé à écrire le corps, pas à la fois. "

C'est la raison pour laquelle nous avons eu la" java.lang.illegalstateException: getOutputStream () a déjà été appelé pour cette réponse "Exception.

Donc, dans ce filtre, j'ai changé le code sur: xxx

IT corrigé ce problème pour moi.


0 commentaires

0
votes

au printemps, vous pouvez résoudre ce problème de modification de xxx

à xxx


0 commentaires

0
votes

J'ai eu ce code et j'ai résolu cela comme ceci:

@RequestMapping(value = "xyz", method = RequestMethod.POST)
public String generateReport(HttpServletResponse response, @Valid @ModelAttribute Form form, Errors errors, Model model) {
    if (errors.hasErrors()) {
        model.addAttribute(form);
        return "abcd/xyz";
    } else {
        someMethodWhichUsesResponse(response);
    }
Earlier:
    return "abcd/xyz";
Fixed by:
    return null;
}


0 commentaires

0
votes

Si vous faites face à ce problème dans des servlets, alors en envoyant la réponse au navigateur du servlet:

PrintWriter out=response.getWriter();


0 commentaires