Servlet之旅-Servlet中的Attribute

本文介绍了Servlet中Attribute的概念及其三种类型:ServletContext、ServletRequest和HttpSession。详细解析了它们的使用范围及注意事项,特别是针对多线程的安全问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
记得昨天提到了通过Attribute在Servlet中传递对象,今天我们就来看看在Servlet中Attribute有那几种类型,以及它们分别的使用范围和注意事项。
  其实大家可以把Servlet中的Attribute看做是一个由(String,Object)pairs组成的列表,有点象hash表,你可以通过一系列的Attribute操作来对它们进行操作,这些操作包括:getAttribute(String),setAttribute(String, Object), removeAttribute(String),getAttributeNames()。有一个要注意的是当大家用getAttribute方法时其返回值是一个object类型,需要用适合的类型转化。
  我们已经知道了我们能对Attribute进行的操作集合,那么在Servlet中到底有哪些类型提供了Attribute呢?
  在Servlet中共有三个类型具备了Attribute的能力,它们分别是ServletContext,ServletRequest,HttpSession。它们对Attribute的操作集合都是一样的,但是它们的使用范围却完全不同。Attribute的使用范围完全局限于它们的父体的可用域。
  ServletContext是全web-app共有的,他的生命周期也横跨了整个web-app的生命周期,因此ServletContext的Attribute也是全web-app共享的,而且其生命周期也是类似于ServeltContext的。
  ServletRequest是仅限于一次请求的,这次请求可能只被一个Servlet处理,也可能被初始的Servlet通过RequestDispather的forword and include方法传递到其他Servlet or jsp。
  HttpSession是仅限于一个client session的。
  我们能够看出来它们的可见范围 ServletContext > HttpSession > ServletRequest
  当大家用Attribute的时候一定要注意thread-safe问题,因为ServletContext和HttpSession都是很可能被multi-thread访问的。ServletRequest就不必被thread-safe问题困扰。有的好奇的同志问道:“为什么HttpSession会有多个请求同时访问呢?不是一个client使用同一个session吗?一个用户怎么可能同时发起多个请求呢?”,很高兴的告诉你是很有可能的,你可以设想一下下面的一个场景:一个用户对一个Servlet发起请求,在这个请求还没有返回之前,他又打开了一个新的Browse窗口,并发起了同样一个请求。oops,multithread问题是你编写Servlet是要时刻考虑的问题,isn't it?
  既然谈到了thread-safe问题,那么下次我们就来谈谈如何对Attribute编写thread-safe程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值