请教关于servlet2.4规范中的一句话的理解。

bzwm 2009-02-26 03:42:21
servlet2.4规范中有这么一句话,对于红色字体部门不是很理解。
帮解释一下。

1.容器怎样能重用request objects呢?另外,是怎样的request objects才可以被recycle呢?

2.对于最后一句话,如果我在outside the scope的地方通过这个request对象引用使用它,会怎样呢?

谢谢!
SRV.4.10 Lifetime of the Request Object

Each request object is valid only within the scope of a servlet’s service method, or within the scope of a filter’s doFilter method. Containers commonly recycle request objects in order to avoid the performance overhead of request object creation.
The developer must be aware that maintaining references to request objects outside the scope described above is not recommended as it may have indeterminate
results.
...全文
203 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
思無芷盡 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bzwm 的回复:]
谢谢大版主。

HttpServletRequest request

这个对象,应该是与某个请求直接相关的,所以他会在过滤器,include,forward的直接相关的处理代码里进行传递。

在这个请求处理完毕后,request应该被释放,由容器决定是否重用,还是被垃圾回收。

这些明白。
我想知道的是:这个request对象被使用完了之后,容器决定重用,
那么是怎样重用的。
我的意思,request里封装了从客户端传过来的请求内容,每次请求的内容…
[/Quote]
你是以你的request的引用的方式你去使用。是可以的。但是你在其他的对象或者方式就当然不行了!
fulianglove 2009-02-27
  • 打赏
  • 举报
回复
这个。。不懂。
不过既然是容器来重用(recycle是重用还是回收????)request那么应该找来个容器的源码看看才行。
找到个文章写了tomcat的request的recycle方法
http://www.blogjava.net/hk2000c/archive/2007/10/27/156388.html
不过持方法里全调用的其他对象的recycle方法。。。。。。
bzwm 2009-02-27
  • 打赏
  • 举报
回复
参看HttpServletRequest接口的源码:
基本上都是get****(),或者is****()的方法。
假设重用的时候,是把request的成员变量重新赋值,接口中并没有定义这些赋值的方法,
如果有这些赋值的方法,明显的,开发人员同样可以使用,这样不合理。

要么就是用反射直接改变成员变量的值?
赋过值后,再去使用这个在前次请求中生成的request对象?
如果这样的话,岂不是对于容器和实现HttpServletRequest接口的类的设计有很大的制约?

希望谁给解惑下啊?到底怎么重用?
bzwm 2009-02-27
  • 打赏
  • 举报
回复
分太少?
bzwm 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fulianglove 的回复:]
这个。。不懂。
不过既然是容器来重用(recycle是重用还是回收????)request那么应该找来个容器的源码看看才行。
找到个文章写了tomcat的request的recycle方法
http://www.blogjava.net/hk2000c/archive/2007/10/27/156388.html
不过持方法里全调用的其他对象的recycle方法。。。。。。
[/Quote]
recycle有反复使用,重复利用的意思。
如果说是回收的话,可能是把它的所有属性重新设置为默认的,
然后再重新赋值。

嗯,经你提醒,
刚看了源码,
确实有很多set***()方法的具体实现。
对于我们,屏蔽了这些接口。
myqq1796 2009-02-26
  • 打赏
  • 举报
回复
容器通常会回收请求对象以避免重复创建请求对象的行为。
bzwm 2009-02-26
  • 打赏
  • 举报
回复
谢谢大版主。

HttpServletRequest request

这个对象,应该是与某个请求直接相关的,所以他会在过滤器,include,forward的直接相关的处理代码里进行传递。

在这个请求处理完毕后,request应该被释放,由容器决定是否重用,还是被垃圾回收。


这些明白。
我想知道的是:这个request对象被使用完了之后,容器决定重用,
那么是怎样重用的。
我的意思,request里封装了从客户端传过来的请求内容,每次请求的内容不同,
那我怎样重用这个使用过的request对象来对新的请求进行处理呢?

如果我们把某个request保存到了其它的非request的scope里面,比如 session里面,或者某个 static的 对象里面,这样的话,容器就无法重用这个对象了(如果重用,后果严重),同时也不可能垃圾回收,因为你的代码还用着呢!

如果我持有这个request的引用,容器就无法重用这个对象了。
那么,现在除了我就没有任何人(容器)去使用这个request对象了。那我为什么不可以使用这个对象呢?
又怎么会have indeterminate results 呢?
我应该对这个request对象了解才对啊。
老紫竹 2009-02-26
  • 打赏
  • 举报
回复
HttpServletRequest request

这个对象,应该是与某个请求直接相关的,所以他会在过滤器,include,forward的直接相关的处理代码里进行传递。

在这个请求处理完毕后,request应该被释放,由容器决定是否重用,还是被垃圾回收。

如果我们把某个request保存到了其它的非request的scope里面,比如 session里面,或者某个 static的 对象里面,这样的话,容器就无法重用这个对象了(如果重用,后果严重),同时也不可能垃圾回收,因为你的代码还用着呢!

老紫竹 2009-02-26
  • 打赏
  • 举报
回复
HttpServletRequest request

这个对象,应该是与某个请求直接相关的,所以他会在过滤器,include,forward的直接相关的处理代码里进行传递。

在这个请求处理完毕后,request应该被释放,由容器决定是否重用,还是被垃圾回收。

如果我们把某个request保存到了其它的非request的scope里面,比如 session里面,或者某个 static的 对象里面,这样的话,容器就无法重用这个对象了(如果重用,后果严重),同时也不可能垃圾回收,因为你的代码还用着呢!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧