struts2中的值栈对象ValueStack
Posted @想太多先森
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2中的值栈对象ValueStack相关的知识,希望对你有一定的参考价值。
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>
以上是关于struts2中的值栈对象ValueStack的主要内容,如果未能解决你的问题,请参考以下文章
Struts2剖析Struts2中的反射技术 ValueStack(值栈)