记得昨天提到了通过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程序。