在
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.
分享到:
相关推荐
Java 8 中的 ThreadLocal 是一个非常重要的工具类,它为每个线程提供了一个独立的变量副本,使得每个线程可以独立地改变自己的副本,而不会影响其他线程所对应的副本。这个特性在多线程编程中被广泛用于管理线程相关...
11. **并发处理**:如果公共资源模块涉及多线程操作,那么需要理解Java的并发API,如synchronized、ThreadLocal和ExecutorService,以保证线程安全。 12. **源代码+论文**的结合提供了理论与实践的双重学习机会,...
为了解决这个问题,本文提出并完善了两种高效的用户信息缓存方式:一种是通过HttpServetRequest对象缓存数据,另一种是使用ThreadLocal来保存用户信息。 HttpServetRequest对象缓存数据的核心思想是在用户请求到达...
- 多线程与并发:探讨Java并发库,如ExecutorService、Future、ThreadLocal等。 5. JSP类论文题目: JSP(JavaServer Pages)是Java Web开发的一部分,用于生成动态网页。可能的研究点有: - JSP基本元素:脚本元素...
- **性能测试与优化**:作者强调性能测试的重要性和方法论,并在Apache服务器和Tomcat这两个部分分别讲解了优化技巧,涉及并发数调整、服务端压缩、安全防护、资源管理和监控等。 #### 集群技术 - **高可用与负载...
4. **线程局部变量**:`ThreadLocal`类提供了一种线程内的局部变量,每个线程都拥有自己的一份独立副本,互不影响。 5. **volatile关键字**:它用于标记一个变量,使得多个线程可以共享这个变量,且能保证可见性和...
1. **埋点技术**:Mtrace通过在服务端代码中插入埋点代码,记录服务调用过程中的关键信息,如服务名、方法名、耗时等,并通过ThreadLocal存储同步调用上下文,通过显式调用支持异步调用上下文。 2. **数据传输**:...
例如,考察开发人员对ThreadLocal的理解、Hibernate的高级用法,以及对数据库连接的理解,可以帮助企业发现具有深厚技术功底的人才。这些技术问题的考察,不仅是对个人技术能力的检验,也是对团队整体素质的提升。它...
\n\n在系统架构中,鹰眼首先通过中间件进行埋点,利用ThreadLocal存储调用信息,实现异步写入日志,并采用采样的方式减少性能影响。一旦发生问题,可以实时抓取日志,按照Traceld汇总,然后根据不同的存储策略进行...
4. **Hibernate**:解决大部分数据库交互问题,同时深入了解Hibernate的核心概念,如ThreadLocal、inverse和cascade等,以提高使用效率。 #### 四、敏捷开发方法 为了进一步提升生产力,采用**Scrum**开发模式,并...
- **ThreadLocal类**:介绍Java中的ThreadLocal类及其使用方法。 - **线程变量管理器的实现**:实现了一个线程局部变量管理器,用于管理线程内的变量。 - **事务**: - **为什么需要事务**:为了保证数据操作的...
熟悉synchronized、volatile、ThreadLocal等并发工具类,以及ExecutorService和Future接口的应用,可以构建高效且稳定的系统。 4. **JVM优化**:理解和调整Java虚拟机(JVM)参数,如堆内存设置、垃圾回收策略等,...