HttpServletRequest request这个对象,应该是与某个请求直接相关的,所以他会在过滤器,include,forward的直接相关的处理代码里进行传递。在这个请求处理完毕后,request应该被释放,由容器决定是否重用,还是被垃圾回收。如果我们把某个request保存到了其它的非request的scope里面,比如 session里面,或者某个 static的 对象里面,这样的话,容器就无法重用这个对象了(如果重用,后果严重),同时也不可能垃圾回收,因为你的代码还用着呢!

解决方案 »

  1.   

    HttpServletRequest request这个对象,应该是与某个请求直接相关的,所以他会在过滤器,include,forward的直接相关的处理代码里进行传递。在这个请求处理完毕后,request应该被释放,由容器决定是否重用,还是被垃圾回收。如果我们把某个request保存到了其它的非request的scope里面,比如 session里面,或者某个 static的 对象里面,这样的话,容器就无法重用这个对象了(如果重用,后果严重),同时也不可能垃圾回收,因为你的代码还用着呢!
      

  2.   

    谢谢大版主。HttpServletRequest request这个对象,应该是与某个请求直接相关的,所以他会在过滤器,include,forward的直接相关的处理代码里进行传递。在这个请求处理完毕后,request应该被释放,由容器决定是否重用,还是被垃圾回收。这些明白。
    我想知道的是:这个request对象被使用完了之后,容器决定重用,
    那么是怎样重用的。
    我的意思,request里封装了从客户端传过来的请求内容,每次请求的内容不同,
    那我怎样重用这个使用过的request对象来对新的请求进行处理呢?如果我们把某个request保存到了其它的非request的scope里面,比如 session里面,或者某个 static的 对象里面,这样的话,容器就无法重用这个对象了(如果重用,后果严重),同时也不可能垃圾回收,因为你的代码还用着呢! 如果我持有这个request的引用,容器就无法重用这个对象了。
    那么,现在除了我就没有任何人(容器)去使用这个request对象了。那我为什么不可以使用这个对象呢?
    又怎么会have indeterminate results 呢?
    我应该对这个request对象了解才对啊。
      

  3.   

    参看HttpServletRequest接口的源码:
    基本上都是get****(),或者is****()的方法。
    假设重用的时候,是把request的成员变量重新赋值,接口中并没有定义这些赋值的方法,
    如果有这些赋值的方法,明显的,开发人员同样可以使用,这样不合理。要么就是用反射直接改变成员变量的值?
    赋过值后,再去使用这个在前次请求中生成的request对象?
    如果这样的话,岂不是对于容器和实现HttpServletRequest接口的类的设计有很大的制约?希望谁给解惑下啊?到底怎么重用?
      

  4.   

    这个。。不懂。
    不过既然是容器来重用(recycle是重用还是回收????)request那么应该找来个容器的源码看看才行。
    找到个文章写了tomcat的request的recycle方法
    http://www.blogjava.net/hk2000c/archive/2007/10/27/156388.html
    不过持方法里全调用的其他对象的recycle方法
      

  5.   

    你是以你的request的引用的方式你去使用。是可以的。但是你在其他的对象或者方式就当然不行了!
      

  6.   

    recycle有反复使用,重复利用的意思。
    如果说是回收的话,可能是把它的所有属性重新设置为默认的,
    然后再重新赋值。嗯,经你提醒,
    刚看了源码,
    确实有很多set***()方法的具体实现。
    对于我们,屏蔽了这些接口。