...
Code Block |
---|
| xml |
---|
| xml |
---|
title | Creating a dynamic input field |
---|
|
<saf<s:textfield name="postalCode"/>
|
...
Code Block |
---|
| xml |
---|
| xml |
---|
title | Using an expression to set the label |
---|
|
<saf<s:textfield labelkey="%{getText("postalCode.label")}" name="postalCode"/>
|
The expression language (OGNL) lets us call methods and evaluate properties. The method getText
is provided by ActionSupport, which is the base class for most Actions. Since the Action is on the stack, we can call any of its methods from an expression, including getText
.
...
Code Block |
---|
| xml |
---|
| xml |
---|
title | Evaluating booleans |
---|
|
<saf<s:select labelkey="%{getText("state.label")}" name="state" multiple="true"/>
|
...
Code Block |
---|
| xml |
---|
| xml |
---|
title | Evaluating booleans (verbose) |
---|
|
<saf<s:select labelkey="%{getText("state.label")}" name="state" multiple="%{true}"/>
|
Code Block |
---|
| xml |
---|
| xml |
---|
title | Evaluating booleans (with property) |
---|
|
<ww<s:select labelkey="%{getText("state.label")}" name="state" multiple="allowMultiple"/>
|
Code Block |
---|
| xml |
---|
| xml |
---|
title | Evaluating booleans (verbose with property) |
---|
|
<ww<s:select labelkey="%{getText("state.label")}" name="state" multiple="%{allowMultiple}"/>
|
...
Most often, the value
attribute is set automatically, since name
attribute usually tells the framework which property to call to set the value
. But, if there is a reason to set the value
directory directly, be advised that value
is an Object NOT a String.
Since value
is not a String, whatever is passed to value
is evaluated as an expression – - NOT a String literal.
Code Block |
---|
| xml |
---|
| xml |
---|
title | Probably wrong! |
---|
|
<ww<s:textfield labelkey="%{getText("state.label")}" name="state" value="CAca"/>
|
If a textfield
is passed the value attribute "CAca"
, the framework will look for a property naemd {{named getCa
}. Generally, this is not what we mean. What we mean to do is pass a literal String. In the expression language, literals are placed within quotes
Code Block |
---|
| xml |
---|
| xml |
---|
title | Passing a literal value the right way |
---|
|
<ww<s:textfield labelkey="%{getText("state.label")}" name="state" value="%{'CAca'}" />
|
Another approach would be to use the idiom value="'CAca'"
, but, in this case, using the expression notation is recommended.
...
- All String attribute types are parsed for the "%{ ... }" notation.
- All non-String attribute types are not parsed, but evaluated directly as an expression
- The exception to rule #2 is that if the non-String attribute uses the escape notion "{%{}", the notation is ignored as redundant, and the content evaluated.
Note |
---|
Please remember about altSyntax option that can change when value is evaluated as an expression - Alt Syntax |
Expression Language Notations
Code Block |
---|
<p>Username: ${user.username}</p> |
| A JavaBean object in a standard context in Freemarker, Velocity, or JSTL EL (Not OGNL). |
Code Block |
---|
<s:textfield name="username"/> |
| A username property on the Value Stack. |
Code Block |
---|
<s:url id="es" action="Hello">
<s:param name="request_locale">
es
</s:param>
</s:url>
<s:a href="%{es}">Espanol</s:a> |
| Another way to refer to a property placed on the Value Stack. |
Code Block |
---|
<s:property
value="#session.user.username" /> |
| The username property of the User object in the Session context. |
Code Block |
---|
<s:select
label="FooBar" name="foo"
list="#{'username':'trillian',
'username':'zaphod'}" /> |
| A static Map, as in put("username","trillian"). |
Disallowed property names
The following names of property are disallowed:
- parameters
- application
- session
- struts
- request
- servletRequest
- servletResponse
The below code will not work:
Code Block |
---|
|
<s:iterator value="parameters"/>
|
Code Block |
---|
|
public class MyAction {
private String[] parameters;
public String[] getParameters() {
return parameters;
}
}
|