ValueStack, 即值棧對象。
值棧對象:
是整個struts數據存儲的核心,或者叫中轉站。
用戶每次訪問struts的action,都會創建一個Action對象、值棧對象、ActionContext對象; 然后把Action對象放入值棧中; 最后再把值棧對象放入request中,傳入jsp頁面。
(key: struts.valueStack); 開發者只需要通過ActionContext對象就可以訪問struts的其他的關鍵對象。 (ActionContext是給開發者用的,便於學習與使用。)
一。獲取值棧對象的兩種方式:
// 獲取值棧對象,方式1:
HttpServletRequest request = ServletActionContext.getRequest();
ValueStack vs1 = (ValueStack) request.getAttribute("struts.valueStack");
// 獲取值棧對象,方式2:
ActionContext ac = ActionContext.getContext();
ValueStack vs2 = ac.getValueStack();
System.out.println(vs1 == vs2);//true
二。值棧對象的存儲數據的原理
ValueStack vs = ac.getValueStack();
/***************操作根元素的幾種方法*****************/
// 設置數據: 入棧
//vs.push(new User(1002,"Tom")); // 棧頂
//vs.pop(); // 移除棧頂元素
// 如何存儲? map結構存儲
//vs.set("user1", new User(1,"Jacky1"));
//vs.set("user2", new User(2,"Jacky2"));
public class OgnlDemo3 extends ActionSupport{
@Override
public String execute() throws Exception {
// 測試迭代標簽
List<User> list = new ArrayList<User>();
Map<Integer,User> map = new HashMap<Integer, User>();
// 初始化
for (int i=1; i<11; i++) {
User user = new User(i,"Jack" + i);
list.add(user);
map.put(user.getId(), user);
}
// 保存到request中,是非根數據 取值時候要加#
ActionContext.getContext().getContextMap().put("list", list);
ActionContext.getContext().getContextMap().put("map", map);
return super.execute();
}
}
<body>
<br/>一、. list迭代</br>
<table border="1">
<tr>
<td>編號</td>
<td>名稱</td>
</tr>
<s:iterator var="user" value="#request.list" status="st">
<tr class=<s:property value="#st.even?'even':'odd'"/> >
<td><s:property value="#user.id"/></td>
<td><s:property value="#user.name"/></td>
</tr>
</s:iterator>
</table>
<br/>二、迭代map</br>
<table border="1">
<tr>
<td>編號</td>
<td>名稱</td>
</tr>
<s:iterator var="en" value="#request.map" status="st">
<tr>
<td><s:property value="#en.key"/></td>
<td><s:property value="#en.value.name"/></td>
</tr>
</s:iterator>
</table>
<!-- Ognl表達式可以取值,也可以動態構建集合 -->
</body>
<body>
<br/>一、.構建 list集合</br>
<s:iterator var="str" value="{'a','b'}">
<s:property value="#str"/>
</s:iterator>
<br/>一、.構建 map集合</br>
<s:iterator var="en" value="#{'cn':'China','usa':'America'}">
<s:property value="#en.key"/>
<s:property value="#en.value"/> <br/>
</s:iterator>
</body>
<body>
<!-- 頁面: 必須要拿到ValueStack -->
<br/>1. 取根元素的值<br/>
<s:property value="user.id"/>
<s:property value="user.name"/>
<s:property value="user.address"/>
<s:property value="user.address.city"/>
<s:property value="user.address.province"/>
<br/>2. 取非根元素的值<br/>
<s:property value="#request.cn"/>
<s:property value="#session.Session_data"/>
<s:property value="#application.Application_data"/> <br/>
<!-- 自動找request/session/application,找到后立刻返回 -->
<s:property value="#request_data"/>
<s:property value="#attr.Session_data"/>
<s:property value="#attr.Application_data"/> <br/>
<!-- 獲取請求的參數數據 -->
<s:property value="#parameters.userName"/>
<!-- struts的調試標簽:可以觀測值棧數據 -->
<s:debug></s:debug>
</body>

