Spring Expression Language docs
This commit is contained in:
parent
d08d73f274
commit
1f00e639e0
|
@ -72,7 +72,7 @@
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Operators</para>
|
<para>Relational operators</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@ -83,6 +83,10 @@
|
||||||
<para>Calling constructors</para>
|
<para>Calling constructors</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
|
<listitem>
|
||||||
|
<para>Ternary operator</para>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Variables</para>
|
<para>Variables</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
@ -429,49 +433,189 @@ String city = (String) parser.parseExpression("placeOfBirth.City").getValue(cont
|
||||||
names. The contents of arrays and lists are obtained using square
|
names. The contents of arrays and lists are obtained using square
|
||||||
bracket notation. </para>
|
bracket notation. </para>
|
||||||
|
|
||||||
<programlisting></programlisting>
|
<programlisting language="java">ExpressionParser parser = new SpelAntlrExpressionParser();
|
||||||
|
|
||||||
|
// Inventions Array
|
||||||
|
StandardEvaluationContext teslaContext = new StandardEvaluationContext();
|
||||||
|
teslaContext.setRootObject(tesla);
|
||||||
|
|
||||||
|
// evaluates to "Induction motor"
|
||||||
|
String invention = parser.parseExpression("inventions[3]").getValue(teslaContext, String.class);
|
||||||
|
|
||||||
|
|
||||||
|
// Members List
|
||||||
|
StandardEvaluationContext societyContext = new StandardEvaluationContext();
|
||||||
|
societyContext.setRootObject(ieee);
|
||||||
|
|
||||||
|
// evaluates to "Nikola Tesla"
|
||||||
|
String name = parser.parseExpression("Members[0].Name").getValue(societyContext, String.class);
|
||||||
|
|
||||||
|
// List and Array navigation
|
||||||
|
// evaluates to "Wireless communication"
|
||||||
|
String invention = parser.parseExpression("Members[0].Inventions[6]").getValue(societyContext, String.class);
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
|
<para>The contents of dictionaries are obtained by specifying the
|
||||||
|
literal key value within the brackets. In this case, because keys for
|
||||||
|
the Officers dictionary are strings, we can specify string
|
||||||
|
literal.</para>
|
||||||
|
|
||||||
|
<programlisting lang="" language="java">// Officer's Dictionary
|
||||||
|
|
||||||
|
Inventor pupin = parser.parseExpression("Officers['president']").getValue(societyContext, Inventor.class);
|
||||||
|
|
||||||
|
// evaluates to "Idvor"
|
||||||
|
String city = parser.parseExpression("Officers['president'].PlaceOfBirth.City").getValue(societyContext, String.class);
|
||||||
|
|
||||||
|
// setting values
|
||||||
|
parser.parseExpression("Officers['advisors'][0].PlaceOfBirth.Country").setValue(societyContext, "Croatia");
|
||||||
|
|
||||||
|
</programlisting>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>Methods</title>
|
<title>Methods</title>
|
||||||
|
|
||||||
<para>blah blah varargs</para>
|
<para>Methods are invoked using typical Java programming syntax. You may
|
||||||
|
also invoke methods on literals. Varargs are also supported.</para>
|
||||||
|
|
||||||
|
<programlisting language="java">// string literal, evaluates to "bc"
|
||||||
|
String c = parser.parseExpression("'abc'.substring(2, 3)").getValue(String.class);
|
||||||
|
|
||||||
|
// evaluates to true
|
||||||
|
boolean isMember = parser.parseExpression("isMember('Mihajlo Pupin')").getValue(societyContext, Boolean.class);</programlisting>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>Operators</title>
|
<title>Operators</title>
|
||||||
|
|
||||||
<para>blah blah</para>
|
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>Relational operators</title>
|
<title>Relational operators</title>
|
||||||
|
|
||||||
<para>blah blah</para>
|
<para>The relational operators; equal, not equal, less than, less than
|
||||||
|
or equal, greater than, and greater than or equal are supported using
|
||||||
|
standard operator notation. Support is not yet implemented for objects
|
||||||
|
that implement the Comparable interface.</para>
|
||||||
|
|
||||||
<para></para>
|
<para><programlisting language="java">// evaluats to true
|
||||||
|
boolean isEqual = parser.parseExpression("2 == 2").getValue(Boolean.class);
|
||||||
|
|
||||||
|
// evaluates to false
|
||||||
|
boolean isEqual = parser.parseExpression("2 < -5.0").getValue(Boolean.class);
|
||||||
|
|
||||||
|
// evaluates to true
|
||||||
|
boolean isEqual = parser.parseExpression("'black' < 'block'").getValue(Boolean.class);</programlisting>In
|
||||||
|
addition to standard relational operators SpEL supports the
|
||||||
|
'instanceof' and regular expression based 'matches' operator.</para>
|
||||||
|
|
||||||
|
<programlisting language="java">// evaluates to false
|
||||||
|
boolean falseValue = parser.parseExpression("'xyz' instanceof T(int)").getValue(Boolean.class);
|
||||||
|
|
||||||
|
// evaluates to true
|
||||||
|
boolean trueValue = parser.parseExpression("'5.00' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class);
|
||||||
|
|
||||||
|
//evaluates to false
|
||||||
|
boolean falseValue = parser.parseExpression("'5.0067' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class);
|
||||||
|
|
||||||
|
</programlisting>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>Logical operators</title>
|
<title>Logical operators</title>
|
||||||
|
|
||||||
<para></para>
|
<para>The logical operators that are supported are and, or, and not.
|
||||||
|
Their use is demonstrated below</para>
|
||||||
|
|
||||||
<para></para>
|
<para><programlisting language="java">// -- AND --
|
||||||
|
|
||||||
|
// evaluates to false
|
||||||
|
boolean falseValue = parser.parseExpression("true and false").getValue(Boolean.class);
|
||||||
|
|
||||||
|
// evaluates to true
|
||||||
|
String expression = "isMember('Nikola Tesla') and isMember('Mihajlo Pupin')";
|
||||||
|
boolean trueValue = parser.parseExpression(expression).getValue(societyContext, Boolean.class);
|
||||||
|
|
||||||
|
// -- OR --
|
||||||
|
|
||||||
|
// evaluates to false
|
||||||
|
boolean falseValue = parser.parseExpression("true or false").getValue(Boolean.class);
|
||||||
|
|
||||||
|
// evaluates to true
|
||||||
|
String expression = "isMember('Nikola Tesla') or isMember('Albert Einstien')";
|
||||||
|
boolean trueValue = parser.parseExpression(expression).getValue(societyContext, Boolean.class);
|
||||||
|
|
||||||
|
// -- NOT --
|
||||||
|
|
||||||
|
// evaluates to false
|
||||||
|
boolean falseValue = parser.parseExpression("!true").getValue(Boolean.class);
|
||||||
|
|
||||||
|
|
||||||
|
// -- AND and NOT --
|
||||||
|
String expression = "isMember('Nikola Tesla') and !isMember('Mihajlo Pupin')";
|
||||||
|
boolean falseValue = parser.parseExpression(expression).getValue(societyContext, Boolean.class);</programlisting></para>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>Mathematical operators</title>
|
<title>Mathematical operators</title>
|
||||||
|
|
||||||
<para>blah blah</para>
|
<para>The addition operator can be used on numbers, strings and dates.
|
||||||
|
Subtraction can be used on numbers and dates. Multiplication and
|
||||||
|
division can be used only on numbers. Other mathematical operators
|
||||||
|
supported are modulus (%) and exponential power (^). Standard operator
|
||||||
|
precedence is enforced. These operators are demonstrated below </para>
|
||||||
|
|
||||||
<para></para>
|
<para><programlisting>// Addition
|
||||||
|
int two = parser.parseExpression("1 + 1").getValue(Integer.class); // 2
|
||||||
|
|
||||||
|
String testString = parser.parseExpression("'test' + ' ' + 'string'").getValue(String.class); // 'test string'
|
||||||
|
|
||||||
|
// Subtraction
|
||||||
|
int four = parser.parseExpression("1 - -3").getValue(Integer.class); // 4
|
||||||
|
|
||||||
|
double d = parser.parseExpression("1000.00 - 1e4").getValue(Double.class); // -9000
|
||||||
|
|
||||||
|
// Multiplication
|
||||||
|
int six = parser.parseExpression("-2 * -3").getValue(Integer.class); // 6
|
||||||
|
|
||||||
|
double twentyFour = parser.parseExpression("2.0 * 3e0 * 4").getValue(Double.class); // 24.0
|
||||||
|
|
||||||
|
// Division
|
||||||
|
int minusTwo = parser.parseExpression("6 / -3").getValue(Integer.class); // -2
|
||||||
|
|
||||||
|
double one = parser.parseExpression("8.0 / 4e0 / 2").getValue(Double.class); // 1.0
|
||||||
|
|
||||||
|
// Modulus
|
||||||
|
int three = parser.parseExpression("7 % 4").getValue(Integer.class); // 3
|
||||||
|
|
||||||
|
int one = parser.parseExpression("8 / 5 % 2").getValue(Integer.class); // 1
|
||||||
|
|
||||||
|
// Operator precedence
|
||||||
|
int minusTwentyOne = parser.parseExpression("1+2-3*8").getValue(Integer.class); // -21
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</programlisting></para>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>Assignment</title>
|
<title>Assignment</title>
|
||||||
|
|
||||||
<para>blah blah</para>
|
<para>Setting of a property is done by using the assignment operator.
|
||||||
|
This would typically be done within a call to SetValue but can also be
|
||||||
|
done inside a call to GetValue </para>
|
||||||
|
|
||||||
|
<programlisting>Inventor inventor = new Inventor();
|
||||||
|
StandardEvaluationContext inventorContext = new StandardEvaluationContext();
|
||||||
|
inventorContext.setRootObject(inventor);
|
||||||
|
|
||||||
|
parser.parseExpression("Name").setValue(inventorContext, "Alexander Seovic2");
|
||||||
|
|
||||||
|
// alternatively
|
||||||
|
|
||||||
|
String aleks = parser.parseExpression("Name = 'Alexandar Seovic'").getValue(inventorContext, String.class);
|
||||||
|
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
<para></para>
|
<para></para>
|
||||||
</section>
|
</section>
|
||||||
|
@ -479,19 +623,47 @@ String city = (String) parser.parseExpression("placeOfBirth.City").getValue(cont
|
||||||
<section>
|
<section>
|
||||||
<title>Types</title>
|
<title>Types</title>
|
||||||
|
|
||||||
<para>blah blah</para>
|
<para>The specic 'T' operator can be used to specify an instance of
|
||||||
|
java.lang.Class (the 'type'). Static methods are invoked using this
|
||||||
|
operator as well</para>
|
||||||
|
|
||||||
|
<programlisting>Class dateClass = parser.parseExpression("T(java.util.Date)").getValue(Class.class);
|
||||||
|
|
||||||
|
|
||||||
|
boolean isEqual = parser.parseExpression("T(java.math.RoundingMode).CEILING < T(java.math.RoundingMode).FLOOR").getValue(Boolean.class);
|
||||||
|
</programlisting>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>Constructors</title>
|
<title>Constructors</title>
|
||||||
|
|
||||||
<para>blah blah</para>
|
<para>Constructors can be invoked using the new operator. The fully
|
||||||
|
qualified classname should be used for all but the primitive type and
|
||||||
|
String (where int, float, etc, can be used).</para>
|
||||||
|
|
||||||
|
<programlisting>Inventor einstein =
|
||||||
|
parser.parseExpression("new org.spring.samples.spel.inventor.Inventor('Albert Einstein', 'German')").getValue(Inventor.class);
|
||||||
|
|
||||||
|
//create new inventor instance within add method of List
|
||||||
|
parser.parseExpression("Members.add(new org.spring.samples.spel.inventor.Inventor('Albert Einstein', 'German'))").getValue(societyContext);
|
||||||
|
</programlisting>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="expressions-ref-variables">
|
<section id="expressions-ref-variables">
|
||||||
<title>Variables</title>
|
<title>Variables</title>
|
||||||
|
|
||||||
<para>blah blah</para>
|
<para>Variables can referenced in the expression using the syntax
|
||||||
|
#variableName. Variables are set using the method setVariable on the
|
||||||
|
StandardEvaluationContext. </para>
|
||||||
|
|
||||||
|
<programlisting>Inventor tesla = new Inventor("Nikola Tesla", "Serbian");
|
||||||
|
StandardEvaluationContext context = new StandardEvaluationContext();
|
||||||
|
context.setVariable("newName", "Mike Tesla");
|
||||||
|
context.setRootObject(tesla);
|
||||||
|
|
||||||
|
parser.parseExpression("Name = #newName").getValue(context);
|
||||||
|
|
||||||
|
System.out.println(tesla.getName()) // "Mike Tesla"</programlisting>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>The #this and #root variables</title>
|
<title>The #this and #root variables</title>
|
||||||
|
@ -506,6 +678,42 @@ String city = (String) parser.parseExpression("placeOfBirth.City").getValue(cont
|
||||||
<para>blah blah</para>
|
<para>blah blah</para>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<title>Ternary Operator (If-Then-Else)</title>
|
||||||
|
|
||||||
|
<para>You can use the ternary operator for performing if-then-else
|
||||||
|
conditional logic inside the expression. A minimal example is; </para>
|
||||||
|
|
||||||
|
<programlisting language="java">String falseString = parser.parseExpression("false ? 'trueExp' : 'falseExp'").getValue(String.class);</programlisting>
|
||||||
|
|
||||||
|
<para>In this case, the boolean false results in returning the string
|
||||||
|
value 'falseExp'. A less artificial example is shown below.</para>
|
||||||
|
|
||||||
|
<programlisting>parser.parseExpression("Name").setValue(societyContext, "IEEE");
|
||||||
|
societyContext.setVariable("queryName", "Nikola Tesla");
|
||||||
|
|
||||||
|
expression = "isMember(#queryName)? #queryName + ' is a member of the ' " +
|
||||||
|
"+ Name + ' Society' : #queryName + ' is not a member of the ' + Name + ' Society'";
|
||||||
|
|
||||||
|
String queryResultString = parser.parseExpression(expression).getValue(societyContext, String.class);</programlisting>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<title>List Selection</title>
|
||||||
|
|
||||||
|
<para>List selection is a powerful expression language feature that
|
||||||
|
allow you to transform the source list into another list by selecting
|
||||||
|
from its "rows". In other words, selection is comparable to using SQL
|
||||||
|
with a WHERE clause.</para>
|
||||||
|
|
||||||
|
<para>Selection uses the syntax ?{projectionExpression}. This will
|
||||||
|
filter the list and return a new list containing a subset of the
|
||||||
|
original element list. For example, selection would allow us to easily
|
||||||
|
get a list of Serbian inventors:</para>
|
||||||
|
|
||||||
|
<programlisting>List<Inventor> list = (List<Inventor>) parser.parseExpression("Members.?{Nationality == 'Serbian'}").getValue(societyContext);</programlisting>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>Expression templating</title>
|
<title>Expression templating</title>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue