struts2之值栈ValueStack
来源:互联网 发布:淘宝网折八百 编辑:程序博客网 时间:2024/04/29 22:41
struts会自动把Action对象放入到值栈中。放入时间为:struts2终将调用Action类的Action方法被调用时,
但在调用该方法之前:首先创建一个StrutsActionProxy对象,在创建对象之后,对其进行初始化时把Action对象放入值栈中。
在 ValueStack 对象的内部有两个逻辑部分:
ObjectStack(对象栈): Struts 把 Action 和相关对象压入 ObjectStack 中。是CompoundRoot类型,用ArrayList定义的栈。
里面保存各种喝当前Actionshili相关的对象是真正数据结构中的栈。(可以从ActionContext中获取ValueStack对象)
ContextMap(Map栈): Struts 把各种各样的映射关系(Map 对象) 压入 ContextMap 中。是OgnlContext类型,是个Map,
也是对ActionContext对象的引用,里面有:requestMap、sessionMap、ApplicationMap、paratersMap,attr。
一:值栈中的属性值:
对象栈:对象栈中某一个属性的属性值
Map栈: request、session、application的一个属性值或一个请求参数的值
二:读取对象栈中的属性值:
引用方式:object.propertyName 或 object['propertyName'] 或 object["propertyName"],
结合<s:property/>标签 <s:property value="message"/><s:property value="[0].message"/>。
(1)ObjectStack 里的栈顶对象可以用 [0] 来引用, 它下面的那个对象可以用 [1] 引用.
若希望返回栈顶对象的 message 属性值: [0].message 或 [0][“message”] 或 [0][‘message’];
(2)若在指定的对象里没有找到指定的属性, 则到指定对象的下一个对象里继续搜索.
即 [n] 的含义是从第 n 个开始搜索, 而不是只搜索第 n 个对象;
(3)若从栈顶对象开始搜索, 则可以省略下标部分;
三:读取ContextMap中的属性值
三种形式:#object.propertyName #object['propertyName'] #object["propertyName"]
例如: 返回 session 中的 code 属性: #session.code
(1)调用字段
语法:@fullyQualifiedClassName@fieldName
例如:@java.util.Calendar@DECEMBER
(2)访问数组、List集合、Map
可以使用下标访问数组中指定的元素: colors[0]
可以通过调用其 length 字段查出给定数组中有多少个元素: colors.length
(3)EL表达式
原理: Struts2 将包装 HttpServletRequest 对象后的 org.apache.struts2.dispatcher.StrutsRequestWrapper
对象传到页面上, 而这个类重写了 getAttribute() 方法.
通过代码理解一下:
Action类:public class ValueStackAction implements RequestAware{public final static String TESTSTR = "test";public String execute(){/* * 1.获取ValueStack栈 * 2.将属性值放入ValueStack中 * 3.在页面上获取 */ValueStack vs = ActionContext.getContext().getValueStack();Person p = new Person();p.setName("valuestack");vs.push(p);/* * Map栈 以request为例 *///在requestMap中放入数组String[] array = {"aaa","bbb","ccc"};requestMap.put("array", array);//将requestMap中放入ListList<String> list = new ArrayList<String>();list.add("zx1");list.add("zx2");list.add("zx3");list.add("zx4");list.add("zx5");requestMap.put("list", list);//将requestMap中放入MapMap<String, String> map = new HashMap<String, String>();map.put("aa", "haha1");map.put("bb", "haha2");map.put("cc", "haha3");map.put("dd", "haha4");requestMap.put("map", map);return "success";}private Map<String, Object> requestMap;@Overridepublic void setRequest(Map<String, Object> request) {requestMap = request;}}
input.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>input</title></head><body><br><a href="value">value</a><br><br><br>util包下的Calendar的月份属性:<s:property value="@java.util.Calendar@DECEMBER"/><br>自定义属性:<s:property value="@com.zx.action.ValueStackAction@TESTSTR"/><br></body></html>details.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>details</title></head><body><br>ValueStack中的值:<s:property value="name"/>,<s:property value="[0].name"/>,<s:property value="[0]['name']"/><br><br>数组:<s:property value="#request.array"/><br>取单个元素:<s:property value="#request.array[1]"/><br>数组长度:<s:property value="#request.array.length"/><br><br>List集合:<s:property value="#request.list"/><br>取单个元素:<s:property value="#request.list[1]"/><br>增加元素:<s:property value="#request.list.add('haha')"/><br>集合长度:<s:property value="#request.list.size()"/><br><br>Map:<s:property value="#request.map"/><br>通过key取元素:<s:property value="#request.map['bb']"/><br><br>EL表达式:${ list }</body></html>action配置:
<action name="value" class="com.zx.action.ValueStackAction"><result name="success">/details.jsp</result></action>
里面Person只是个简单的实体类只有一个name属性,所以这里不需要列出,理解就行。
这里面分别列出了往ValueStack 和 Map栈中取放值得操作,其实个人认为struts中加入的ValueStack要比较难理解一些,
最好能用debug模式测试一下,理解一下原理,在页面上也可用<s:debug></s:debug>标签查看栈中对象;至于Map栈,
我们对request、session、application都比较了解,在这里只是封装成为Map对象,更方便操作,上面只是列举一些取
数组、集合的例子。
下面是运行结果:
input界面:
details界面:
- struts2之值栈ValueStack
- Struts2中的值栈--ValueStack
- struts2中的值栈ValueStack
- Struts2之ValueStack(初识)
- Struts2中的ValueStack值栈对象详解
- Struts2的值栈理解---ValueStack
- **struts2中的值栈对象ValueStack**
- 4. Struts2框架之 ValueStack
- Struts2之ValueStack(值栈)讲解
- Struts2中JSP获取值栈(ValueStack)中的数据
- Struts2-----ValueStack
- Struts2:ValueStack
- struts2 valuestack
- Struts2 ValueStack
- Struts2--ValueStack
- struts2之valueStack(OGNL) (总结)
- Struts2.x 学习笔记 之 值栈(ValueStack)
- 【Struts2】Struts2: ValueStack值栈
- hdu 2897简单博弈
- cygwin在android开发时有什么用?
- leetcode第一刷_Construct Binary Tree from Preorder and Inorder Traversal
- 数据库SQL Server编程基本语法
- 从技术岗位走向管理岗位:机会是留给有准备的人
- struts2之值栈ValueStack
- php学习笔记——错误异常处理及路径问题
- Tomcat一点一滴之(三)整合Apache、Nginx
- iOS代码版本控制
- Oracle-第十三讲,,树状结构的存储于展示
- 血与泪的教训:牢记修电脑军规20 条
- unity3d 学习笔记___虚拟轴、鼠标事件、双击事件的应用处理
- stm32 两种乘法指令
- 日期和时间的转换