====== JSTL ======
* Es un framework de etiquetas predefinidas para JSP.
* Debemos descargarnos el archivo //taglibs// de jakarta. Una vez lo tengamos deberemos descomprimirlo y en la carpeta de nuestra aplicación **/WEB-INF** colocaremos los .tld, en **/WEB-INF/lib** deberemos colocar los .jar. De esa forma serán accesibles en todo el proyecto.
* Para usarlas tendremos que hacer un include, ya sea en nuestro archivo de código .jsp o en el web.xml:
En nuestro código:
<%@ taglib uri="http://jakarta.apache.org/taglibs/{library}" prefix="x" %>
<%@ taglib prefix="c" uri="/WEB-INF/c-rt.tld" %>
En el web.xml:
http://jakarta.apache.org/taglibs/{library}
/WEB-INF/{library}.tld
* Un ejemplo de uso básico es el siguiente:
<%@ taglib prefix="c" uri="/WEB-INF/c-rt.tld" %>
===== Indice de etiquetas =====
* **core:** Incluye tags de control de flujo tales como forEach, choose o if.
* **format:** Incluye tags para formatear fechas y números (formatNumber, formatDate, parseNumber, parseDate...) como textos en lenguajes específicos (message, setBundle, setLocale...).
* **sql:** Incluye tags para conexiones a bases de datos.
* **functions:** Incluye funciones para el tratamiento de cadenas (split(), replace(), join(), trim()...).
* **xml:** Incluye tags para interpretar datos en formato xml.
===== Incluir etiquetas =====
Podremos incluir etiquetas a nuestro .jsp o podremos incluirlas en nuestro fichero //web.xml//, para que sean accesibles desde cualquier parte de nuestra aplicación.
==== Externas a nuestra aplicación ====
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/fn" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
==== Internas en nuestra aplicación ====
<%@ taglib prefix="fmt" uri="/WEB-INF/fmt.tld" %>
<%@ taglib prefix="html" uri="/WEB-INF/struts-html-el.tld" %>
===== Ejemplos de salida y control de código=====
Tendrás que hacer la siguiente inclusión:
<%@ taglib prefix="c" uri="/WEB-INF/c-rt.tld" %>
==== Definir y usar una variable ====
${car}
==== Mostrar valores ====
==== Ifs ====
cierto!!!
==== Control de errores ====
${10/0}
Error:
==== If...Else ====
Solo uno
Varios
===== Bucles =====
==== forEach ====
Para mostrar el uso del forEach añadiremos este código al servlet, al llamar al servlet se enviará a nuestra página jsp un array de integers:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
java.util.ArrayList array = new ArrayList();
java.util.Random rnd = new Random();
for (int i=0; i<20; i++)
array.add(rnd.nextInt(100));
request.setAttribute("myArray", array);
request.getRequestDispatcher("pp.jsp").forward(request, response);
}
Se ha realizado una conversión implícita del objeto stat que en el bucle es un //javax.servlet.jsp.jstl.core.LoopTagSupport// y nosotros, mediante el atributo type, lo pasamos a //javax.servlet.jsp.jstl.core.LoopTagStatus//. De este objeto contiene varios métodos que pueden sernos útiles:
* **getCurrent**() Devuelve el objeto de la actual iteración
* **getCount**() Devuelve el número de iteración
* **isFirst**() Indica si es el primero, también existe **isLast**()
* **getFirst**() Retorna el objeto pasado en el atributo begin del bucle, si este no ha sido indicado retornará null. También existe **getEnd**()
* **getStep()** Retorna el valor del atributo step, null si no se ha especificado ninguno.
==== forTokens ====
Recorre un string, cada iteración será un elemento de este que será separado por los carácteres indicados en el atributo //delims//.
===== Ejemplos de formateo y parseo =====
Tendrás que hacer la siguiente inclusión:
<%@ taglib prefix="fmt" uri="/WEB-INF/fmt-rt.tld" %>
Con el fmt, a parte de dar formato a los datos, también podrás recoger un valor en string y **convertirlo** a integer o a date, para ello tendrás que utilizar las tags //**fmt:parseNumber**// y //**fmt:parseDate**//.
==== Formatear valores numéricos ====
Podemos hacerlo de dos formas: //número// o ////. Los atributos que acepta son:
* **type** : [number|currency|percent] Indica el tipo de formato que aplicará.
* **currencyCode** : El código que se aplicará cuando se formateen divisas. También existe **currencySymbol**
* **groupingUsed** : [true|false] Indica si se agrupará el número por partes: 1.000.200 o 10002000.
* **minIntegerDigits** : Número con el mínimo de cifras representado, si necesita menos serán sustituidas por 0 a la izquierda. También existe **maxIntegerDigits**.
* **maxFractionDigits** : Número de decimales máximo. También existe **minFractionDigits**.
* **var** : La variable donde se volcará el resultado, si se especifica este atributo el resultado del formato no saldrá por la salida hasta que no saquemos dicha variable.
* **scope** : De los scope de toda la vida
* **pattern** : Indica un formato avanzado, de esta forma es posible personalizarlo; ello lo conseguimos siguiendo la siguiente tabla:
{{sp:j2ee:jstl:patterntable2.png|}}
==== Formatear fechas ====
Igual que con números, pero usando fmt:formatDate. Atributos:
* **value**
* **type** [date|time|both]
* **dataStyle** [default|short|medium|long|full]
* **timeStyle** [default|short|medium|long|full]
* **timeZone**
* **var**
* **scope**
* **pattern** La tabla para el formato personalizado de fecha es distinta. Es la siguiente:
{{sp:j2ee:jstl:patterntable1.png|}}
===== Lectura de XML =====
==== XML de ejemplo ====
John
Smith
T
88
B
James
Smith
K
92
A
Kelly
Lane
A
72
C
==== Tag c:import ====
La tag //c:import// vuelca sobre una variable el contenido de un fichero. Nos va de puta madre para volcar un archivo .xml sobre una variable:
===== Notas =====
* El //// también tiene un atributo llamado //escapeXml//, si se pone a false cuando queramos escribir un carácter prohibido (&, <, >...) se escribirá, sino se codificará para el xhtml de la página.
* Otra tag es //// que elimina una variable asignada con c:set, para variables en las que su scope no sea la aplicación no es necesario eliminarlas, acabarán eliminandose solas.