Expresión EL no es evaluada en JSP

Breve introducción a Expression Language

Las versiones de J2EE que estamos utilizando actualmente incluyen una especificación conocida como EL o Expression Language. Esta tecnología permite evitar la utilización de scriptlets en JSP, dejando fuera cualquier tipo de código que haga que la capa de presentación de mezcle con lógica de negocio.

Las expresiones EL son usadas en particular como parámetros de taglibs, como por ejemplo:

<c:out value="${tarea.codigo}"/>

En este ejemplo, estamos entregando como parámetro la propiedad “codigo” de un bean “tarea”, que suponemos está disponible en el contexto de página, request o sesión. Esto nos evita hacer algo como lo siguiente:

<c:out value="<%=tarea.getCodigo();%> />

El problema

Durante el desarrollo de Fondos Concursables encontramos un caso en que una expresión EL no estaba siendo evaluada. La expresión es:

<jbpm:processimageToken token="${codigoToken}" />

donde “codigoToken” estaba siendo almacenada como atributo del request a través de un Action de Struts. Sin embargo, al hacer un trace de la clase llamada por este taglib, podía apreciarse que el valor entregado a la propiedad “token” era el string “${codigoToken}”.

Como información adicional, este tag especial “jbpm” corresponde al taglib definido en el starters kit de jbpm. En particular, permite obtener la imagen de un flujo con indicaciones de la posición actual de los tokens de una instancia.

Causa

La especificación incluye la posibilidad de desactivar la evaluación de expresiones EL en una página JSP. Si bien el código de la página no mostraba en ninguna parte una llamada a esta configuración, creemos que otro taglib o componente utilizado pudiera haber estado generando este efecto.

En el caso más improbable, puede haber sido producido por un estado particular de la máquina virtual o del servidor de aplicación.

Solución

Para forzar la evaluación de las expresiones EL, agregamos el parámetro isELIgnored a la directiva de página, con valor false.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
   pageEncoding="ISO-8859-1" isELIgnored="false"%>

La ayuda del DTD de JSP de Eclipse no muestra este parámetro, pero efectivamente funciona.