SpEL soporta una gran cantidad de tipos de expresiones, este artículo enumera los más básicos y muestra algunos ejemplos sencillos para cada uno de ellos.
Literales
Los literales son las expresiones más sencillas que pueden utilizarse. Constantes que representan cadenas de texto, valores numéricos, valores lógicos, … utilizando las reglas habituales:
#{ '¡Hola mundo cruel!' } #{ '3.14159' } #{ '0xff' }
Propiedades
Dado un objeto, se sigue la nomenclatura de punto para acceder a sus propiedades:
#{ libro.titulo } #{ continente.pais.ciudad }
Colecciones
Los objetos dentro de una colección se pueden referenciar por su índice, o por su clave en el caso de los arrays asociativos:
#{ biblioteca.libros[0] } #{ paises['es'].nombre }
Listas
Se pueden construir listas embebidas dentro de las propias expresiones utilizando la notación de llaves:
#{ {1, 1, 2, 3, 5, 8, 13} } #{ {1, 3, 5}, {2, 4, 6} } #{ {'Gaspar', 'Melchor', 'Baltasar'} }
Arrays
Se pueden construir matrices embebidas dentro de las propias expresiones invocando el constructor de Java:
#{ new int[100] } #{ new int[4]{11, 21, 31, 41} }
Métodos
Dado un objeto, se sigue la nomenclatura de punto para invocar sus métodos:
#{ '¡Viva '.concat(' Las Vegas!') } #{ {1, 2, 3}.size() }
Operadores
Se pueden utilizar los operadores relacionales habituales para realizar comparaciones:
#{ 1 == 1 } #{ 'madre' > 'hijo' }
Se pueden utilizar los operadores lógicos habituales para evaluar condiciones:
#{ true and false } #{ !('infinito'.length() == 0) }
Y se pueden utilizar operadores aritméticos habituales:
#{ 1 + 1 } #{ 7 % 5 }
Asignaciones
Aunque no muy habitual, se pueden realizar asignaciones directamente. A este punto hay que recordar la existencia del objeto root
contextual sobre el que aplica una expresión:
#{ nombre = 'Cervantes' } #{ alpha = 47 }
Tipos
El operador especial T(type)
se puede utilizar para obtener una referencia a una clase, e invocar sus métodos estáticos por ejemplo:
#{ T(java.lang.String).valueOf(47) } #{ T(java.lang.Math).random() * 100 }
Constructores
Se pueden construir objetos utilizando new
y el nombre completo de la clase que se quiere instanciar, excepto para los tipos básicos que son directamente reconocidos:
#{ new int[4] } #{ new com.empresa.Libro('Fortunata y Jacinta') }