论ThreadLocal

Web 应用程序开发中, 我们往往也需要在 Action 里直接获取请求 (Request) 或会话( Session )的一些信息 , 甚至需要直接对 Http Servlet 的请求( HttpServletRequest )、响应 (HttpServletResponse) 进行操作。先参照一下webwork的ActionContext 实现:
public class ActionContext implements Serializable {  
        static ThreadLocal actionContext = new ActionContextThreadLocal();  
	public static final String SESSION = "com.opensymphony.xwork.ActionContext.session";  
    
	private static class ActionContextThreadLocal extends ThreadLocal {  
	protected Object initialValue() {  
        OgnlValueStack vs = new OgnlValueStack();    
           return new ActionContext(vs.getContext());  
        }  
} 
 
我们在 Action 中取得 request ,session “ username ”的值时通过:
//get request scope value
Map params = ActionContext.getContext().getParameters();
String username = (String) params.get("username"); 
//get session scope value
Map session = ActionContext.getContext().getSession();
String username = (String) params.get("username"); 
 

 

ActionContext com.opensymphony.xwork.ActionContext )是 Action 执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个 Map 而已),它存放放的是 Action 在执行时需要用到的对象
一般情况,我们的 ActionContext 都是通过: ActionContext context = (ActionContext) actionContext.get(); 来获取的。我们再来看看这里的 actionContext 对象的创建: static ThreadLocal actionContext = new ActionContextThreadLocal(); ActionContextThreadLocal 是实现 ThreadLocal 的一个内部类。 ThreadLocal 可以命名为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样,我们 ActionContext 里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。


我们再来看一下Acegi的实现
在一个RequestServletListener,然后在每次request时,从session中取得UserBean,置到ThreadLocal中,这样在业务层就可以直接取用了。



ThreadLocal则相当于多个线程的一个共享全局变量存储地,它里面保存的是和每个线程相关的状态。所以threadLocal是为线程服务的,和线程处于一个底层位置。
正因为Spring/Hibernate这些框架对于状态处理短处,所以才只能透过Web容器的request等状态封装,直接到底层操作与线程同一层次的threadLocal。
Request是客户端发出的一个请求,这个request的载体就是一个线程,实际等同于一个线程的生命周期。Request是封装在线程上面一个抽象概念。当一个线程或request结束时,threadlocal中的状态就没有了,所以threadLocal基本类似request.setAttribute作用,threadLocal中的对象状态的生命周期等同于request.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值