blob: 8916bc84067abeb3079f07aca0b9438927d201a2 [file] [log] [blame]
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<document>
<properties>
<title>Commons JEXL Overview</title>
</properties>
<body>
<section name="Java Expression Language (JEXL)">
<p>
JEXL is a library intended to facilitate the implementation of dynamic and scripting features in
applications and frameworks.
</p>
<p>
It is a small footprint "glueing" API
- the <a href="apidocs/org/apache/commons/jexl2/package-summary.html#usage">core features</a> fit in
3 classes and 10 methods - that can be used in various conditions:
<ul>
<li>Module or component configuration:
<ul>
<li>Your application has configuration files (eventually generated by a design module)
consumed by the end-user module that would benefit from variables and expressions.
</li>
<li>When it would be convenient to use IOC but overall complexity doesn't require
(or can't depend upon) a full-blown library (Spring, Guice...).
</li>
</ul>
</li>
<li>Loose-coupling of interfaces and implementations or duck-typing:
<ul>
<li>You have optional classes that your code cant consider as compilation dependencies.</li>
<li>You have to integrate and call "legacy" code or use components that you dont want to
strongly depend upon.</li>
</ul>
</li>
<li>Basic scripting features:
<ul><li>Your application lets (advanced) users evaluate or define some simple expressions
like computation formulas.</li></ul>
</li>
<li>Simple template capabilities:
<ul><li>Your application has basic template requirements and JSPs or
Velocity would be overkill or too inconvenient to deploy.</li></ul>
</li>
</ul>
</p>
<p>
Its name stands for Java EXpression Language, a simple expression language inspired by Jakarta
Velocity and the Expression Language defined in the JavaServer Pages Standard Tag Library version 1.1 (JSTL)
and JavaServer Pages version 2.0 (JSP). JEXL 2.0 adds features inspired by
<a href="http://java.sun.com/products/jsp/reference/techart/unifiedEL.html">Unified EL</a>.
</p>
<p>
The API and the expression language exploit Java-beans naming patterns through
introspection to expose property getters and setters. It also considers public class fields
as properties and allows to invoke any accessible method.
</p>
<p>
JEXL attempts to bring some of the lessons learned by the Velocity
community about expression languages in templating to a wider audience.
<a href="http://commons.apache.org/jelly">Commons Jelly</a> needed
Velocity-ish method access, it just had to have it.
</p>
<p>
It must be noted that JEXL is <strong>not</strong> a compatible implementation of EL as defined
in JSTL 1.1 (JSR-052) or JSP 2.0 (JSR-152). For a compatible implementation of
these specifications, see the <a href="http://commons.apache.org/el">Commons EL</a> project.
</p>
</section>
<section name="A Brief Example">
<p>
When evaluating expressions, JEXL merges an
<a href="apidocs/org/apache/commons/jexl2/Expression.html">Expression</a>
with a
<a href="apidocs/org/apache/commons/jexl2/JexlContext.html">JexlContext</a>.
An Expression is created using
<a href="apidocs/org/apache/commons/jexl2/JexlEngine.html#createExpression(java.lang.String)">JexlEngine#createExpression()</a>,
passing a String containing valid JEXL syntax. A simple JexlContext can be created by instantiating a
<a href="apidocs/org/apache/commons/jexl2/MapContext.html">MapContext</a>;
a map of variables that will be internally wrapped can be optionally provided through its constructor.
The following example, takes a variable named foo, and invokes the bar() method on the property innerFoo:
</p>
<source><![CDATA[
// Create or retrieve a JexlEngine
JexlEngine jexl = new JexlEngine();
// Create an expression object
String jexlExp = "foo.innerFoo.bar()";
Expression e = jexl.createExpression( jexlExp );
// Create a context and add data
JexlContext jc = new MapContext();
jc.set("foo", new Foo() );
// Now evaluate the expression, getting the result
Object o = e.evaluate(jc);
]]>
</source>
</section>
<section name="Extensions to JSTL Expression Language">
<p>
While JEXL is similar to the expression language defined in JSTL, it has improved
upon the syntax in a few areas:
</p>
<ul>
<li>Support for invocation of any accessible method (see example above).</li>
<li>Support for setting/getting any accessible public field.</li>
<li>A general <span class="literal">size()</span> method, which works on:
<ul>
<li><span class="literal">String</span> - returns length</li>
<li><span class="literal">Map</span> - returns number of keys</li>
<li><span class="literal">List</span> - returns number of elements.</li>
</ul>
</li>
<li>A general <span class="literal">empty()</span> method, which works on Collections and Strings.</li>
<li>A general <span class="literal">new()</span> method allowing to instantiate objects.</li>
<li>Support for the ternary operator 'a ? b : c' - and its GNU-C / "Elvis" variant 'a ?: c'.</li>
<li>Support for the Perl-like regex matching operators '=~' and '!~'</li>
<li>Misc : '+' has been overloaded to be use as a String concatenation operator</li>
</ul>
</section>
<section name="Releases">
<p>
The current released version is 2.0.
See the <a href="releases.html">releases</a> page for information on obtaining releases.
</p>
</section>
<section name="Related Resources">
<p>
JEXL is not a product of the Java Community Process (JCP), but it provides a
similar expression syntax. For more information about JSP 2.0 EL and JSTL 1.1
EL:
</p>
<ul>
<li>
<a href="http://java.sun.com/products/jsp/index.jsp">JSP 2.0</a> is covered
by Java Specification Requests (JSR)
<a href="http://www.jcp.org/en/jsr/detail?id=152">JSR-152: JavaServer
Pages 2.0 Specification</a>.
</li>
<li>
Apache has an implementation of the expression language for JSP 2.0,
called <a href="http://commons.apache.org/el/index.html">EL</a>
</li>
<li>
<a href="http://java.sun.com/products/jsp/jstl/">JSTL 1.1</a> is covered
by <a href="http://jcp.org/en/jsr/detail?id=52">JSR 52: A Standard
Tag Library for JavaServer Pages</a>. See the
<a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/index.html">JSTL API</a>.
</li>
<li>Apache has a <a href="http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html">JSTL Implementation</a>.</li>
</ul>
<subsection name="Velocity">
<p>
<a href="http://jakarta.apache.org/velocity">Jakarta Velocity</a> implements
a similar expression language.
</p>
<p>
In particular the <a href="http://jakarta.apache.org/velocity/user-guide.html#References">References</a>
section of the User Guide has some good information on properties and method which correlate
directly to JEXL.
</p>
</subsection>
</section>
<section name="Anyone Using It Yet?">
<ul>
<li>
<a href="http://commons.apache.org/configuration">Commons Configuration</a>
</li>
<li>
<a href="http://commons.apache.org/scxml">Commons SCXML</a>
</li>
<li>
<a href="http://commons.apache.org/jelly">Jelly</a>
</li>
</ul>
</section>
</body>
</document>