Section 7: Building JSP Pages Using the Expression Language (EL)


 

7.1 Given a scenario, write EL code that accesses the following implicit variables including pageScope, requestScope, sessionScope, and applicationScope, param and paramValues, header and headerValues, cookie, initParam and pageContext.

EL es un lenguaje que sirve para simplificar la creación de páginas jsp, ya que permite acceder facilmente a todas los scopes, a atributos en todos ellos (pero no a variables locales del _jspService()), crear expresiones lógicas y aritméticas, etc. No hay nada que no se pueda hacer sin EL, pero definitivamente hace todo mucho más fácil.

EL trabaja con booleanos, enteros, reales, String y tbn. tiene el literal null.

Para construir una EL, ubicamos la expresión entre ${ .. }

El objetivo 7.1 del exámen aborda las diferentes variables implicitas de EL. Las 4 primeras (pageScope, requestScope, sessionScope y applicationScope). tienen que ver con el acceso a los diferentes scopes. Estas variables son equivalentes a las ya conocidas page, request, session and application pero no retornan un objeto de tipo HttpServlet, HttpSession, etc sino que retornan mapas con los atributos de cada scope. De esta maneram el acceso a los elementos muy sencillo.

param y paramValues son 2 variables implicitas que permiten acceder los parametros del JSP. param retorna un map de los parametros y los primeros valores de cada parametro. paramValues retorna un map con los parametros y todos los valores de cada uno de los parámetrosde un arreglo de String.

header y headerValues sigue el mismo patrón.

cookie retorna un map de cookies

initParam un map de parámetros del servlet.

pageContext representa el objeto PageContext, a través del cual s puede acceder a los objetos 'ServletContext', 'HttpSession', 'HttpRequest'.

7.2 Given a scenario, write EL code that uses the following operators: property access (the . operator), collection access (the [] operator).

Un atributo de un javabean puede ser accedido utilizando tanto el operador . como el operador [].

entonces, ${miatributo.mipropiedad} es igual a ${miatributo["mipropiedad"]} //en java: javaBean.getMipropiedad()

En el caso de los mapas, se puede utilizar las keys como si fueran un atributo de un javaBean y por consiguiente, la síntaxis para acceder a un elemento es igual:

${mimapa.key} es igual a ${mimapa["key"]} //en java: mimapa.get("key")

El operador [] también sirve para acceder arrays, pero el indice no tiene que ser estrictamente un entero como en Java, sino que puede ser cualquier elemento que pueda ser transformado en un entero (un string, un Integer, etc.).

${miarray[5]} es igual a ${miarray["5"]} // en java: miarray[5]

** Si el subindice no puede ser transformado al entero, arroja una excepción (ELException), pero si el elemento no es un indice válido (overflow) la expresión no devuelve nada (no arroja error).

Las listas pueden ser accedidas de la misma manera que un arreglo:

${milista[5]} es igual a ${milista["5"]} // en java: milista.get(5)

7.3 Given a scenario, write EL code that uses the following operators: aritmetic operators, relational operators, and logical operators.

Operadores aritméticos: (+, -, *, /, %).

  ** Las divisiones son siempre reales y no arrojan excepciones cuando se divide por 0, sino que devuelve Infinity.

Operadores lógicos: (> o gt, < o lt, <= o ge, >= o le, == o eq, != o ne) La forma alternativa permite bypassear el problema de < y > dentro de un XML.

Operadores lógicos: (&& o and, || o or, ! o not).

Opeador empty: ${ empty obj} retorna true cuando el objeto es null o es un array vacio, un string sin caracteres o un Map sin elementos.

7.4 Given a scenario, write EL code that uses a function; write code for an EL function; and configure the EL function in a tag library descriptor.

Los pasos para usar una función EL son exactamente los mismos que para usar un custom tag:

1. Se escribe la clase

La única condición para que un método escrito en cualquier clase pueda ser usado como una función EL es que sea estático y publico.

2. Se define la función en un Tag Library Descriptor (.tld)

La definición de la función en el TLD tiene la siguiente sintaxis:

<function>
    <description></description>
    <name></name>
    <function-class></function-class>
    <function-signature></function-signature>
</function>

Donde <name> define el nombre de la función tal cual va a ser usada en los JSPs, <function-class> da la clase que lo implementa (nombre completo de la clase, incluyendo los paquetes) y <function-signature> define la signature. En la signature no hacen falta poner los calificadores. De los parametros, solo hace falta poner los tipos (de nuevo, nombres completos!).

3. Se proveen detalles de la ubicación del descriptor en web.xml

La manera de declarar el TLD en web.xml y definir el jsp que se va a usar ese tag es la misma que para custom tags.

<jsp-config>

    <taglib id="..." >

          <taglib-uri>....</taglib-uri>

          <taglib-location>....</taglib-location>

    </taglib>

</jsp-config>

4. Se referencia el .tld en el archivo jsp.

Esta parte, también es igual para los custom tags:

<%@ tagib prefix="mitag" uri="..." %> 

 

Finalmente, el uso de las funciones es una mezca entre EL y custom tags.

${mitag:aMayu("hola") }