Je reçois l'exception suivante lorsque j'essaie de demander le chargement des images du serveur sur le côté du client: P>
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 p> blockQuote>
Quelqu'un peut-il m'expliquer cette exception et comment se remettre dessus? P>
11 Réponses :
Quelqu'un peut-il vous expliquer cette exception p> blockQuote>
Vous essayez d'écrire des données binaires sur
intervention.getoutoutPutStream () code>Utilisation du code Java RAW à l'intérieur d'un fichier JSP qui utilise déjàréponse.getwriter () code>pour écrire tout texte de modèle. Voir aussi la partie em> partie des Javadocs liés. P>Et aussi comment se remettre? P> blockQuote>
Écrivez le code Java dans une vraie classe Java à la place. Créez une classe que
étend code> < Code> httpServlet code> , déplacez tout ce code Java à là, carapez-le dansweb.xml code> et modifiez l'URL de la demande pour appeler le servlet à la place. P>Voir aussi: h3>
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 CODE> et appelez-le comme code> dans votre fichier JSP.
C'est correct. Le problème est dans view_image.jsp code>. Il devrait être remplacé par une classe de servlet.
Tourner view_image.jsp dans un servlet mappé sur dans votre fichier JSP. p> p> ViewImage CODE> et appelez-le comme
Essayez supprimer tous les textes de modèle em> du fichier JSP. Par exemple, 1 <%@
2 ....
3 %>
4 <%
5 ....
6 %>
Assurez-vous que l'élimination de toutes les sorties de votre Par exemple, si vous avez ces déclarations ... p> ... Vous devriez les écrire de cette façon p> Si vous souhaitez regarder le code de servlet compilé, vous ne devez pas voir meilleur Way serait de changer votre View_Image.jsp code>. Les pauses de ligne simples peuvent être responsables de la production génératrice. out.write ("\ r \ n") code> avant la réponse de votre image. P> View_Image.jsp code> 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. P> P>
(Mon) Intellij le rend automatiquement, merci d'avoir souligné!
Essayez cela, ce n'est pas le meilleur des solutions, mais cela fonctionne. où "in" est l'INPUTStream (si vous l'utilisez), "OUT2" est le nouveau réponse .getoutoutPutStream () code> et "out" est le Par défaut jspwriter code>. p> p>
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 () code> avant: out.clear () < / Code> m'a également aidé à vous débarrasser de toutes ces lignes vides à partir de <% @ page importer = ... code> et similaire. p> p> p>
Désolé mais je viens de regarder la documentation, et je ne trouve pas de méthode code> Effacer code> dans la classe code> SERVLEOutPutStream code> classe?
En fait, dans une variable présente dans le JSP;) cela fonctionne parfaitement pour moi merci pour cela.
<%@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();}
%>
Il vaut mieux si vous ajoutez des explications à votre réponse afin d'aider les autres à comprendre les problèmes / erreurs.
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. p>
Étant donné que chaque demande passera par filtre et basé sur Java API Doc: P>
"Soit cette méthode (GetWriter ()) ou getOutputtream () peut être appelé à écrire le corps, pas à la fois. " P>
C'est la raison pour laquelle nous avons eu la" java.lang.illegalstateException: getOutputStream () a déjà été appelé pour cette réponse "Exception. p>
Donc, dans ce filtre, j'ai changé le code sur: p> IT corrigé ce problème pour moi. P> p >
au printemps, vous pouvez résoudre ce problème de modification de à p>
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;
}
Si vous faites face à ce problème dans des servlets, alors en envoyant la réponse au navigateur du servlet:
PrintWriter out=response.getWriter();