某个jsp页面的代码中有:....out.write(...);....response.setHeader(...);....//具体的参数我就不写了
上面的语句的执行顺序是,首先执行out.write()后执行setHeader(),但是http的响应头肯定是先于内容发送给用户的,这个响应头还会包括response.setHeader()中的值对。也就是说,虽然out.write()先于setHeader()执行,但是out.write()的执行并没有把要写入的数据立即写给客户,而是在执行完所有jsp代码后(运行完所有的setHeader后)再把内容写给用户。我的问题是jsp服务器是怎么实现这一个过程的。我想知道服务器的工作机制。谢谢大家了

解决方案 »

  1.   

    你可以看看它编译后的java代码
      

  2.   

        public void write(int c) throws IOException {
    synchronized (lock) {
        if (writeBuffer == null){
    writeBuffer = new char[writeBufferSize];
        }
        writeBuffer[0] = (char) c;
        write(writeBuffer, 0, 1);
    }
        }看到writeBuffer没想了解看源码就行了.
      

  3.   

    因为_jspService方法没有执行完,所以out.write()的执行并没有把要写入的数据立即写给客户,你可以看看一个jsp文件被编译后的servlet。要想了解服务器的工作机制可以先了解一下servlet和http的工作原理就可以了,jsp也是一种servlet,不过是为了方便阅读和修改起来方便而已。
      

  4.   

    en 看看jsp文件被编译后的servlet。 
      

  5.   

    编译后的代码我看过了的。没有过多的体现细节。sunyujia说是放进了一个固定的缓冲区,嗯,这个问题我也想过。可是我不清楚几个问题。你说是放入了一个固定的缓冲区里了,但是如果是固定的缓冲区,那么就不能解决数量很多的out.write的调用,他最终会充满整个缓冲区的。如果是可增的缓冲区,那么当要写向客户的数据很多的时候,服务器就会占用过多的内存,而且这个内存是与连接的用户成正比的,服务可能承受不了这个代价。我做了一个实验,不知道是不是对的,我写了一个向客户写入1MB数据的字符'a',可是服务器似乎没有多占用1MB的内存。我自己有tomcat4.0的源码,可是开源经验不多,找不到我想找的关键代码。
      

  6.   

    先帮楼主顶一下,
    我的想法和sunyujia兄弟的一样,流一般占用一个固定的缓冲区,
    当刷新或关闭时才会把流的数据显示出来,
    这个显示一般时系统控制,当然也可以时用户强制输出缓冲区这里应该时系统自己控制,所以才会出现上面的情况
      

  7.   

    write()的内容是刷不出来的,因为setHeader()一定要在头部加资源。
    再顶一下
      

  8.   

    问题解决了。我发现tomcat用了ByteArrayOutputStream来解决这个问题的。把之前写的数据完全缓冲。看来我之前说的做的实验是错的。呵呵,谢谢大家了