统一表达式语言

Java统一表达式语言（，简称JUEL）是一种特殊用途的编程语言，主要在Java Web应用程序用于将表达式嵌入到web页面。Java规范制定者和Java Web领域技术专家小组制定了统一的表达式语言。JUEL最初包含在JSP 2.1规范JSR-245中，后来成为Java EE 7的一部分，改在JSR-341中定义。

 历史 

表达式语言是以JSTL（JavaServer Pages Standard Tag Library，JSP标准标签库）的一部分出现的，原本被叫做SPEL（Simplest Possible Expression Language，简单的表达式语言），后来被称作EL（Expression Language，表达式语言）。它是一种脚本语言，允许通过JSP访问Java组件（JavaBeans）。自JSP 2.0以来，表达式语言已经被内置到JSP标签中，用于从JSP中分离Java代码，并允许（比用Java代码）更方便访问Java组件。

经过发展，表达式语言包含了更多的高级功能，并被包括在JSP 2.0规范内。对于有很少或几乎没有Java知识的网页内容设计者而言，脚本的编写变得更简单了。表达式语言使JSP变成了真正意义上的脚本语言。在表达式语言出现之前，JSP包含了一些特定的标签，Java代码直接的写在这些标签里例如“<% %>”，表达式“<%= %>”，等等。。有了表达式语言，网页内容设计者只需明白如何做出适当的Java方法调用，而无需编写Java代码。

EL在语法和语义上类似于JavaScript表达式：
 无需类型转换；转换通常是隐式的完成
 双引号和单引号用法相同
 object.property与object['property']的意义相同

EL也解放了程序员，让程序员访问object.property时，不必清楚在访问值时涉及的细节。根据object的不同，object.property可能意味着object.get("property")、object.getProperty("property")或object.getProperty()等。

JSP 2.0标准制定期间，JavaServer Faces标准的发布也需要一个表达式语言，但在JSP 2.0规范中定义的表达式语言不足以满足JSF技术发展的需要。最突出的限制是表达式是被立即执行的。同时，JSF组件还需要一种途径，来调用服务器端对象的方法。因而一个更强大的语言被制定出来，并具备以下新特性：
 延期执行的表达式
 表达式既可以设定数据，也可以获得数据
 可以调用方法的方法表达式

新的表达式语言符合JSF的需求，但JSP EL和JSF EL之间并不兼容。统一表达式语言计划因此启动。在JSP 2.1中，JSP 2.0和JSF 1.1的表达式语言已经合并成一个统一表达式语言（EL 2.1）。

EL 3.0在JSR-341 中从JSP和JSF规范中独立。新版本添加了一些新的特性，尤其是与Java 8的Streams和Lambda表达式相关的特性。

 示例 

下面是统一表达式语言的一个简单的例子：使用JSTL中“c:out”标签：

 <c:out value="${myBean.myField}" />

调用一个参数的方法的表达式：

 ${myBean.addNewOrder('orderName')}

 实现 
 JUEL 是一个统一表达式语言2.1版的开源实现。被认为是完整而稳定的，使用Apache许可协议2.0授权。JUEL也适用于非JSP应用。
 Apache Commons EL是来自于Apache的JSP 2.0 EL解释器。

 参见 
 OGNL - 一个被和Apache Struts 2使用的开源的表达式语言。
 MVEL - 一个被众多Java项目使用的开源的表达式语言。
 Apache Commons JEXL  - 一个旨在促进Java项目实现动态和脚本功能的开源的表达式语言。
 SpEL  - Spring表达式语言，一个开源的EL表达式语言，是Spring Framework的一部分。它主要用于Spring portfolio项目，但也可以用于其他项目。

 参考文献 

 外部链接 
JSR 245: JavaServer Pages 2.1 
统一表达式语言 （Sun Developer Network(SDN)上的文章）
表达式语言 
JSP和JSF的统一的表达式语言（java.net上的文章）
JUEL 是统一表达式语言（EL）的实现，并成为JSP 2.1标准(JSR-245)的一部分

Category:Java
Category:脚本语言