刚开始用webwork,想了解一下webwork是如何使用ognl来存取Action中的属性的,并想知道是否可以在页面form 中动态的插入field,顺便了解了一下OgnlValueStack,小记一点东西,以备以后回忆.
看了webwork文档,知道了堆栈就是一个继承List的com.opensymphony.xwork.util.CompoundRoot类的一个对象.
/*
* Copyright (c) 2002-2006 by OpenSymphony
* All rights reserved.
*/
package com.opensymphony.xwork.util;
import java.util.ArrayList;
import java.util.List;
/**
* A Stack that is implemented using a List.
*
* @author plightbo
* @version $Revision: 1.4 $
*/
public class CompoundRoot extends ArrayList {
public CompoundRoot() {
}
public CompoundRoot(List list) {
super(list);
}
public CompoundRoot cutStack(int index) {
return new CompoundRoot(subList(index, size()));
}
public Object peek() {
return get(0);
}
public Object pop() {
return remove(0);
}
public void push(Object o) {
add(0, o);
}
}
Action的创建和入栈是在com.opensymphony.xwork.DefaultActionInvocation的构造函数中进行的,创建Action后然后将Action压入堆栈中.这时在内存中的对象结构如下:
当在页面中通过<ww:property value=”oneselfOrg”/>来取得其中的oneselfOrg对象时OgnlValueStack会在堆栈中查找与之相匹配的对象方法,查找的顺序是从上到下的,只要找到一个向配配就会调用,返回.在测试的时候可以通过valueStack.findValue(“oneselfOrg”)来取得onselfOrg对象 .