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>