struts2请求处理过程源代码分析(2)
2013-04-02 00:00
423 查看
转载自:http://www.see-source.com/ 源码解析网
接着上一篇继续,源码如下:
ValueStack创建时间。
静态属性actionContext是java.lang.ThreadLocal类型,一般讲是thread的局部变量。通过ThreadLocal的set()方法可以将值存储到当前线程的局部变量中,通过get()方法可以获取(访问)当前线程局部变量的值。在ActionContext内部,通过静态方法setContext()将上下文存入当前线程的局部变量中,这样在整个线程生命周期都可通过静态方法getContext()进行访问。在doFilter()方法中可以看到,生成ActionContext实例后,马上就通过setContext()将上下文存入当前线程的局部变量中。
为了上更好的理解上下文的生命周期,下面将ThreadLocal类进行简单的分析下:
ThreadLocal都会定义成静态的。
所以从这个角度可以理解为:每个ThreadLocal都是当前线程
的一个局部变量。另外,如果局部变量不存在时,通过createMap()方法为当前线程创建个
ThreadLocal.ThreadLocalMap实例,并赋值给当前线程的
threadLocals属性。
2.get()方法其实就是set的逆过程,就不说了。但其中的setInitialValue()方法看下,它的作用是初始化局部变量,当当前线程的局部变量存在时,将当前的ThreadLocal下的值置null,initialValue()方法只是返回个null;当当前线程的局部变量不存在时,创建个,并将当前的ThreadLocal下的值置null。
其实,在早期的jdk版本中ThreadLocal并非是这样实现,Thread中并没有threadLocals属性,而是通过在ThreadLocal中维护一个Map,Map的key值就是当前线程,value值就是我们要存入的值。
接着上一篇继续,源码如下:
public class ActionContext implements Serializable { static ThreadLocal actionContext = new ThreadLocal(); Map<String, Object> context; public ActionContext(Map<String, Object> context) { this.context = context; } public static void setContext(ActionContext context) { actionContext.set(context); } public static ActionContext getContext() { return (ActionContext) actionContext.get(); } public void setSession(Map<String, Object> session) { put(SESSION, session); } public Map<String, Object> getSession() { return (Map<String, Object>) get(SESSION); } public void setValueStack(ValueStack stack) { put(VALUE_STACK, stack); } public ValueStack getValueStack() { return (ValueStack) get(VALUE_STACK); } public Object get(String key) { return context.get(key); } public void put(String key, Object value) { context.put(key, value); } . . . //省略 }属性context用于存放ValueStack的上下文,其值是通过构造方法传入的。仔细看下上面的定义代码发现,方法虽然定义的不少,但都是形如getXXX()、setXXX()的方法,并且最终都是访问context的,所以可以总结出ActionContext的作用实际上只是提供了访问context的操作,而Action的上下文实际上也就是context,Action上下文的创建时间也就是
ValueStack创建时间。
静态属性actionContext是java.lang.ThreadLocal类型,一般讲是thread的局部变量。通过ThreadLocal的set()方法可以将值存储到当前线程的局部变量中,通过get()方法可以获取(访问)当前线程局部变量的值。在ActionContext内部,通过静态方法setContext()将上下文存入当前线程的局部变量中,这样在整个线程生命周期都可通过静态方法getContext()进行访问。在doFilter()方法中可以看到,生成ActionContext实例后,马上就通过setContext()将上下文存入当前线程的局部变量中。
为了上更好的理解上下文的生命周期,下面将ThreadLocal类进行简单的分析下:
public class ThreadLocal<T> { public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); } public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; } void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); } private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; } protected T initialValue() { return null; } . . . //省略 }1.先看set()方法。利用Thread.currentThread()返回当前线程,然后以当前线程为参数调用getMap()返回当前线程的局部变量(Thread的threadLocals属性)。if (map != null)局部变量存在,通过map.set(this, value)将值存入。this是当前的ThreadLocal实例,value是存入局部变量的值。可以看到ThreadLocal这里是作为了map的key值,这样不同的ThreadLocal实例获得的值是不同的,这样就是为什么一般
ThreadLocal都会定义成静态的。
所以从这个角度可以理解为:每个ThreadLocal都是当前线程
的一个局部变量。另外,如果局部变量不存在时,通过createMap()方法为当前线程创建个
ThreadLocal.ThreadLocalMap实例,并赋值给当前线程的
threadLocals属性。
2.get()方法其实就是set的逆过程,就不说了。但其中的setInitialValue()方法看下,它的作用是初始化局部变量,当当前线程的局部变量存在时,将当前的ThreadLocal下的值置null,initialValue()方法只是返回个null;当当前线程的局部变量不存在时,创建个,并将当前的ThreadLocal下的值置null。
其实,在早期的jdk版本中ThreadLocal并非是这样实现,Thread中并没有threadLocals属性,而是通过在ThreadLocal中维护一个Map,Map的key值就是当前线程,value值就是我们要存入的值。
相关文章推荐
- struts2请求处理过程源代码分析(1)
- struts2的请求处理过程源码分析
- struts2的请求处理过程源码分析
- struts2处理请求的过程分析
- struts2处理请求的过程分析
- struts2的请求处理过程源码分析
- Struts2源码分析--请求处理续
- struts2请求过程源码分析
- tomcat6源码分析三(请求处理过程)
- Struts 2.3.24源码解析+Struts2拦截参数,处理请求,返回到前台过程详析
- Struts2源码分析--请求处理
- struts2请求过程源码分析(转)
- Struts2源码分析--请求处理续二
- struts2请求过程源码分析
- 读Spring的源代码二:DispatcherServlet处理web请求的过程
- struts2 处理请求流程分析(结合源码)1
- spring的事务处理详解:调用一个方法前的事务处理过程(源代码分析)
- Struts2源码粗略分析三:请求处理流程分析
- Tomcat与Struts2处理请求过程 Hibernate基本原理 Spring基本原理
- Struts2源码分析--请求处理