我希望了解表达式语言(EL)之间的详细区别,其中包括JSP EL、JSF EL和统一 EL。
我想了解 EL 背后的历史,并且最新的 EL 在 Java EE 应用程序中的使用情况。它是最新版本中所有视图技术通用的 EL 吗?
我希望了解表达式语言(EL)之间的详细区别,其中包括JSP EL、JSF EL和统一 EL。
我想了解 EL 背后的历史,并且最新的 EL 在 Java EE 应用程序中的使用情况。它是最新版本中所有视图技术通用的 EL 吗?
2002年6月:JSTL 1.0首次引入了EL。它是那些只在JSTL标签中起作用的${}
东西,并设计用于调用Java Bean的get
方法。
2003年11月:JSP 2.0被引入并将EL从JSTL 1.0移动到javax.servlet.jsp.el
包中,成为J2EE 1.4标准的一部分。JSTL 1.1不再包含EL。此时,${}
也可以在JSP模板文本之外的位置工作。
2004年3月:JSF 1.0引入了javax.faces.el
包中的延迟EL。这是那些仅在JSF标签内部起作用的#{}
东西。与标准JSP EL ${}
的区别在于,它不仅仅执行get
,还可以执行set
。这对于自动创建托管bean和设置输入组件的值是必需的。标准EL ${}
也可以在JSF输出标签中工作,但如果bean在范围中不存在,则不会自动创建它们,并且不会设置输入值。
2005年5月:在仍在准备于2006年5月发布的新JSP 2.1版本期间,延迟的EL#{}
从JSF中提取出来,并与标准EL${}
结合在javax.el
包中。此时,它成为了统一表达式语言(Unified EL),并在JSF 1.2中引入,后来成为JSP 2.1和Java EE 5标准的一部分。现在#{}
也可以用于JSP标记中以get
获取值,但不能用于set
设置值。${}
现在在JSP中还可以自动创建托管bean,但不能set
设置值。
2006年11月:Facelets作为JSP的继任者被引入。它允许在模板文本中使用#{}
,而不需要任何属性,作为<h:outputText>
的替代品,位于JSF标记外。它还将${}
视为#{}
,因此它们在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 3.0,其中包含一个独立的EL处理器,允许在普通Java SE应用程序中使用。其他主要的新功能是新的字符串连接运算符+=
,针对集合对象的新操作,包括流和Lambda表达式->
(即使在Java 6/7上也适用!)以及将常量导入EL作用域。
在BalusC的回答中,还有一些需要补充的内容...
EL最初由Art Technology Group的Nathan Abramson于2001年构思和实现。当时的实现被称为Simplest Possible Expression Language (SPEL),后来被包含在JSTL1.0中。Nathan是JSR-052专家组的成员,并被认为是表达式语言背后的推动力量,在JSTL规范中得到了认可。
“特别感谢Nathan Abramson成为引入JSTL中表达式语言的推动力量。”