- 動作類生命周期:
明確:動作類是多例的,每次訪問動作方法時,動作類都會實例化,所以是線程安全的。 - 請求動作的數據存放:
我們的問題:
每次請求時,都會產生一些請求數據,這些數據都存放在什么地方了呢?
首先我們要明確一點:
在每次執行動作前,核心控制器StrutsPrepareAndExecuteFilter都會創建一個ActionContext和ValueStack對象。且每次訪問動作都會創建。
這兩個對象存儲了整個動作訪問期間用到的數據。并且把數據綁定到了線程局部變量(ThreadLocal)上了。所以線程是安全的。
Context Map是OGNL的上下文ActionContext ValueStack
包含以下方面:
- ActionContext 一個Map,這就類似于keyedHandler結構
- application 是一個Map,封裝著應用域的屬性
- session 是一個Map,封裝著會話域的屬性
- request 是一個Map,封裝著請求域的屬性
- parameters 是一個Map,封裝著請求正文(參數)的屬性
- attr 是一個Map,封裝著四個域中的所有屬性
- value stack(root)
- action(the current action) 當前動作的引用