¡Bienvenidos a todos! Esta publicación formará parte de una serie de 13 publicaciones que estaré desarrollando para aprender a desarrollar una aplicación web pura en Java bajo la plataforma JEE usando Servlets y JSPs. Este será un curso en forma de guía para aquellas personas que recién estén empezando en el mundo de la programación web y que todavía no hacen uso de ningún framework.
Haciendo uso de JSPs y Servlets construiremos nuestras aplicaciones webs los cuales se ejecutarán en Apahe Tomcat (Contenedor de Servlets), el cual lo usaremos como servidor de aplicaciones para ejecutar nuestro proyecto. Asimismo, usaremos Eclipse como herramienta IDE (Entorno de Desarrollo Integrado) para la edición y compilación de nuestro código.
Haciendo uso de JSPs y Servlets construiremos nuestras aplicaciones webs los cuales se ejecutarán en Apahe Tomcat (Contenedor de Servlets), el cual lo usaremos como servidor de aplicaciones para ejecutar nuestro proyecto. Asimismo, usaremos Eclipse como herramienta IDE (Entorno de Desarrollo Integrado) para la edición y compilación de nuestro código.
El día de hoy aprenderemos a crear etiquetas personalizadas (Custom Tags). Como sabemos, en JSP es posible hacer una librería de clases java que hagan una especie de ampliación de las etiquetas posibles de html, conocidos también como taglibs.
Recordando publicaciones anteriores...
Hace 2 publicaciones terminamos de implementar un mantenimiento a una tabla del proyecto el cual veníamos trabajando, por lo que ya sabemos como desarrollar una aplicación web en Java usando Servlet, JSPs, Scriptlets, Espressions, JSTL, DAO, MySQL, properties, mientras que en la clase anterior vimos como usar i18n (Internacionalización) en nuestro proyecto.
Mi primer taglib
Para empezar debemos de crear un archivo donde vamos a describir todos nuestros tags ese archivo será nuestro taglib.
Recordando publicaciones anteriores...
Hace 2 publicaciones terminamos de implementar un mantenimiento a una tabla del proyecto el cual veníamos trabajando, por lo que ya sabemos como desarrollar una aplicación web en Java usando Servlet, JSPs, Scriptlets, Espressions, JSTL, DAO, MySQL, properties, mientras que en la clase anterior vimos como usar i18n (Internacionalización) en nuestro proyecto.
Mi primer taglib
Para empezar debemos de crear un archivo donde vamos a describir todos nuestros tags ese archivo será nuestro taglib.
1. Importamos el proyecto de la clase anterior. Clic aquí para descargar.
2. Creamos el archivo librería.tld dentro de WebContent/WEB-INF/tag/
3. Creamos el paquete aprendamos.java.etiquetas y dentro crearemos nuestra clases que heredarán de la clase TagSupport o BodyTagSupport, dependiendo o no si nuestras etiquetas tendrán cuerpo.
4. Creamos la página customTag.jsp donde mostraremos dichas etiquetas creadas.
Ejemplos
1) Crear un tag que muestre un mensaje
2) Crear un tag que repita n veces lo definido en el cuerpo del tag
3) Crear un tag que muestre un texto de un color y tamaño definidos como atributos
4) Crear un tag que muestre una lista de elementos
5) Crear un tag que muestre una lista de elementos pasado como atributo
5) Crear un tag que muestre una lista de elementos pasado como atributo
6) Crear un tag que muestre una lista de elementos pasado como atributo y que al dar clic en una opción redireccione a una página
7) Crear un tag que muestre la fecha del sistema tomado como atributo
8) Crear un tag que muestre la inversa de una cadena pasada en el cuerpo del tag
9) Crear un tag que muestre una colección de elementos
10) Muestre los distritos de nuevoUsuario.jsp usando customTag
11) Muestre el nombre de los usuarios que empiecen con una letra y sean de un distrito en la página logueo.jsp usando customTag
Vamos a resolver los ejemplos 1, 6, 9, 10 y 11, los demás los dejaré en el archivo de descarga para que lo revisen.
Ejemplo (1)
Creamos la clase Etiqueta1.java dentro del paquete aprendamos.java.etiquetas
Declaramos nuestra etiqueta creada en el archivo libreria.tld de la siguiente manera
Mostramos la etiqueta en la página customTag.jsp
Creamos la clase Etiqueta6.java dentro del paquete aprendamos.java.etiquetas
Registramos el tag creado en el archivo libreria.tld
Mostramos la salida del tag en la página customTag.jsp
Creamos la clase Etiqueta8.java dentro del paquete aprendamos.java.etiquetas
Registramos el tag creado en el archivo libreria.tld
Mostramos la salida del tag en la página customTag.jsp
Ejemplo (10)
Creamos la clase TagSelectDistritos.java dentro del paquete aprendamos,java.etiquetas
Registramos el tag creado en el archivo libreria.tld
Mostramos la salida del tag en la página nuevoUsuario.jsp
Ejemplo (11)
Creamos la clase TagSelectUsuarios.java dentro del paquete aprendamos.java.etiquetas
Registramos el tag creado en el archivo libreria.tld
Mostramos la salida del tag en la página customTag.jsp
Ejecutamos la aplicación y tendremos lo siguiente
EXTRA LIBRERÍA JMESA
1. Descargarmos los recursos desde aquí
2. Copiamos los recursos (css, js,images) en /WebContent/
3. Copiamos los jars en /WEB-INF/lib/
4. Ejemplo de uso: Modificamos la página listadoDeUsuario.jsp
Referenciamos el archivo taglib jmesa.tld, el cual ya esta definido dentro de los recursos de la libreria de jmesa. Podemos verificar entrando a la siguiente ruta del nuestro proyecto /JavaResources/Libraries/WebAppLibraries/jmesa-2.4.4.jar/META-INF/jmesa.tld
El uri para referenciar es http://code.google.com/p/jmesa
Importamos los recuros (css, js)
Listando usuarios usando JMESA
Ejecutamos el proyecto
10) Muestre los distritos de nuevoUsuario.jsp usando customTag
11) Muestre el nombre de los usuarios que empiecen con una letra y sean de un distrito en la página logueo.jsp usando customTag
Vamos a resolver los ejemplos 1, 6, 9, 10 y 11, los demás los dejaré en el archivo de descarga para que lo revisen.
Ejemplo (1)
Creamos la clase Etiqueta1.java dentro del paquete aprendamos.java.etiquetas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package aprendamos.java.etiquetas; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; // Este tag no tiene atributos ni cuerpo public class Etiqueta1 extends TagSupport { // Este método será llamado por Tomcat cuando encuentre la etiqueta en la // página jsp @Override public int doStartTag() throws JspException { try { // Simplmente obtiene el Stream de salida getOut() para escribir // Escribo la salida del tag pageContext.getOut().println( "Bienvenido a Aprender Como Jugando..." ); } catch (Exception e) { e.printStackTrace(); } // Devolvemos SKIP_BODY para indicar que hace falta evaluar el cuerpo return SKIP_BODY; } // Este método se llamará cuando se evalue la etiqueta de fin @Override public int doEndTag() throws JspException { // Devolvemos EVAL_PAGE para indicar que se puede // seguir con el resto de la página return EVAL_PAGE; } } |
Declaramos nuestra etiqueta creada en el archivo libreria.tld de la siguiente manera
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <? xml version = "1.0" encoding = "ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" < taglib > <!-- Es nuestro número de versión para nuestra etiqueta. Puede ser el número que queramos --> < tlibversion >1.0</ tlibversion > <!-- Es la versión de jsp que estamos utilizando --> < jspversion >1.2</ jspversion > <!-- Es el prefijo con el que llamaremos a las etiquetas desde el jsp --> < shortname >ct</ shortname > <!-- Es el nombre que queramos dar a nuestra librería de etiquetas. Hay varias posibilidades, como poner una direccion web -URI-, pero basta con poner un nombre que queramos --> <!-- Registramos nuestra primera etiqueta --> < tag > <!-- Nombre del tag --> < name >tag1</ name > <!-- Clase que procesa el tag --> < tagclass >aprendamos.java.etiquetas.Etiqueta1</ tagclass > <!-- Define si el tag tiene cuerpo (jsp) o no (empty) --> < bodycontent >empty</ bodycontent > <!-- Descripcción del tag --> < info >Muestra un mensaje</ info > </ tag > </ taglib > |
Mostramos la etiqueta en la página customTag.jsp
1 2 3 4 5 6 7 8 | < table > < tr > < td class = "etiqueta" >Tag1 - tag sin atributos ni cuerpo:</ td > < td class = "control" > < ct:tag1 ></ ct:tag1 > </ td > </ tr > </ table > |
Ejemplo (6)
Creamos la clase Etiqueta6.java dentro del paquete aprendamos.java.etiquetas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package aprendamos.java.etiquetas; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; // Este tag tiene atributos pero no cuerpo public class Etiqueta6 extends TagSupport { private String elementos; private String nombre; private String seleccion; public String getNombre() { return nombre; } public void setNombre(String nombre) { this .nombre = nombre; } public String getSeleccion() { return seleccion; } public void setSeleccion(String seleccion) { this .seleccion = seleccion; } public String getElementos() { return elementos; } public void setElementos(String elementos) { this .elementos = elementos; } @Override public int doStartTag() throws JspException { // Obtengo el stream para escribir JspWriter out = pageContext.getOut(); String[] data = elementos.split( "," ); try { // Escribo la salida del tag out.println( "<select name='" + nombre + "'" + "onChange='enviar();' >" ); for (String x : data) { if (x.trim().equals(seleccion)) out.println( "<option selected>" + x + "</option>" ); else out.println( "<option>" + x + "</option>" ); } out.println( "</select>" ); } catch (IOException e) { e.printStackTrace(); } return super .doStartTag(); } } |
Registramos el tag creado en el archivo libreria.tld
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <!-- Registramos nuestra sexta etiqueta --> < tag > < name >tag6</ name > < tagclass >aprendamos.java.etiquetas.Etiqueta6</ tagclass > < attribute > < name >nombre</ name > < required >true</ required > </ attribute > < attribute > < name >elementos</ name > < required >true</ required > </ attribute > < attribute > < name >seleccion</ name > < required >true</ required > < rtexprvalue >true</ rtexprvalue > </ attribute > </ tag > |
Mostramos la salida del tag en la página customTag.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 | <form action= "logueo.jsp" > <table> <tbody> <tr> <td class = "etiqueta" >Tag6 - tag con atributos, sin cuerpo</td> <td class = "control" ><script type= "text/javascript" > function enviar() { document.forms[ 0 ].submit(); } </script> <ct:tag6 elementos= "[Seleccione], Mouse, CPU, Teclado, ABC" nombre= "cboProductos" seleccion= "${param.cboProductos}" ></ct:tag6></td> </tr> </tbody></table> </form> |
Ejemplo (9)
Creamos la clase Etiqueta8.java dentro del paquete aprendamos.java.etiquetas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package aprendamos.java.etiquetas; import java.io.*; import java.util.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; // Este tag tiene atributo pero no cuerpo public class Etiqueta9 extends TagSupport { private Collection<?> data; public void setData(Collection<?> c) { data = c; } public int doStartTag() throws JspException { try { JspWriter out = pageContext.getOut(); Iterator<?> it; for (it = data.iterator(); it.hasNext();) { out.print(" <li> " + it.next().toString() + " </li> "); } return SKIP_BODY; } catch (IOException e) { e.printStackTrace(); throw new JspException(e); } } public int doEndTag() throws JspException { return EVAL_PAGE; } } |
Registramos el tag creado en el archivo libreria.tld
1 2 3 4 5 6 7 8 9 10 11 12 | <!-- Registramos nuestra novena etiqueta --> < tag > < name >etiqueta9</ name > < tagclass >aprendamos.java.etiquetas.Etiqueta9</ tagclass > < bodycontent >empty</ bodycontent > < info >Muestra una Collection</ info > < attribute > < name >data</ name > < required >true</ required > < rtexprvalue >true</ rtexprvalue > </ attribute > </ tag > |
Mostramos la salida del tag en la página customTag.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 | < tr > < td class = "etiqueta" >Tag9 - Tag con atributos tomados como expresion:</ td > < td class = "control" > <%@ page import="java.util.Collection"%> <%@ page import="java.util.Vector"%> <% Collection coll = new Vector(); coll.add("uno"); coll.add("dos"); coll.add("tres"); %> < ct:etiqueta9 data="<%=coll%>" /> </ td > </ tr > |
Ejemplo (10)
Creamos la clase TagSelectDistritos.java dentro del paquete aprendamos,java.etiquetas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | package aprendamos.java.etiquetas; import java.io.IOException; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; // Otra forma de crear etiquetas es utilizando la clase TagSupport // Este tag tiene atributos pero no cuerpo public class TagSelectDistritos extends TagSupport { private String nombre; private List<string> elementos; public List<string> getElementos() { return elementos; } public void setElementos(List<string> elementos) { this .elementos = elementos; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this .nombre = nombre; } @Override public int doEndTag() throws JspException { // Dibujaremos otro select // referenciamos al JSP utilizando el objeto heredado pageContext JspWriter salida = pageContext.getOut(); try { salida.print( "<select name=" ); salida.print( this .getNombre()); salida.println( ">" ); salida.println( "<option value='01'>Lima</option>" ); salida.println( "<option value='02'>Independencia</option>" ); salida.println( "<option value='03'>Jesus Maria </option>" ); salida.println( "<option value='04'>San Isidro</option>" ); salida.println( "</select>" ); } catch (IOException e) { e.printStackTrace(); } return EVAL_PAGE; } } |
Registramos el tag creado en el archivo libreria.tld
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!-- Registramos nuestra décima etiqueta --> < tag > < name >cboDistritos</ name > < tagclass >aprendamos.java.etiquetas.TagSelectDistritos</ tagclass > < attribute > < name >nombre</ name > < required >true</ required > < rtexprvalue >true</ rtexprvalue > </ attribute > < attribute > < name >elementos</ name > < required >false</ required > < rtexprvalue >true</ rtexprvalue > </ attribute > </ tag > |
Mostramos la salida del tag en la página nuevoUsuario.jsp
1 2 3 4 5 6 7 8 9 10 11 12 | < tr > < td class = "control" >Distrito:</ td > < td > <!-- <select name="distrito" > <option value="01">Lima</option> <option value="02">Independencia</option> <option value="03">Jesus Maria</option> <option value="04">San Isidro</option> </select> --> < ct:cboDistritos nombre = "distrito" ></ ct:cboDistritos > </ td > </ tr > |
Ejemplo (11)
Creamos la clase TagSelectUsuarios.java dentro del paquete aprendamos.java.etiquetas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | package aprendamos.java.etiquetas; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import aprendamos.java.util.MySqlDbConn; // Este tag tiene atributos pero no cuerpo public class TagSelectUsuarios extends TagSupport { private String dist; private String letra; public String getDist() { return dist; } public void setDist(String dist) { this .dist = dist; } public String getLetra() { return letra; } public void setLetra(String letra) { this .letra = letra; } @Override public int doStartTag() throws JspException { // Obtener la conexión a bd Connection con = MySqlDbConn.obtenerConexion(); // Instrucción sql que seleccione a los usuarios cuyo nombre empiece con // una letra "" y el distrito sea "" String sql2 = "select * from tbusuario where distrito=? and nombre like ? " ; try { // Preparamos la sententcia PreparedStatement pst = con.prepareStatement(sql2); // Pasos los parametros pst.setString( 1 , dist); pst.setString( 2 , letra + "%" ); // Ejecutamos el query ResultSet rs = pst.executeQuery(); // Obtengo el stream para escribir JspWriter salida = pageContext.getOut(); try { // Escribo la salida del tag salida.print( "<select name=lista>" ); while (rs.next()) { salida.print( "<option>" + rs.getString( 3 ) + "</option>" ); } salida.print( "</select>" ); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } // Tag sin cuerpo return SKIP_BODY; } @Override public int doEndTag() throws JspException { return EVAL_PAGE; } } |
Registramos el tag creado en el archivo libreria.tld
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!-- Registramos nuestra onceava etiqueta --> < tag > < name >cboUsuarios</ name > < tagclass >aprendamos.java.etiquetas.TagSelectUsuarios</ tagclass > < attribute > < name >dist</ name > < required >true</ required > < rtexprvalue >false</ rtexprvalue > </ attribute > < attribute > < name >letra</ name > < required >true</ required > < rtexprvalue >false</ rtexprvalue > </ attribute > </ tag > |
Mostramos la salida del tag en la página customTag.jsp
1 2 3 4 5 6 7 | < tr > < td colspan = "2" > <!-- Referenciamos a nuestra librería de Custom TAGs--> <%@ taglib prefix="ct" uri="http://milibreri.facilito.com/jsp/ctag/mio"%> < ct:cboUsuarios letra = "j" dist = "01" ></ ct:cboUsuarios > </ td > </ tr > |
Ejecutamos la aplicación y tendremos lo siguiente
Ingresar en la url http://localhost:8080/LP2-Semana07a/customTag.jsp
EXTRA LIBRERÍA JMESA
1. Descargarmos los recursos desde aquí
2. Copiamos los recursos (css, js,images) en /WebContent/
3. Copiamos los jars en /WEB-INF/lib/
4. Ejemplo de uso: Modificamos la página listadoDeUsuario.jsp
Referenciamos el archivo taglib jmesa.tld, el cual ya esta definido dentro de los recursos de la libreria de jmesa. Podemos verificar entrando a la siguiente ruta del nuestro proyecto /JavaResources/Libraries/WebAppLibraries/jmesa-2.4.4.jar/META-INF/jmesa.tld
El uri para referenciar es http://code.google.com/p/jmesa
1 2 | <!-- Referenciamos a la libreria de jmesa --> <%@ taglib prefix="jmesa" uri="http://code.google.com/p/jmesa"%> |
Importamos los recuros (css, js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <!-- Referenciamos a jquery dado que jmesa utiliza esta libreria de javascript --> < link href = "./css/web.css" rel = "stylesheet" type = "text/css" > < link href = "./css/jmesa.css" rel = "stylesheet" type = "text/css" > < script src = "./js/jquery-1.3.min.js" type = "text/javascript" ></ script > < script src = "./js/jquery.bgiframe.pack.js" type = "text/javascript" ></ script > < script src = "./js/jquery.jmesa.js" type = "text/javascript" ></ script > < script src = "./js/jmesa.js" type = "text/javascript" ></ script > < script type = "text/javascript" > function onInvokeAction(id, action) { $.jmesa.setExportToLimit(id, ''); if (action == 'sort') { var limit = LimitManager.getLimit(id); var sortSet = limit.getSortSet(); if (sortSet) { var sort = limit.sortSet[limit.sortSet.length - 1]; removeAllSortsFromLimit(id); limit.sortSet[0] = sort; } } $.jmesa.createHiddenInputFieldsForLimitAndSubmit(id); } function onInvokeExportAction(id) { var parameterString = $.jmesa.createParameterStringForLimit(id); location.href = '${pageContext.request.contextPath}/usuario.do?operacion=lista&' + parameterString; } </ script > |
Listando usuarios usando JMESA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!-- Generamos el listado con Jmesa --> < jmesa:tableFacade id = "listado01" items = "${requestScope.li_usuarios}" var = "usu" maxRows = "2" maxRowsIncrements = "2,4,6" > < jmesa:htmlTable > < jmesa:htmlRow > < jmesa:htmlColumn property = "nombre" title = "Nombre" sortOrder = "asc,desc" /> < jmesa:htmlColumn property = "direccion" title = "Direccion" /> < jmesa:htmlColumn title = "Eliminar" > < a href = "usuario.do?operacion=elimina&usuario=${usu.usuario}" >E</ a > </ jmesa:htmlColumn > < jmesa:htmlColumn title = "Modificar" property = "x" > < a href = "usuario.do?operacion=cargaModifica&usuario=${usu.usuario}" >M</ a > </ jmesa:htmlColumn > </ jmesa:htmlRow > </ jmesa:htmlTable > </ jmesa:tableFacade > |
Ejecutamos el proyecto
Descargar ejercicio
No hay comentarios, ¡cuéntame algo!
Me gustaría saber tu opinión. ¡Saludos!