26 marzo 2005

Utilizar Expresion Language con Struts

Supongo que no me habrá pasado a mí solo, pero me ha llevado algún tiempo y sus correspondientes quebraderos de cabeza, descubrir cómo se utiliza el Lenguaje de Expresión con Struts.

Si tuviéramos un .jsp que recorre una lista de libros almacenada en el request, el código con EL sería el siguiente:

<c:forEach var="fila" items="${sessionScope.seleccion}">
<tr>
<td>${fila.value.id_libro}</td>
<td>${fila.value.titulo_libro}</td>
<td>${fila.value.nom_autor}</td>
<td>${fila.value.nom_editorial}</td>
<td>${fila.value.ed_libro}</td>
<td>${fila.value.anyo_libro}</td>
<td>${fila.value.precio_libro}</td>
</tr>
</c:forEach>



Y si no configuramos las páginas para utilizar LE, lo que se vería en un navegador serían las expresiones en lugar de sus valores:

${fila.value.precio_libro}${libro.id_libro} ${libro.titulo_libro} ${libro.nom_autor} ${libro.nom_editorial} ${libro.ed_libro} ${libro.anyo_libro} ${libro.precio_libro}


El problema aparece cuando intentamos utilizar EL con las versiones 1.2.x de Struts y anteriores, ya que éstas utilizan por defecto la versión 2.2 del descriptor de despliegue web.xml:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">



Una forma de solucionarlos sería cambiar a la versión 2.3, pero también tendríamos que cambiar otras cosas como el orden de las etiquetas en el archivo web.xml y algunas cosillas más.

Si queremos continuar con la versión 2.2, la solución es añadir el atributo isELIgnored="false" en la directiva page de los jsp donde queramos utilizar EL, tal como se puede ver en el ejemplo

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Probando LE</title>
</head>
<body>
<table>
<c:forEach var="fila" items="${sessionScope.seleccion}">
<tr>
<td>${fila.value.id_libro}</td>
<td>${fila.value.titulo_libro}</td>
<td>${fila.value.nom_autor}</td>
<td>${fila.value.nom_editorial}</td>
<td>${fila.value.ed_libro}</td>
<td>${fila.value.anyo_libro}</td>
<td>${fila.value.precio_libro}</td>
</tr>
</c:forEach>
</table>
</body>
</html>



Otro problema que podemos tener es cuando intentamos introducir una expresión EL dentro de una etiqueta de struts, como <logic:iterate>.Para evitarlo tendremos que hacer lo siguiente:

  1. Las etiquetas de struts en las que se pueden incluir este tipo de expresiones pertenecen a los tld que acaban en -el: struts-html-el.tld, struts-logic-el, etc. Estos archivos tld están en la distribución de struts, en la carpeta struts.1.2.x/contrib/struts-el/lib.
    Distribución Struts 1.2.x
    Así que tendremos que modificar el archivo web.xml para que se utilicen estos tlds.

  2. Además deberemos añadir al build path de nuestro proyecto, el archivo struts-el.jar que también está en dicha carpeta.

  3. Por último, esto no funciona si nos olvidamos de incluir en el build path, los archivos jstl.jar y standar.jar del JSTL.


En el IDE Eclipse, todo esto es relativamente sencillo ya que sólamente tendremos que copiar los archivos .jar a la carpeta WEB-INF/lib de nuestro proyecto y los .tld a la carpeta WEB-INF.