...
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:
Code Block |
---|
#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:
Code Block |
---|
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:
Code Block |
---|
[0].name // call to animal.getName()
[1].name // call to person.getName()
|
...
With expression like \ [0\] ... \ [3\] etc. Struts 2 will cut the stack and still return back a CompoundRoot object. To get the top of that particular stack cut, use [0].top
ognl expression | description | <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="1eee1ed0-a7c5-4c99-9802-bf9cb8c8022e"><ac:plain-text-body><![CDATA[|
---|---|---|
[0].top | would get the top of the stack cut starting from element 0 in the stack (similar to top in this case) | ]]></ac:plain-text-body></ac:structured-macro> |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="ca4657de-e482-415f-88e9-659aa888f1e3"><ac:plain-text-body><![CDATA[ | [1].top | would get the top of the stack cut starting from element 1 in the stack]]></ac:plain-text-body></ac:structured-macro> |
Accessing static properties
...
OGNL's static access looks like this:
Code Block | ||
---|---|---|
| ||
@some.package.ClassName@FOO_PROPERTY
@some.package.ClassName@someMethod()
|
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:
Code Block |
---|
<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()
|
...
Differences from the WebWork 1.x EL
Besides the examples and descriptions given above, there are a few major changes in the EL since WebWork 1.x. The biggest one is that properties are no longer accessed with a forward slash \ (/\) but with a dot (.). Also, rather than using ".." to traverse down the stack, we now use "\[n\]" where n is some positive number. Lastly, in WebWork 1.x one could access special named objects (the request scope attributes to be exact) by using "@foo", but now special variables are accessed using "#foo". However, it is important to note that "#foo" does NOT access the request attributes. Because XWork is not built only for the web, there is no concept of "request attributes", and thus "#foo" is merely a request to another object in the OgnlContext other than the root. Wiki Markup
Old Expression | New Expression | ||||
---|---|---|---|---|---|
foo/blah | foo.blah | ||||
foo/someMethod() | foo.someMethod() | ||||
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="37eb4641-0815-4dff-9d83-0ed68584e4f5"><ac:plain-text-body><![CDATA[ | ../bar/blah | [1].bar.blah | ]]></ac:plain-text-body></ac:structured-macro> | ||
@baz | not directly supported, but #baz is similar | ||||
. | 'top' | <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="1da5ca6c-135f-4153-90ab-8d2379c709e0"><ac:plain-text-body><![CDATA[ | . | top or [0] | ]]></ac:plain-text-body></ac:structured-macro> |
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.
name | value | <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="4d064104-67cf-4c5a-8d92-f9226f952138"><ac:plain-text-body><![CDATA[|||
---|---|---|---|---|
#action['foo'] or #action.foo | current action getter (getFoo()) | |||
#parameters['foo'] or #parameters.foo | request parameter ['foo'] (request.getParameter())]]></ac:plain-text-body></ac:structured-macro> | <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="e788398c-2164-4939-a255-32565528b18b"><ac:plain-text-body><![CDATA[ | ||
#request['foo'] or #request.foo | request attribute ['foo'] (request.getAttribute())]]></ac:plain-text-body></ac:structured-macro> | |||
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="1d52c479-050e-49b7-be16-8bc120ca8d93"><ac:plain-text-body><![CDATA[ | #session['foo'] or #session.foo | session attribute 'foo' | ]]></ac:plain-text-body></ac:structured-macro> | <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="fc5c2307-d2c4-4d27-9b16-19bda53d258a"><ac:plain-text-body><![CDATA[ |
#application['foo'] or #application.foo | ServletContext attributes 'foo']]></ac:plain-text-body></ac:structured-macro> | |||
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="bd708dcc-abe3-471d-a578-ac78d6534937"><ac:plain-text-body><![CDATA[ | #attr['foo'] or #attr.foo | Access to PageContext if available, otherwise searches request/session/application respectively]]></ac:plain-text-body></ac:structured-macro> |