Problemas y soluciones con expresiones EL vacías/no vacías en JSP

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)&&not empty(LOGINPWD_OA)&&not empty(ISCHECK_OA)&&not 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) por empty (valor)
  • Cambiar not empty(valor) por not 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.

Etiquetas: EL jsp tomcat Jasper Expression Language

Publicado el 6-16 03:13