As Matt Ho explained on the mailing list:
A value stack is essentially a List. Calling \ [1] on the stack,
Wiki Markup
returns a substack beginning with the element at index 1. It's only
when you call methods on the stack that your actual objects will be
called.
Said another way, let's say I have a value stack that consists of a
model and an action as follows:unmigrated-wiki-markup
\ [ model, action \ ]
here's how the following ognl would resolve:unmigrated-wiki-markup
\ [0\] - a CompoundRoot object that contains our stack, \ [model, action\]
\ [1\] - another CompoundRoot that contains only \ [action\]unmigrated-wiki-markup Wiki Markup
\ [0\].toString() - calls toString() on the first object in the value
stack (excluding the CompoundRoot) that supports the toString() method
\ [1\].foo - call getFoo() on the first object in the value stack
Wiki Markup
starting from \ [OS:action] and excluding the CompoundRoot that supports a
getFoo() method
I hope this doesn't sound too confusing :\
If you're using Velocity, this can most easily be written as:
$stack.findValue("\[0\]").peek() Wiki Markup
Unfortunately, <ww:property value="\[0\].peek()"/> won't work as this
Wiki Markup
would translate into "starting at the top of the value stack (and
excluding the CompoundRoot), find the first object that has a method
called peek()"
--------thanks Matt!
here is the com.opensymphony.xwork.util.CompoundRoot class which Matt mentions:
...