ValueStack 值棧(功能類似於域對象,存取值)
1. 每一個action 都有且僅有一個值棧,可在action中存值,jsp中取值
2. **獲取值棧**:
**先得到 ActionContext,然後再 getValueStack();**
3. 內部結構分爲2部分:
1. root 結構是list集合(常用)
2. context map集合
map集合中的key都是固定值,value放的都是對象的引用值
key有:Request,session,application,parameters,attr
value: Request,session,ServletContext,傳遞參數,獲取域對象中的值(優先獲取最小範圍的域)
4. 使用struts2 標籤 <s:debug> 查看值棧結構(在action返回值配置的jsp中設置)
**1. 在action中沒有做任何操作,棧頂元素就是該action的引用**
5. 向值棧中 **存放** 數據方式:
1. 獲取值棧對象,調用值棧的set(String name,String value)方法, 值棧會生成一個HashMap對象存這個數據,然後再將hashmap引用放入值棧的list集合中
2. 獲取值棧對象,調用值棧的push(Object value)方法,然後生成該對象的引用放入值棧的list集合中
3. **在action中定義變量/聲明對象並new,生成變量/對象的get()方法**
這樣就把這個數據存到了action裏面,減少了空間浪費
6. 從值棧中** 獲取數據**
在jsp中使用Ognl+Struts2標籤 獲取數據
<s:property value="username"/>
到action中找到名稱一致的屬性(username),然後調用該屬性的get方法,就得到了
對象的值獲取:
<s:property value="user.username"/>
先到action中找到對象(user)的get方法,然後再調用對象裏面的屬性(username)的get方法,來獲取到值
List集合數據 <s:property value = list[0].username /> list中的第一個對象
<s:property value = list[1].username /> list中的第二個對象
或者配合struts標籤 <s:iterator value="list">
<s:property value="username">
</s:iterator>
就是先獲取到list集合,遍歷,每次都得到了user對象,所以直接取值username就可以了
7. EL表達式+Jstl標籤,也可以做到 在jsp中獲取值棧數據(性能低,不建議)
>原因:底層增強了request.getAttribute()方法,如果從request域中無法取到值,那就從值棧中取值,把值棧的值放到request域中,這樣EL表達式就可以取出來了
8. Ognl表達式與struts 標籤
1. ognl 的 # 使用: 通常用於取 值棧中context裏的值
>context裏主要就是域對象(request,session,servletContext),也就是說取 域對象的值,需要加上# 符號
2. 在struts**表單** 標籤中 需要 在ognl表達式前 使用 $ , 否則 無法識別ognl表達式