java之struts2的ThreadLocal和ActionContext
在之前的学习中,我们知道struts2可以将表单中的数据自动设置到处理类的属性上,还有类型转换等其他功能。那么struts2是怎样做这件事情的呢?
struts2完成这些功能是通过拦截器来完成的,并且在这个过程中数据进行迁移的动作,数据从request对象中迁移到了处理类上。完成数据迁移是由ActionContext来完成的。
1.先学习下ThreadLocal
这个类提供了线程局部(thread-local)变量,ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
public class ThreadLocalTest { public static void main(String[] args) throws InterruptedException { //ThreadLocal是一个容器 final ThreadLocal<Integer> tl = new ThreadLocal<>(); //设置值 tl.set(20); new Thread(new Runnable() { @Override public void run() { tl.set(50); System.out.println(Thread.currentThread().getName()+"===="+tl.get()); } }).start(); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()+"======"+tl.get()); } }
执行结果:
通过以上案例可以知道,ThreadLocal中存放的数据是线程安全的。ThreadLocal是一种典型以空间换时间的办法来做到线程安全。
2.ActionContext是Action处理类执行的上下文对象
ActionContext是一个Map结构的对象,属于一个容器。ActionContext是线程安全的。并且ActionContext在struts2执行过程中负责数据的存储。
ActionContext机制是将ServletAPI中的数据进行了解耦,在Action执行过程中,struts2都从ActionContext中获取数据。那么实现线程安全,同时也降低了执行效率。
ActionContext对象中的重要的对象
另外,ThreadLocal的不错参考网址: