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的不错参考网址:

https://www.cnblogs.com/dolphin0520/p/3920407.html

posted @ 2019-06-03 23:28  Vincent-yuan  阅读(433)  评论(0编辑  收藏  举报