[TOC]
# 介紹
我們使用valueStack的主要目的是為我將我們action中產生的數據攜帶到頁面上,也就是說valueStack它就是一個容器。
在Struts2框架中將valueStack設計成一個接口。
com.opensymphony.xwork2.util.ValueStack
我們主要使用的是它的實現類
com.opensymphony.xwork2.ognl.OgnlValueStack。
當客戶端向我們發送一個請求,服務器就會創始一個Action來處理請求,struts2中的action是一個多例,每一次請求都會有一個新的action對應。所以它不存在線程安全問題。
一個valueStack對應一個action,valueStack貫穿整個action的生命周期。
`request-------Action------ValueStack`
struts2框架將valueStack保存在request中

# valueStack內部結構

valueStack主要有兩部分組成:
CompoundRoot:它就是一個ArrayList
它主要存儲的是action的相關數據
`Map<String,Object> context`:就是一個Map

Context中主要存儲了一些引用,這個引用主要是關于web開發中相關信息
pameters :請求參數
request:請求對象中所有屬性
session:會話對象中所有屬性
application:application對象中的所有對象
以上都是Map


在struts2框架中我們通過ognl表達式來獲取valueStack中數據,沒有使用#就會從CompoundRoot中獲取數據,
如果使用#來獲取,這時就會從context中來獲取.
# 獲取ValueStack

# ActionContext是什么
ActionContext它是action上下文,strtus2框架它使用actionContext來保存Action在執行過程中所需要的一些對象,例如 session, application…
ActionContext的獲取 是通過它的靜態方法getContext()得到。
Struts2會根據每一次的http請求來創建對應的ActionContext,它是與當前線程綁定的。
每一次請求,就是一個線程,對應著一個request,每一次請求,會創建一個Action,每一個action對應一個ActionContext.每一次請求也對應著一個valueStack.
`request---ActionContext----Action-----ValueStack`它們都對應著一次請求(一個線程).
valueStack與ActionContext本質上是可以獲取

# valueStack操作---存儲數據
注意:我們使用valueStack來存儲數據時,主要是向root中存儲。
介紹兩部分:
## 手動向valueStack存儲數據

## Struts2框架自動向valueStack中存儲數據
每次請求,訪問action,這個對象會存儲到valueStack中。
在DefaultActionInvocation的init方法內

# valueStack操作-獲取數據

Action中屬性


使用模型驅動



# EL表達式從valueStack中獲取數據
El表達式可以從valueStack中獲取信息

- 基礎
- 編譯和安裝
- scanner類(鍵盤錄入)
- Random類(隨機數)
- 數組
- 方法
- 類
- ArrayList集合
- char與int
- eclipse
- IDEA
- 變量與常量
- 常用API
- String,StringBuffer,StringBuilder
- 正則,Date,DateFormat,Calendar
- 包裝類,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增強for,泛型
- List,set,判斷集合唯一
- map,Entry,HashMap,Collections
- 異常
- IO
- File
- 遞歸
- 字節流
- 字符流
- IO流分類
- 轉換流
- 緩沖流
- 流的操作規律
- properties
- 序列化流與反序列化流
- 打印流
- commons-IO
- IO流總結
- 多線程
- 線程池
- 線程安全
- 線程同步
- 死鎖
- lock接口
- ThreadLoad
- 等待喚醒機制
- 線程狀態
- jdbc
- DBUtils
- 連接池DBCP
- c3p0連接池
- 網絡編程
- 多線程socket上傳圖片
- 反射
- xml
- 設計模式
- 裝飾器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事務
- 監聽器Listener
- 過濾器Filter
- json
- linux安裝軟件
- 反射詳解
- 類加載器和注解
- 動態代理
- jedis
- Hibernate
- 簡介
- 創建映射文件
- Hibernate核心配置文件
- 事務和增刪改查
- HibernateUtils
- 持久化對象的三種狀態
- 檢索方式
- query
- Criteria
- SQLQuery
- 持久化類
- 主鍵生成策略
- 緩存
- 事務管理
- 關系映射
- 注解
- 優化
- struts2
- 搭建
- 配置詳解
- Action
- 結果跳轉方式
- 訪問ServletAPI方式
- 如何獲得參數
- OGNL表達式
- valueStack 值棧
- Interceptor攔截器
- spring
- 導包
- IOC和DI
- Bean獲取與實例化
- Bean屬性注入
- spring注解
- 注解分層
- junit整合
- aop
- 動態代理實現
- cglib代理實現
- aop名詞
- spring的aop
- aop-xml詳解
- aop-注解詳解
- 代理方式選擇
- jdbcTemplate
- spring事務管理
- 回滾注意
- 事務傳播屬性
- MyBatis
- MyBatis簡介
- 入門程序
- 與jdbc hibernate不同
- 原始Dao開發
- Mapper動態代理方式
- SqlMapConfig.xml配置文件
- 輸入參數pojo包裝類
- resultMap
- 動態sql
- 一對一關聯
- 一對多
- 整合spring
- 逆向工程
- maven
- maven簡介
- 倉庫
- maven目錄結構
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入門程序
- 整合struct
- 依賴范圍
- 添加插件
- idea配置
- jar包沖突
- 分模塊開發
- 構建可執行的jar包(包含依賴jar包)
- springMVC
- 處理流程
- java面試
- java版本升級
- java1-8版本變更
- java9新特性
- 鎖
- java資料
- idea
- jdk版本切換
- log4j
- 入門實例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代碼優化