【发布时间】:2023-03-28 13:35:02
【问题描述】:
我想知道表达式语言 (EL) 之间的详细区别。 有 JSP EL、JSF EL 和 Unified EL。
我想了解 EL 背后的历史以及 Java EE 应用程序中使用的最新 EL。它是最新版本中所有视图技术的通用 EL 吗?
【问题讨论】:
标签: jsp jsf jakarta-ee el
我想知道表达式语言 (EL) 之间的详细区别。 有 JSP EL、JSF EL 和 Unified EL。
我想了解 EL 背后的历史以及 Java EE 应用程序中使用的最新 EL。它是最新版本中所有视图技术的通用 EL 吗?
【问题讨论】:
标签: jsp jsf jakarta-ee el
2002 年 6 月:JSTL 1.0 首次与 EL 一起引入。那些 ${} 仅在 JSTL 标签中有效。它旨在调用Javabean get 方法。
2003 年 11 月:引入了 JSP 2.0,并且 EL 在 javax.servlet.jsp.el 包中从 JSTL 1.0 移至 JSP 2.0,它成为了 标准 EL 作为 J2EE 1.4 标准的一部分。 JSTL 1.1 出厂时没有 EL。现在${} 也可以在 JSP 模板文本中的 JSTL 标记之外工作。
2004 年 3 月:JSF 1.0 在 javax.faces.el 包中引入了 deferred EL。那些 #{} 仅在 JSF 标记中起作用。与标准 JSP EL ${} 的区别在于它不仅可以做get,还可以做set。这对于托管 bean 自动创建和设置输入组件的值是强制性的。标准 EL ${} 也适用于 JSF 输出标签,但如果它们不存在于范围内并且它们不会设置输入值,它们将不会自动创建 bean。
2005 年 5 月:虽然仍在为应于 2006 年 5 月发布的新 JSP 2.1 做准备,但延迟的 EL #{} 已从 JSF 中提取,并与 javax.el 包中的标准 EL ${} 结合使用。那时,它变成了 unified EL,它是随 JSF 1.2 引入的,后来成为 JSP 2.1 和 Java EE 5 标准的一部分。 #{} 现在也可以在 JSP 标记中用于get 值,但不能用于set 值。 ${} 现在可以在 JSP 中自动创建托管 bean,但不能自动创建 set 值。
2006 年 11 月:引入 Facelets 作为 JSP 的继承者。它允许在 JSF 标记之外的模板文本中使用 #{},以替代不带任何属性的 <h:outputText>。它还将${} 视为#{},因此它们在Facelets 中的行为相同。
2009 年 12 月:EL 从 JSP 规范中提取出来,成为一个独立的规范,将独立于 JSP 进行维护,第一个版本是 EL 2.2 (JSR-245),类似于 JSP 2.2。主要的新特性是调用参数化方法,而不是仅在 #{} 语法中调用 Javabean getter/setter,例如#{bean.method(argument)}。此外,Facelets 成为 Java EE 6 标准的一部分。
2013 年 6 月:引入了带有独立 EL 处理器的 EL 3.0,允许在普通 Java SE 应用程序中使用。其他主要的新特性是新的字符串连接运算符+=、集合对象的新操作,包括流和 Lambda 表达式->(即使在 Java 6/7 上!)以及将常量导入 EL 范围。
【讨论】:
添加到 BalusC 的答案...
EL 最初由 Art Technology Group 的 Nathan Abramson 于 2001 年构思并实施。当时该实施被称为最简单的可能表达语言 (SPEL)。该实现后来被包含在 JSTL1.0 中。 Nathan 是 JSR-052 Expert Group 的成员,并被认为是 JSTL specification 中表达式语言背后的驱动力。
“特别提到 Nathan Abramson 是表达背后的推动力 JSTL中引入的语言"
【讨论】: