HttpServletRequest request这个对象,应该是与某个请求直接相关的,所以他会在过滤器,include,forward的直接相关的处理代码里进行传递。在这个请求处理完毕后,request应该被释放,由容器决定是否重用,还是被垃圾回收。如果我们把某个request保存到了其它的非request的scope里面,比如 session里面,或者某个 static的 对象里面,这样的话,容器就无法重用这个对象了(如果重用,后果严重),同时也不可能垃圾回收,因为你的代码还用着呢!
解决方案 »
- spring
- jsp中包含一个servlet如何写路径?
- 网页提取test1.txt显示乱码
- struts 标签不能解析
- 求解一个很难得小题目
- struts连接tomcat数据源连接池 代码如何写效率最高?等~~
- 问下大家一个感觉有点无知的有关filter创建的问题
- 为什么第二次执行rs = stmt.executeQuery(sql);时会没反应?
- 输入检测 select multiple="true"
- 请教大狭怎么jndi.fscontext.RefFSContextFactory老报错?
- 高分求助:请问Spring做单元测试的时候如果通过mock虚拟jndi数据源呢?
- struts中的DynaValidatorActionForm的问题
我想知道的是:这个request对象被使用完了之后,容器决定重用,
那么是怎样重用的。
我的意思,request里封装了从客户端传过来的请求内容,每次请求的内容不同,
那我怎样重用这个使用过的request对象来对新的请求进行处理呢?如果我们把某个request保存到了其它的非request的scope里面,比如 session里面,或者某个 static的 对象里面,这样的话,容器就无法重用这个对象了(如果重用,后果严重),同时也不可能垃圾回收,因为你的代码还用着呢! 如果我持有这个request的引用,容器就无法重用这个对象了。
那么,现在除了我就没有任何人(容器)去使用这个request对象了。那我为什么不可以使用这个对象呢?
又怎么会have indeterminate results 呢?
我应该对这个request对象了解才对啊。
基本上都是get****(),或者is****()的方法。
假设重用的时候,是把request的成员变量重新赋值,接口中并没有定义这些赋值的方法,
如果有这些赋值的方法,明显的,开发人员同样可以使用,这样不合理。要么就是用反射直接改变成员变量的值?
赋过值后,再去使用这个在前次请求中生成的request对象?
如果这样的话,岂不是对于容器和实现HttpServletRequest接口的类的设计有很大的制约?希望谁给解惑下啊?到底怎么重用?
不过既然是容器来重用(recycle是重用还是回收????)request那么应该找来个容器的源码看看才行。
找到个文章写了tomcat的request的recycle方法
http://www.blogjava.net/hk2000c/archive/2007/10/27/156388.html
不过持方法里全调用的其他对象的recycle方法
如果说是回收的话,可能是把它的所有属性重新设置为默认的,
然后再重新赋值。嗯,经你提醒,
刚看了源码,
确实有很多set***()方法的具体实现。
对于我们,屏蔽了这些接口。