# Expression Language

El Unified Expression Language de Java es un lenguaje de programación de propósito especial utilizado principalmente en aplicaciones web en Java para incrustar expresiones en páginas web. Los redactores de especificaciones de Java y los grupos de expertos de las tecnologías de capa web de Java han trabajado en un lenguaje de expresiones unificado que fue incluido por primera vez en la especificación JSP 2.1 (JSR-245), y más adelante especificado por sí mismo en el JSR-341, que forma parte de Java EE 7.

## Historia

El lenguaje de expresiones comenzó como una parte de la JavaServer Pages Standard Tag Library (JSTL) y fue llamado originalmente SPEL (Simplest Possible Expression Language), y después simplemente Expression Language (EL). Era un lenguaje de script que permitía el acceso a los componentes de Java (JavaBeans) a través de JSP. Desde JSP 2.0, se ha utilizado dentro de las etiquetas JSP para separar el código Java de JSP, y para permitir un acceso más fácil a los componentes de Java (que en código Java).
Con los años, el lenguaje de expresiones ha evolucionado para incluir una funcionalidad más avanzada y fue incluido en la especificación JSP 2.0. El scripting se hizo más fácil para los diseñadores de contenido web que tienen poco o prácticamente ningún conocimiento del núcleo del lenguaje Java. Este lenguaje de script convirtió verdaderamente a JSP en un lenguaje de script. Antes de EL, JSP consistía en algunas etiquetas especiales como scriptlets, expresiones, etc. dentro de las cuales el código Java era escrito de forma explícita. Con EL el diseñador de contenido web sólo necesita saber cómo hacer las llamadas apropiadas a los métodos básicos de Java.
EL era, tanto sintáctica como semánticamente, similar a las expresiones de JavaScript:
* no hay conversión de tipos explícita
* las conversiones de tipos se hacen generalmente de forma implícita
* las comillas dobles y simples son equivalentes
* objeto.propiedad tiene el mismo significado que objeto['propiedad']
EL también liberó al programador de tener que conocer las particularidades de cómo se accede en realidad a los valores: objeto.propiedad puede significar (dependiendo de qué objeto se trata) o bien object.get("propiedad") o object.getProperty("propiedad") o object.getPropiedad, etc.
Durante el desarrollo de JSP 2.0, la tecnología JavaServer Faces fue publicada, la cual también necesitaba un lenguaje de expresiones, pero el lenguaje de expresiones definido en la especificación JSP 2.0 no satisfacía todas las necesidades para el desarrollo con la tecnología JSF. La limitación más obvia es que sus expresiones son evaluadas de inmediato. Y también, los componentes de JSF necesitan una manera de invocar métodos de objetos del lado del servidor. Un lenguaje más poderoso fue creado con las siguientes nuevas características:
* Expresiones diferidas, que no se evalúan de inmediato
* Expresiones que pueden establecer (set), así como recuperar datos (get)
* Expresiones de métodos, que pueden invocar métodos
El nuevo lenguaje de expresiones funcionó bien para los fines de JSF. Pero los desarrolladores tenían problemas en la integración de JSP EL con JSF EL debido a conflictos. Debido a estas incompatibilidades, la iniciativa "lenguaje de expresión unificado" comenzó para unificar estos lenguajes de expresiones. A partir de JSP 2.1, los lenguajes de expresión de JSP 2.0 y JSF 1.1 se han fusionado en un solo lenguaje de expresiones unificado (EL 2.1).
La versión 3.0 del lenguaje de expresiones (la palabra "unificado" ya no se consideró necesaria) se desarrolló en un JSR independiente de las especificaciones de JSP y JSF, en el JSR-341. Se agregaron algunas nuevas características, las más notables fueron los equivalentes en EL a los streams y expresiones lambda de Java 7.

## Características

El nuevo EL unificado es una unión de los lenguajes de expresiones de JSP y JSF. Además de las características ya disponibles en el EL de JSP, el EL unificado tiene las siguientes características:
* Evaluación diferida
* Soporte para expresiones que pueden establecer valores y expresiones que pueden invocar métodos
* Una API enchufable para resolver expresiones

## Ejemplos

Esto muestra un ejemplo sencillo de Unified EL siendo utilizado dentro de una etiqueta JSTL "c:out":
Una expresión que llama a un método con un parámetro:

## Implementaciones

* JUEL es una implementación de código abierto del Unified Expression Language 2.1. Se considera estable y completa de funciones y está disponible bajo la licencia Apache License 2.0. JUEL también es adecuado para su uso en aplicaciones no JSP.
* Apache Commons EL es el intérprete de JSP 2.0 EL de Apache.