For example, suppose we are using standard OGNL (not using XWork) and there are two objects in the OgnlContext map: "foo" -> foo and "bar" -> bar and that the foo object is also configured to be the single root object. The following code illustrates how OGNL deals with these three situations:
#foo.blah // returns foo.getBlah() #bar.blah // returns bar.getBlah() blah // returns foo.getBlah() because foo is the root
For example, suppose the stack contains two objects: Animal and Person. Both objects have a "name" property, Animal has a "species" property, and Person has a "salary" property. Animal is on the top of the stack, and Person is below it. The follow code fragments help you get an idea of what is going on here:
species // call to animal.getSpecies() salary // call to person.getSalary() name // call to animal.getName() because animal is on the top
In the last example, there was a tie and so the animal's name was returned. Usually this is the desired effect, but sometimes you want the property of a lower-level object. To do this, XWork has added support for indexes on the ValueStack. All you have to do is:
.name // call to animal.getName() .name // call to person.getName()
With expression like  ...  etc. WebWork Struts 2 will cut the stack and still returned return back a CompoundRoot object. To get the top of that particular stack cut, use 0.top
OGNL supports accessing static properties as well as static methods. As the OGNL docs point out, you can explicitly call statics by doing the following
By default, Struts 2 is configured to disallow this--to enable OGNL's static member support you must set the
struts.ognl.allowStaticMethodAccess constant to
true via any of the Constant Configuration methods.
OGNL's static access looks like this:
However, XWork allows you to avoid having to specify the full package name and call static properties and methods of your action classes using the "vs" prefix:
<at:var at:name="vs" />FOO_PROPERTY <at:var at:name="vs" />someMethod() <at:var at:name="vs1" />FOO_PROPERTY <at:var at:name="vs1" />someMethod() <at:var at:name="vs2" />BAR_PROPERTY <at:var at:name="vs2" />someOtherMethod()
not directly supported, but #baz is similar
'top' or 
Struts 2 Named Objects
Struts 2 places request parameters and request, session, and application attributes on the OGNL stack. They may be accessed as shown below.
|#action['foo'] or #action.foo||current action getter (getFoo())|
#parameters['foo'] or #parameters.foo
request parameter ['foo'] (request.getParameter())
#request['foo'] or #request.foo
request attribute ['foo'] (request.getAttribute())
#session['foo'] or #session.foo
session attribute 'foo'
#application['foo'] or #application.foo
ServletContext attributes 'foo'
#attr['foo'] or #attr.foo
Access to PageContext if available, otherwise searches request/session/application respectively