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>