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界面:









0 0
原创粉丝点击