Problema con expresiones EL en JSP
Al trabajar con expresiones EL (Expression Language) en archivos JSP, es común encontrarse con errores de sintaxis específicos relacionados con las funciones empty y not empty. Un error frecuente es el siguiante:
HTTP Status 500 -
=================
**type** Exception report
**message**
**description** The server encountered an internal error that prevented it from fulfilling this request.
**exception**
org.apache.jasper.JasperException: /main/index.jsp(79,6) "${not empty(LOGINNAME_OA)&¬ empty(LOGINPWD_OA)&¬ empty(ISCHECK_OA)&¬ empty(OAIP)}" contains invalid expression(s): javax.el.ELException: Function ':empty' not found
Causa del problema
Este error ocurre específicamente cuando se utilizan las funciones empty o not empty en expresiones EL sin un espacio entre la función y el paréntesis de apertura. Por ejemplo:
${not empty(usuario)} // Incorrecto
${not empty (usuario)} // Correcto
Solución recomendada
La solución es simple pero crucial: siempre incluir un espacio entre la función empty o not empty y el paréntesis de apertura:
- Cambiar
empty(valor)porempty (valor) - Cambiar
not empty(valor)pornot empty (valor)
Compatibilidad con Tomcat
Este problema es particularmente común en versiones específicas de Tomcat (como la 6.0.18) debido a cambios en la implementación de Jasper, el motor de JSP de Tomcat. La expresión EL sigue la especificación formal que requiere este espacio:
Expression = {(UnaryOp Expression) | Value }
UnaryOp = {'-' | ! | not | empty }
Ejemplo de corrección en código
Antes de la corrección:
${!empty(organizacionLogo)}
${!empty(accion) && !empty(espacioNombres)}
Después de la corrección:
${!empty (organizacionLogo)}
${!empty (accion) && !empty (espacioNombres)}
Implementación automática
Para corregir múltiples archivos JSP de manera eficiente, puedes utilizar herramientas de búsqueda y reemplazo. Por ejemplo, con sed en Linux:
sed -i.BAK -e "s/empty(/empty (/g" *.jsp*
sed -i.BAK -e "s/not(/not (/g" *.jsp*
Conclusión
Este comportamiento, aunque parece inconsistente, se debe a cambios en la imlpementación de EL en versiones específicas de Tomcat. Siempre sigue la especificación formal de EL incluyendo el espacio requerido entre las funciones y los paréntesis para evitar errores en tiempo de compilación de JSP.