What's the difference between # , % and $ signs in Struts tags?
expression, java, jsp, ognl, struts2
Solution
Use of # (pound sign)
OGNL is used to refer to objects in the ActionContext as follows:
- `objectName`: object in the ValueStack (default/root object in the OGNL context), such as an Action property
- `#objectName`: object in the ActionContext but outside of the ValueStack, specifically...
- `#objectName`: ActionContext object that has been created using the Struts2 data tags with the default action scope (e.g., `<s:set name="foo" value="'Testing'" />`, referenced by `<s:property value="#foo" />`)
- `#parameters.objectName`: request parameter
- `#request.objectName`: request-scoped attribute
- `#session.objectName`: session-scoped attribute
- `#application.objectName`: application-scoped attribute
- `#attr.objectName`: attribute in page, request, session, or application scope (searched in that order)
The scoped map references above (parameters, request, session, and application) can be made one of two ways:
- `#scopeName.objectName` or
- `#scopeName['objectName']`
Use of % (percent sign)
`%{ OGNL expression }` is used to force OGNL evaluation of an attribute that would normally be interpreted as a String literal.
Example: `<s:property value="myProperty" default="%{myDynamicDefaultValue}" />`
Use of @ (at sign)
The @ symbol is used to make references to static properties and methods. Note that you may need to enable this in your Struts2 properties: `struts.ognl.allowStaticMethodAccess=true`
Examples:
@my.package.ClassName@MY_STATIC_PROPERTY
@my.package.ClassName@myStaticMethod
Use of $ (dollar sign)
Struts2 OGNL does not make special use of the dollar sign. However, it can be used to evaluate normal JSTL expressions. For example:
Struts2: `<h1><s:property value="#pageTitle" /></h1>` (is equivalent to...) JSTL: `<h1>${pageTitle}</h1>`
Problem
I'm working with Struts 2 and when I'm accessing `ValueStack` variables I don't know whether to use `%` or `#` or `$`. I try all of them until I find the correct one. Can anybody explain what is the difference between them?