`
lichangwei
  • 浏览: 74933 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

getOutputStream() has already been called for this

    博客分类:
  • jsp
阅读更多
摘自:http://cid-e1a9d43fd56a4641.spaces.live.com/Blog/cns!E1A9D43FD56A4641!114.entry
java.lang.IllegalStateException: getOutputStream() has already been called for this response
tomcat有此现象,weblogic下没有
原因:
在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后有一段这样的代码
finally{
   if (_jspxFactory != null)
      _jspxFactory.releasePageContext(_jspx_page_context);
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和responsegetOutputStream()相冲突的!所以会出现以上这个异常。
解决办法:
在使用完输出流以后调用以下两行代码即可:
out.clear();
out = pageContext.pushBody();

API:
public java.io.PrintWriter getWriter()
    throws java.io.IOException
Returns a PrintWriter object that can send character text to the client. The PrintWriter uses the character encoding returned by getCharacterEncoding(). If the response's character encoding has not been specified as described in getCharacterEncoding (i.e., the method just returns the default value ISO-8859-1), getWriter updates it to
ISO-8859-1. Calling flush() on the PrintWriter commits the response.
Either this method or getOutputStream() may be called to write the body, not both.
  Returns:
     a PrintWriter object that can return character data to the client
Throws:
    UnsupportedEncodingException - if the character encoding returned by getCharacterEncoding cannot be used
java.lang.IllegalStateException - if the getOutputStream method has already been called for this response object
   java.io.IOException - if an input or output exception occurred
See Also:
  getOutputStream(), setCharacterEncoding(java.lang.String)
如API所言,由于ServletResponse.getOutputStream()方法和该方法都有可能被调用,来输出JSP页面的内容,如果其中的一个方法被调用了,再调用另一个方法就会抛
出异常。
解决方法如下:
out.clear():清空缓存的内容。
pageContext.pushBody():参考API

public BodyContent pushBody()
Return a new BodyContent object, save the current "out" JspWriter, and update the value of the "out" attribute in the page scope attribute namespace of the PageContext.
Returns:  the new BodyContent
·返回一个新的BodyContent(代表一个HTML页面的BODY部分内容)
·保存JspWriter实例的对象out
·更新PageContext的out属性的内容

This exception also may caused by there are some space character between <%..%> and <%..%> in jsp.
分享到:
评论

相关推荐

    getOutputStream() has already been called for this response 错误解决

    在Java Web开发中,"getOutputStream() has already been called for this response" 是一个常见的错误,通常出现在使用Servlet或JSP时。这个错误意味着在HTTP响应中,`getOutputStream()`已经被调用,然后尝试再次...

    tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

    1.在tomcat6.0下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法  在tomcat6.0下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有...

    java.lang.IllegalStateException: getOutputStream() has already解决办法

    纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....

    验证码出现getOutputStream()问题解决

    验证码出现getOutputStream() has already been called for this response错误解决

    JSP彩色验证码

    解决了getOutputStream() has already been called for this response. 并将产生验证码的逻辑从JSP页面中分离出来,单独写了一个类 便于重用。

    Cannot forward after response has been committed

    "Cannot forward after response has been committed" 是一个在Java Web开发中常见的错误,通常与Servlet、Filter或控制器逻辑有关。这个错误表明服务器已经完成了对HTTP响应的处理,并将其发送到客户端,然后试图...

    handleStream ServletOutputStream out = response.getOutputStream(); InputStream i

    `getOutputStream()` 方法就是从中获取一个输出流,这个流将用于向客户端发送响应内容。 `ServletOutputStream` 实例化后,我们可以通过调用它的`write()` 方法来写入字节数据。例如,如果我们在一个Servlet中想要...

    servlet2.4doc

    Returns a boolean indicating whether the named response header has already been set. contextDestroyed(ServletContextEvent) - Method in interface javax.servlet.ServletContextListener Notification ...

    java.lang.IllegalStateException: OutputStream already obtain

    标题 "java.lang.IllegalStateException: OutputStream already obtain" 涉及到的是Java编程中的一个常见错误,特别是当处理I/O流时。这个异常通常在尝试获取已经存在的OutputStream实例时抛出,表明该输出流已经被...

    rxtx for java.zip

    6. **读写数据**:通过`SerialPort`对象的`getInputStream()`和`getOutputStream()`方法获取输入流和输出流,然后可以使用Java的I/O操作进行串口通信。 7. **关闭串口**:完成通信后,记得调用`SerialPort.close()`...

    验证码(网页中用到的)

    * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server ...

    用java来实Ntalk聊天工具.doc

    DataOutputStream outToClient = new DataOutputStream(connectionSocket[i].getOutputStream()); outToClient.writeBytes("UNIX&gt;Ntalk " + inet.getHostAddress() + '\n'); outToClient.writeBytes("Server:Red_...

    Java高级课程设计--网络聊天室

    this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { try { MsgBean bean = new MsgBean(); bean.setType("请求下线"); bean.setSource(ClientFrame...

    QQ Server 端代码

    BufferedWriter wrbuf = new BufferedWriter(new OutputStreamWriter(s1.getOutputStream())); wrbuf.write("false\n"); wrbuf.flush(); }else{ Socket s2 = clients.get(str[0]); ...

    android 串口驱动

    if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) { throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); throw new ...

    TcpClient for MAC Android Studio

    2. **数据传输**:连接建立后,通过Socket的`getOutputStream()`获取输出流,使用`getInputStream()`获取输入流。然后,可以使用`DataOutputStream`和`DataInputStream`进行字节级别的读写操作,或者使用`...

    可群发,冒号加客户号可指定用户发送的java聊天程序

    outputS = new ObjectOutputStream(connection.getOutputStream()); beConnected = true; } catch (IOException e) { System.out.println("无法获取连接的输入输出流"); } } ...

Global site tag (gtag.js) - Google Analytics