An Expression that can get or set a value.
In previous incarnations of this API, expressions could only be read. ValueExpression objects can
now be used both to retrieve a value and to set a value. Expressions that can have a value set on
them are referred to as l-value expressions. Those that cannot are referred to as r-value
expressions. Not all r-value expressions can be used as l-value expressions (e.g. "${1+1}" or
"${firstName} ${lastName}"). See the EL Specification for details. Expressions that cannot be
used as l-values must always return true from isReadOnly().
The
ExpressionFactory#createValueExpression(ELContext,String,Class) method can be used
to parse an expression string and return a concrete instance of ValueExpression that encapsulates
the parsed expression. The
FunctionMapper is used at parse time, not evaluation time, so
one is not needed to evaluate an expression using this class. However, the
ELContext is
needed at evaluation time.
The
#getValue(ELContext),
#setValue(ELContext,Object),
#isReadOnly(ELContext),
#getType(ELContext) and
#getValueReference(ELContext) methods will evaluate the expression each time they are
called. The
ELResolver in the ELContext is used to resolve the top-level variables and to
determine the behavior of the . and [] operators. For any of the five methods, the
ELResolver#getValue(ELContext,Object,Object) method is used to resolve all properties
up to but excluding the last one. This provides the base object. For all methods other than the
#getValueReference(ELContext) method, at the last resolution, the ValueExpression will
call the corresponding
ELResolver#getValue(ELContext,Object,Object),
ELResolver#setValue(ELContext,Object,Object,Object),
ELResolver#isReadOnly(ELContext,Object,Object) or
ELResolver#getType(ELContext,Object,Object) method, depending on which was called on
the ValueExpression. For the
#getValueReference(ELContext) method, the (base, property)
is not resolved by the ELResolver, but an instance of
ValueReference is created to
encapsulate this (base, property), and returned.
See the notes about comparison, serialization and immutability in the
Expressionjavadocs.