17
JavaServer Pages Standard Tag Library (jstl) Java server pages standard tag library (jstl) es un conjunto de librerías de etiquetas simples y estándares que encapsulan la funcionalidad principal que es usada comúnmente para escribir paginas JSP. JSTL responde a la demanda de los programadores de un conjunto de acciones JSP personalizadas para manejar las tareas que necesitan casi todas las paginas JSP incluyendo procesamiento condicional, bucles, internacionalizaciones, acceso a base de datos y procesamiento a XML. Esto acelerara el desarrollo de las aplicaciones web y elimina la necesidad de los scripting. Primero responderemos a la pregunta siguiente ¿Qué es jstl? (Cuyas siglas son JSP Standard Tag Library) es un conjunto de etiquetas organizadas en 5 grupos distintos, las cuales tienen como propósito fundamental evitar que el programador introduzca código Java (scriptlets) en las páginas JSP. ¿Por qué razón? Pues, básicamente porque los scriptlets son una manera desorganizada de programar páginas JSP y además, la simplicidad de las librerías que provee JSTL nos ayuda demasiado en la lógica de presentación de la página JSP todo esto ofrece la programación con JSTL también podríamos decir que son ventajas de utilizar JSTL, ahora veremos las desventajas de JSTL. Las desventajas de JSTL: Los JSTL pueden agregar mayor sobrecarga en el servidor. Los scriptlets y las librerías de etiquetas son compilados a servlets, los cuales luego son ejecutados por el contenedor. El código Java embebido en los scriptlets es básicamente copiado en el servlet resultante. En cambio, las etiquetas JSTL, causan un poco más de código en el servlet. En la mayoría de casos esta cantidad no es mensurable pero debe ser considerado.

Monografia de Jstl

Embed Size (px)

Citation preview

Page 1: Monografia de Jstl

JavaServer Pages Standard Tag Library (jstl)

Java server pages standard tag library (jstl) es un conjunto de librerías de etiquetas simples y estándares que encapsulan la funcionalidad principal que es usada comúnmente para escribir paginas JSP.

JSTL responde a la demanda de los programadores de un conjunto de acciones JSP personalizadas para manejar las tareas que necesitan casi todas las paginas JSP incluyendo procesamiento condicional, bucles, internacionalizaciones, acceso a base de datos y procesamiento a XML. Esto acelerara el desarrollo de las aplicaciones web y elimina la necesidad de los scripting.

Primero responderemos a la pregunta siguiente ¿Qué es jstl? (Cuyas siglas son JSP Standard Tag Library) es un conjunto de etiquetas organizadas en 5 grupos distintos, las cuales tienen como propósito fundamental evitar que el programador introduzca código Java (scriptlets) en las páginas JSP. ¿Por qué razón? Pues, básicamente porque los scriptlets son una manera desorganizada de programar páginas JSP y además, la simplicidad de las librerías que provee JSTL nos ayuda demasiado en la lógica de presentación de la página JSP todo esto ofrece la programación con JSTL también podríamos decir que son ventajas de utilizar JSTL, ahora veremos las desventajas de JSTL.

Las desventajas de JSTL: Los JSTL pueden agregar mayor sobrecarga en el servidor. Los scriptlets y las librerías de etiquetas son compilados a servlets, los cuales luego son ejecutados por el contenedor. El código Java embebido en los scriptlets es básicamente copiado en el servlet resultante. En cambio, las etiquetas JSTL, causan un poco más de código en el servlet. En la mayoría de casos esta cantidad no es mensurable pero debe ser considerado.Los scriptlets son más potentes que las etiquetas JSTL. Si desea hacer todo en un script JSP pues es muy probable que insertará todo el código en Java en él. A pesar que las etiquetas JSTL proporciona un potente conjunto de librerías reutilizables, no puede hacer todo lo que el código Java puede hacer. La librería JSTL está diseñada para facilitar la codificación en el lado de presentación que es típicamente encontrado en la capa de Vista si hablamos de la arquitectura Modelo-Vista-Controlador.

Librerías JSTLSon cinco las librerías de etiquetas independientes, cada una contiene acciones personalizadas dirigidas a un área funcional específica. La siguiente tabla lista cada librería con su prefijo de etiqueta recomendado y la URI por defecto.

Page 2: Monografia de Jstl

DESCRIPCION PREFIJO URI por defectoCore c http://java.sun.com/jsp/jstl/coreXML processing x http://java.sun.com/jsp/jstl/xmlI18N fmt http://java.sun.com/jsp/jstl/fmtDatabase Access sql http://java.sun.com/jsp/jstl/sqlFunction fn http://java.sun.com/jsp/jstl/functions La librería CORE contiene acciones para las tareas rutinarias, como incluir o excluir una parte de una página dependiendo de una condición en tiempo de ejecución, hacer un bucle sobre una colección de ítems, manipular URLs para seguimiento de sesiones, y la correcta interpretación del recurso objetivo, así como acciones para importar contenido de otros recursos y re direccionar la respuesta de una URL diferente.

La librería XML contiene acciones para procesamiento XML, incluido validar un documento XML y transformarlo usando XSLT. También proporciona acciones para extraer parte de un documento XML validado, hacer bucles sobre un conjunto de nodos, y procesamientos condicional basado en valores nodos.

La librería I18N contiene etiquetas que son empleados para dar formato específicos a elementos dentro de JSPs, estos formatos incluyen aquellos para fechas, monedas y números, así como apoyo para formateo basado en el “locale/i18n”(lenguaje del usuario).

La librería SQL contiene etiquetas para hacer una rápida y fácil integración con bases de datos. Generalmente se le usa para hacer prototipos.Basados en los principios del patrón Model-View-Controller (MVC), el uso de estos Tags en JSPs resulta en una pésima decisión de diseño, ya que se estaría mezclando la capa de acceso a datos (DAO) con la vista de presentación (JSP).

La librería FUNCTION define un conjunto de funciones estándar y un mecanismo para añadir nuevas funciones al lenguaje de expresiones.

El lenguaje de expresiones JSTL

Además de las librerías de etiquetas, JSTL define un lenguaje de expresiones, que facilita enormemente el tratamiento de información. JSP usa java para referenciar atributos dinámicos. Con JSTL ya no es necesario.Comparemos por ejemplo la lectura de un parámetro:

Con JSP<%=request.getParameter("nombre”)%>

Con JSTL$(param.nombre)

Page 3: Monografia de Jstl

En JSTL se evita el uso de java proporcionando un lenguaje de expresiones llamado EXPRESSION LANGUAGE (EL). EL no es un lenguaje de programación en sí mismo, su único propósito es:

Referenciar objetos y sus propiedades. Escribir expresiones simples.

EL toma prestada de JavaScript la sintaxis para acceder a estructuras de datos tanto como propiedades de un objeto (con el operador.) como con elementos con nombres de un array (con el operador ["nombre"]). Las propiedades de los componentes JavaBeans y las entradas java.util.Map, que usan la clave como nombre de propiedad, pueden ser accedidas de esta forma. Aquí tenemos algunos ejemplos:

${myObj.myProperty}$${myObj["myProperty"]}$${myObj[varWithTheName]}$

Como se ve aquí, una expresión EL siempre debe estar encerrada entre los caracteres ${y} $. Las dos primeras expresiones acceden a una propiedad llamada myProperty en un objeto representado por una variable llamada myObj. La tercera expresión acceder a una propiedad con un nombre contenido en un variable, esta sintaxis se puede utilizar con cualquier expresión que evalúe el nombre de la propiedad.El operador de acceso a array también se usa para datos representados como una colección de elementos indexados, como un array Java o una java.util.List:

${myList[2]}$${myList[aVar + 1]}$

Además de los operadores de propiedad y elemento array y los operadores aritméticos, relacionales, y lógicos, hay un operador especial para comprobar si un objeto está "vacío" o no puede ser usado en una expresión EL. La siguiente tabla lista todos los operadores:OPERADOR DESCRIPCION. Accede a una propiedad[ ] Accede a un elemento de un Array/lista( ) Agrupa una subexprecion+ Suma- Resta o negación de un numero/ o div División% o mod Modulo (resto)== o eq Comprueba igualdad!= o ne Comprueba negación< o it Comprueba menor que

Page 4: Monografia de Jstl

>o gt Comprueba mayor que<= o le Comprueba menor o igual que>= o gt Comprueba mayor o igual que&& o and Comprueba AND lógico|| o or Comprueba OR lógico! o not Complemento binario booleanoEmpty Comprueba un valor vacío (null, string vacío, o una

colleccion vacía)

Lo que no encontraremos en EL son sentencias como asignaciones, if/else, o while. Para este tipo de funcionalidades en JSP se usan los elementos Action, y EL no está pensado para utilizarse como un lenguaje de programación de propósito generar, sólo un lenguaje de acceso a datos.

Objetos ImplícitosCiertos objetos son automáticamente accesibles a cualquier etiqueta JSP.A través de ellos es posible acceder a cualquier variable de los ámbitos page, request, sesión, aplication a parámetros de HTTP, cookies, valores de cabeceras, contexto de la página, y parámetros de inicialización del contexto. Todos excepto pageContext, están implementados usando la clase java.util.MapOBJETOS IMPLICITOS CONTIENEPageScope Variables de ámbito paginarequestScope Variables de ámbito requestsessionScope Variables de ámbito sesiónapplicationScope Variables de ámbito applicationParam Parámetros del request como cadenasparamValues Parámetros del request como arreglo de cadenasHeader Cabeceras del request HTTP como cadenasheaderValues Cabeceras del request HTTP como arreglos de cadenaCookie Valores de las cookies recibidas en el requestinitParam Parámetros de inicialización de la aplicación webpageContext El objeto pageContext de la página actual

FUNCIONES DE ELLas funciones representan un modo de extender la funcionalidad del lenguaje de expresiones.Se usan dentro de cualquier expresión del lenguaje de expresiones, por ejemplo:

And Eq Gt TrueInstanceof Or Ne Le

False Empty Not ItGe Null Div mod

PALABRAS RESERVADASLas siguientes palabras están reservadas por EL y no pueden ser usadas como identificadores

Page 5: Monografia de Jstl

<c:set var=”nombre” value=”Gustavo”/>Mi nombre tiene ${fn:length(nombre)}letras.Existen 16 funciones de manipulación de cadenas:

Alternar una cadena entre mayúsculas/minúsculas: toLowerCase, toUpperCase.

Obtener una subcadena: substring, substringAfter, substringBefore. Eliminar el espacio en blanco en ambos extremos de una cadena: trim. Reemplazar caracteres en una cadena: replace. Comprobar si una cadena contiene a otra: indexOf, startsWiht,

endsWiht,constains, containslgnoreCase. Convertir una cadena en array: Split. Convertir un array en cadena: join. Codificar los caracteres especiales del XML: escapeXml. Obtener la longitud de una cadena: length.

La función length también puede aplicarse a instancias de java.util.Collection, caso en el cual, devolverá el número de elementos de una colección.Todas las funciones EL interpretan las variables no definidas o definidas con valor igual a null, como cadenas vacías.

Ahora veremos lo que son las etiquetas del CORE con sus respectivos ejemplos que utiliza JSTL.Para poder usar la librería Core en nuestra página JSP, debemos incluir la siguiente línea.<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>1. Etiqueta: out <c:out> :Dicha etiqueta nos permite mostrar valores en nuestra página.Normalmente, para mostrar valores o mensajes en JSP, usamos por ejemplo:<%=”Texto_del_mensaje”%>, pero también puede hacerse con la etiqueta <c:out> Sintaxis:Sin cuerpo<c:out value="Esto es un mensaje" [escapeXml=”{true|false}”][default=”valorpordefecto””]/>Con cuerpo<c:out value="Esto es un mensaje" [escapeXml=”{true|false}”]>Valor por defecto</c:out>A continuación veremos la descripción de sus atributos:ATRIBUTO DESCRIPCION REQUERIDO POR DEFECTOvalue Información a mostrar Si Ningunodefault Información a mostrar por defecto No CuerpoescapeXml True si debe convertir caracteres

especiales a sus correspondientes entidades(por ejemplo, &gt; para<)

No True

Page 6: Monografia de Jstl

2. ETIQUETA SET <c:set>Nos permite crear una variable y establecer un valor para esta:<body> <!-- Creamos la variable texto con un valor String --> <c:set var="texto" value="valor_de_la_variable"/> <!-- Mostramos el valor de la variable texto --> El valor de la variable <b>texto</b> es : <c:out value="${texto}"/></body>Obtenemos entonces:ATRIBUTO DESCRIPCION REQUERIDO POR DEFECTOValue Información a grabar No CuerpoTarget Nombre de un vean cuya propiedad

será modificadaNo Ninguno

Property Propiedad a modificar No NingunaVar Nombre de la variable en la que

guardarNo Ninguna

Scope Ámbito de la variable en la que grabar la información (page, request, sesión, o application)

No Page

3. ETIQUETA REMOVE<c:remove>Simplemente se utiliza para eliminar variables que hayamos definido:<body> <p> <!-- Creamos la variable texto con un valor String --> <c:set var="texto" value="valor_de_la_variable"/> <!-- Mostramos el valor de la variable texto --> El valor de la variable <b>texto</b> es : <c:out value="${texto}"/> </p> <p> <!-- removemos la variable texto --> <c:remove var="texto" scope="page"/> <!-- Mostramos nuevamente el valor --> El valor de la variable <b>texto</b> ahora es : <c:out value="${texto}" default="Es Nulo"/> </p></body>ATRIBUTO DESCRIPCION REQUERIDO POR DEFECTOVar Nombre de la variable a quitar Si ------Scope Alcance de la variable a quitar No Todos lo ámbitos

Page 7: Monografia de Jstl

Cuando no se especifica alcance, la etiqueta busca en todos los alcances, yendo del más específico al más general (page, request, sesión, application), hasta encontrar una variable con ese nombre. Si la variable no se encuentra, la etiqueta finaliza sin error.4. ETIQUETA CATCH<c:catch>La acción catch permite a las paginas JSP manejar errores generados desde cualquier otra acción, y permite el manejo de errores para multiples acciones a la vez. En otras nos permite capturar excepciones.<body> <c:catch var="excepcion"> <%=3/0%> </c:catch> <c:if test="${excepcion != null }"> Ocurrió una excepción : <c:out value="${excepcion}"/> </c:if> </body> ATRIBUTO DESCRIPCIÓN REQUERIDO POR DEFECTOVar Variable para exponer información

sobre el errorNo Ninguno

Scope Ámbito de la variable No Page

5. ETIQUETA IF<c:if>Es lo mismo que la instrucción if de Java SE, evalúa una condición:<body> <c:set var="a" value="20"/> <c:if test="${a > 100}"> La variable <b></b> es <b>mayor</b> que 100. </c:if> <c:if test="${a < 100 }"> La variable <b></b> es <b>menor</b> que 100. </c:if> </body>ATRIBUTO DESCRIPCION REQUERIDO POR DEFECTOTest Condición a evaluar. Solo procesa el

cuerpo si es trueSi ------

Var Nombre de la variable para el valor resultante de la evaluación de la condición. El tipo de la variable booleano.

No Ninguno

Scope Ámbito de la variable No PageEn el resultado es posible colocar otras etiquetas, incluyendo otras etiquetas IF. Es útil guardar el resultado de evaluar la condición para evitar repetir los cálculos.

Page 8: Monografia de Jstl

6. etiquetas choose, when, otherwise<c: choose>, <c: when> y <c: otherwise>La etiqueta choose no tiene atributos, acepta como hijos uno o más when y una etiqueta otherwise. Funciona parecido a la instrucción switch, es decir, nos permite establecer varias condiciones en un mismo bloque.<body> <c:set var="a" value="50"/> <c:choose> <c:when test="${a == 1}"> <b>a</b> es 1. </c:when> <c:when test="${a == 2 }"> <b>a</b> es 2. </c:when> <c:otherwise> <b>a</b> tiene un valor diferente de 1 y de 2. </c:otherwise> </c:choose></body>En el anterior código, la etiqueta <c:when> es para definir alguna condición, mientras que la etiqueta <c:otherwise> es para definir el caso por defecto, en el cual no se cumple ninguna de las condiciones.La etiqueta when solo tiene un atributo, tal como se explica a continuación:ATRIBUTO DESCRIPCION REQUERIDO POR DEFECTOTest Condición a evaluar Si -------La etiqueta otherwise representa la última alternativa dentro de la etiqueta choose y no tiene atributos.

7. ETIQUETA forEach<c:forEach>Repite el contenido de su cuerpo a través de una colección de objetos, o un numero de veces. Nos permite hacer ciclos en una jsp.Crea la clase Lista en el paquete beans. SINTAXIS 1:<c:forEach [var=”nombreVariable”] ítems=”coleccion”[varStatus=”variableEstado”][begin=”inicio”] [end=”fin”] [step=”paso”]>Contenido del cuerpo</c:forEach>SINTAXIS 2:<c:forEach [var=”nombreVariable”] [varStatus=”variableEstado”]

Page 9: Monografia de Jstl

begin=”inicio” end=”fin” [step=”paso”]>Contenido del cuerpo</c:forEach>A continuación describiremos cada uno de sus atributos:ATRIBUTOS DESCRIPCION REQUERIDO POR DEFECTOÍtems Colección de ítems sobre los que se

iteraNo Ninguno

Begin Elemento con el que inicia la iteración (0=primero)

No 0

End Elemento con el que se finaliza la iteración

No Ultimo

Step Procesa solo cada step elementos No NingunovarStatus Nombre de la variable con la que

se expone el estado de la iteración actual

La variable varStatus tiene propiedades que describen el estado de la iteración, tal como se muestra en la siguiente imagen:ATRIBUTO TIPO REQUERIDOBegin Número El valor del atributo beginCurrent Número El elemento actualEnd Número El valor del atributo endIndex Número Índice del elemento actual dentro de la colecciónCount Número Numero de iteración (empezando en 1)First Boolean Indica si estamos en la primera iteraciónLast Boolean Indica si estamos en la última iteraciónStep Número El valor del atributo step

8. ETIQUETA forTokens<c:forTokens>Permite descomponer una cadena en tokens. Analizar una cadena se llama parsing. Las partes en las que se descompone una cadena se llama tokens.SINTAXIS:<c:forTokens ítems=””cadenaDeTokens” delims=”delimitadores”[var=””nombreVariable”][varStatus=”variableEstado”][begin=”inicio”] [end=”fin”] [step=”paso”]></c:forTokens>Aquí sus atributos:ATRIBUTOS TIPO REQUERIDO POR

DEFECTOVar Nombre del atributo con el que se

expone el token actualNo Ninguno

Ítems Cadena de tokens sobre la cual iterar Si NingunoDelims Conjunto de delimitadores (caracteres

que separan los tokens en la cadena)Si Ninguno

Page 10: Monografia de Jstl

varStatus Nombre de la variable con la que se expone el estado de la iteración actual

No Ninguno

Begin Elemento con el que se inicia la iteración (0=primero)

No 0

End Elemento con el que se finaliza la iteracion

No Ultimo

Step Procesa solo cada step elementos No 1

9. ETIQUETA IMPORT<c:import>Importa el contenido de un recurso basado en una URLSINTAXIS:

Contenido del recurso “en linea” o exportando como objeto String.<c:import url=”url”[context=”contexto”][var=”nombreVariable”] [Scope=”{page|sesión|application}”][charEnconding=”charEnconding”]>Contenido del cuerpo es opcional para etiquetas <c:param></c:import>

Contenido del recurso es exportado como un objeto READER<c:import url=”url” [context=”contexto”]varReader=”nombreVariableReader”[charEncoding=”charEnconding”]>Contenido del cuerpo donde nombreVariableReader es utilizada por otra acción.</c:import>ATRIBUTO DESCRIPCION REQUERIDO POR

DEFECTOurl URL para importar el recurso. Es

válido cualquier protocolo soportado por java. Net.URL. es decir, al manos HTTP, HTTPS,FTP, file, y JAR

Si -----

Context Nombre del contexto cuando se accede a una recurso URL realativo que pertenece a otro contexto

No Contexto actual

Var Nombre de la variable con la que expone el contenido del recurso

No Muestra

Scope Ámbito de la variable No PagecharEncoding Juego de caracteres con el que

importar los datosNo ISO-8859-1

varReader Nombre de una variable con la que exponer el java.io.Reader con que se lee la URL

No Ninguno

En HTML, La URL relativa/images/smily.jgp lee un archivo de la raíz del servidor web, pero en JSTL, esa misma URL lee el fichero de la raíz de nuestra aplicación web. Si quisiéramos que la URL fuera relativa a otra aplicación web usaríamos:<c:import context=”/otraAplicacion” url=”/directorio/pagina.jsp”/>

Page 11: Monografia de Jstl

Cuando dos páginas están en la misma aplicación web, comparten el mismo ámbito request, sessión, y aplication. Si las paginas están en diferente aplicación y son accedidas mediante c:import, ambas comparten el ámbito request. 10. ETIQUETA param <c:param> :Añade parámetros a requerimientos de una URL. Anidadas a acciones <c:import>,<c:url>,<c:redirect>SINTAXIS:

El valor del parámetro se especifica en el atributo “value”.<c:param name=”nombreParametro” value=”valorParametro”/>

El valor del parámetro se especifica en el contenido del cuerpo.<c:param name=”nombreParametro”>Valor parámetro</c:param>

Aquí tenemos los atributos:ATRIBUTO DESCRIPCION REQUERIDO POR DEFECTOName Nombre del parámetro Si ----Value Valor del parámetro No Valor vacio

11.ETIQUETA redirect<c:redirect>Nos permite redirigir una petición.SINTAXIS:<c:redirect url=”recurso” [context=”contexto”]/> sin contenido en el cuerpo<c:redirect url=”recurso” [context=”contexto”]>Etiquetas c:param</c:redirect>Los atributos:ATRIBUTOS DESCRIPCION REQUERIDO POR DEFECTOurl URL a la que redirigir Si --Context Nombre del contexto cuando se

accede a un recurso URL relativo que pertenece a otro contexto

No Contexto actual

A continuación tenemos un ejemplo ilustrativo:<c:redirect url=http://www.minedu.gob.pe/noticias/index.jsp><c:param name=”id” value=”1234”/></c:redirect>12. ETIQUETA urlEsta Etiqueta procesa y re-escribe una dirección URL si es necesario. Solo direcciones URL relativas son re-escritas. Las URL absolutos no son re-escritas para evitar situaciones donde las URL externas puede ser re-escritas y exponer la identificación de la sesión.

Page 12: Monografia de Jstl

Sin contenido en el cuerpo.<c:url value=”valor” [context=”contexto”][var=”nombreVariable”] [Scope=”{page|request|session|application}”]/>

Con contenido en el cuerpo para especificar los parámetros.<c:url value=”valor” [context=”contexto”][var=”nombreVariable”] [Scope=”{page|request|session|application}”]/>Etiquetas <c:param></c:url>

Los atributos:ATRIBUTO DESCRIPCION REQUERIDO POR DEFECTOValue URL a ser procesada Si --Context Nombre del contexto cuando se

accede a un URL relativo que pertenece a otro contexto

No Contexto actual

Var Nombre de la variable con la que se expone el contenido del recurso

No Ninguno

Scope Ámbito de la variable No PageEsta etiqueta es útil por dos motivos:

Preserva la información de sesión codificada en la URL.permite usar URLs relativas a la aplicación web, no a la raíz del servidor.

A continuación tenemos un ejemplo ilustrativo:<c:url value=”demos05.jsp” var=”destino”><c:param name=”nota” value=”15”/></c:url><a href=”${destino}”>Enlace </a>