2009-11-21 14 views
49

मैं त्रुटि संदेश getOutputStream() has already been called for this response और कई लोगों ने कहा कि यह स्थान या न्यू लाइन <% या %> के बाद की वजह से है गूगल के लिए बुलाया गया है, लेकिन मेरे कोड में, वहाँ कोई एक अंतरिक्ष या एक नई पंक्ति है । मैं linux पर tomcat6 का उपयोग कर रहा हूँ।getOutputStream() पहले से ही इस प्रतिक्रिया

<%@ 
    page import="java.servlet.*, 
    javax.servlet.http.*, 
    java.io.*, 
    java.util.*, 
    com.lowagie.text.pdf.*, 
    com.lowagie.text.*" 
    %><% 
    response.setContentType("application/pdf"); 
    Document document = new Document(); 
    try{ 
     ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
     PdfWriter.getInstance(document, buffer); 
     document.open(); 
     PdfPTable table = new PdfPTable(2); 
     table.addCell("1"); 
     table.addCell("2"); 
     table.addCell("3"); 
     table.addCell("4"); 
     table.addCell("5"); 
     table.addCell("6"); 
     document.add(table); 
     document.close(); 
     DataOutput dataOutput = new DataOutputStream(response.getOutputStream()); 
     byte[] bytes = buffer.toByteArray(); 
     response.setContentLength(bytes.length); 
     for(int i = 0; i < bytes.length; i++) 
     { 
     dataOutput.writeByte(bytes[i]); 
     } 
    }catch(DocumentException e){ 
     e.printStackTrace(); 
    } 

%> 

~

org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response 
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:410) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

मूल कारण

java.lang.IllegalStateException: getOutputStream() has already been called for this response 
    org.apache.catalina.connector.Response.getWriter(Response.java:610) 
    org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198) 
    org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) 
    org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) 
    org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:188) 
    org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118) 
    org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77) 
    org.apache.jsp.Account.Domain.testPDF_jsp._jspService(testPDF_jsp.java:94) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

उत्तर

43

ठीक है, यदि आप एक सर्वलेट नहीं एक JSP का उपयोग करना चाहिए, लेकिन क्या तुम सच में करने के लिए ... अपने पेज के शीर्ष पर इस निर्देश को जोड़ने की जरूरत है:

<%@ page trimDirectiveWhitespaces="true" %> 

या JSP-config अनुभाग में अपने web.xml

<jsp-config> 
    <jsp-property-group> 
    <url-pattern>*.jsp</url-pattern> 
    <trim-directive-whitespaces>true</trim-directive-whitespaces> 
    </jsp-property-group> 
</jsp-config> 

इसके अलावा flush/closeOutputStream और जब किया लौटने।

dataOutput.flush(); 
dataOutput.close(); 
return; 
+3

क्या आपने सत्यापित किया है कि यह काम करता है? मुझे संदेह है कि इससे कोई फर्क पड़ेगा, पेज सामग्री के बावजूद कंटेनर अभी भी 'getWriter' को कॉल करने जा रहा है। – skaffman

+0

नहीं, ऐसा नहीं है कि '<% %>' के बाहर बिल्कुल कोई सफेद जगह नहीं है। हालांकि यह कार्यान्वयन-विशिष्ट व्यवहार हो सकता है जिसे मैं पूरी तरह से भरोसा नहीं करता। जहां तक ​​मुझे पता है कि यह टॉमकैट में ठीक काम करेगा। लेकिन फिर, जावा कोड जावा वर्गों में है, जेएसपी फाइलों में नहीं। अवधि। – BalusC

+0

मैं यह उल्लेख करना भूल गया कि trimDirectiveWhitespaces निर्देश जेएसपी 2.1 या बेहतर – RealHowTo

31

यहां मुद्दा यह है कि अपने JSP प्रतिक्रिया OutputStream के लिए सीधे बात कर रही है है। यह तकनीकी रूप से प्रतिबंधित नहीं है, लेकिन यह बहुत अच्छा विचार नहीं है।

विशेष रूप से, आप response.getOutputStream() पर कॉल करते हैं और उस पर डेटा लिखते हैं। बाद में, जब जेएसपी इंजन प्रतिक्रिया को फ्लश करने की कोशिश करता है, तो यह विफल हो जाता है क्योंकि आपके कोड ने पहले से ही "दावा" किया है। कोई भी आवेदन किसी भी प्रतिक्रिया पर getOutputStream या getWriter पर कॉल कर सकता है, इसे दोनों करने की अनुमति नहीं है। जेएसपी इंजन getWriter का उपयोग करते हैं, और इसलिए आप getOutputStream पर कॉल नहीं कर सकते हैं।

आपको यह कोड एक सर्वलेट के रूप में लिखना चाहिए, न कि जेएसपी। जेएसपी जेएसपी में निहित पाठ आउटपुट के लिए वास्तव में उपयुक्त हैं। आप देख सकते हैं कि आपके जेएसपी में कोई वास्तविक टेक्स्ट आउटपुट नहीं है, इसमें केवल जावा शामिल है।

+0

पूरी परियोजना jsp आधारित है, मैं तो बस पीडीएफ डाउनलोड के लिए कार्यक्षमता जोड़ने की जरूरत है – Southsouth

+4

वैसे आप नहीं, तो इस तरह नहीं कर सकते हैं। जेएसपी पाठ के लिए हैं, बाइनरी नहीं। – skaffman

+4

+1। जावा जावा कोड में जावा जावा कोड है। केवल जेएसपी में टैगलिब्स/ईएल का प्रयोग करें। यदि टैगलिब्स/ईएल के साथ संभव नहीं है, तो सर्वलेट का उपयोग करें। – BalusC

2

जेएसपी प्रेजेंटेशन फ्रेमवर्क है, और आमतौर पर इसमें कोई प्रोग्राम तर्क नहीं होना चाहिए। जैसे-जैसे स्काफमैन ने सुझाव दिया था कि आप जो चाहते हैं उसे प्राप्त करने के लिए शुद्ध सर्लेट, या किसी भी एमवीसी वेब ढांचे का उपयोग करें।

3

इसी तरह के मामले में मेरे लिए क्या काम किया गया है।

ServletOutputStream में लिखने के बाद बस response.sendRedirect("yourPage.jsp"); पर कॉल करें। इससे ब्राउजर से नए अनुरोध की शुरुआत होगी, इसलिए उसी आउटपुट स्ट्रीम में लिखने से बचें।

6

जब JSP इंजन()

out.clear(); // where out is a JspWriter 
out = pageContext.pushBody(); 

के रूप में उल्लेख किया गया है getWriter के माध्यम से प्रतिक्रिया flushes त्रुटि दिखाई देने से बचने के लिए ट्राई/कैच के अंत के अंदर निम्नलिखित जोड़े, इस सबसे अच्छा अभ्यास नहीं है , लेकिन यह आपके लॉग में त्रुटियों से बचाता है।

0

यह त्रुटि मेरे प्रोग्राम में हो रही थी क्योंकि परिणाम डेटाबेस के मुकाबले पीडीएफ दस्तावेज़ में प्रदर्शित होने के लिए अधिक कॉलम कॉल कर रहा था। उदाहरण के लिए, तालिका में 30 फ़ील्ड हैं लेकिन प्रोग्राम 35 कॉल कर रहा था (परिणामसेट।GetString (35))

3

मुझे बस इस समस्या का सामना करना पड़ा।

समस्या मेरे नियंत्रक विधि के कारण स्ट्रिंग (दृश्य नाम) लौटने के प्रयास के कारण हुई थी। जब विधि बाहर निकल जाएगी, तो दूसरी प्रतिक्रिया धारा शुरू की जाएगी।

नियंत्रक विधि वापसी प्रकार बदलना शून्य समस्या का समाधान किया।

मुझे आशा है कि इस मदद करता है किसी और को इस समस्या का अनुभव करता है।

3

मुझे यह समस्या केवल दूसरी बार निर्यात करने के लिए गई थी। एक बार मैंने जोड़ा:

response.getOutputStream().flush(); 
response.getOutputStream().close(); 

निर्यात के बाद, मेरा कोड हर समय काम करना शुरू कर दिया।

+0

JSP एचटीएमएल सामान मुद्रण के लिए इसे खोलने के लिए करना चाहता है, तो यह खोलता है अपने पिछले% के बाद> – ern0

0

मैं एक request.getRequestDispatcher(path).forward(request, response); से पहले response.getWriter() उपयोग करके एक ही त्रुटि मिली। तो काम करता है ठीक शुरू जब मैं यह द्वारा response.getOutputStream()

0

उपयोग Glassfish 4.0 के बजाय बदल दें। यह केवल ग्लासफ़िश 4.1.1 रिलीज में एक समस्या है।

पीटी बीआर: उपयोग ओ Glasfish 4.0। Este parece ser um problema apenas no Glassfish 4.1.1।

+0

आप इस के लिए एक बग रिपोर्ट लिंक है? – Robert

-1

कुछ मामलों में इस मामले तब होता है जब आप घोषित करने या RequestDispatcher उपयोग करने के बाद

Writer out=response.getWriter 

घोषणा करते हैं।

मुझे LoginServlet बनाने के दौरान इसी तरह की समस्या का सामना करना पड़ा, जहां मैंने RequestDispatcher घोषित करने के बाद Writer परिभाषित किया है।

कोशिश RequestDispatcher कक्षा से पहले Writer वर्ग वस्तु को परिभाषित।

संबंधित मुद्दे