(español) manual programacion java jsp y xml

Upload: victor-vera-velarde

Post on 07-Apr-2018

247 views

Category:

Documents


1 download

TRANSCRIPT

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    1/69

    Parte I, Conocer JSP

    Si hemos tenido la oportunidad de construir aplicaciones Web usando tecnologascomo CGI y Servlets, estaremos acostumbrados a la idea de escribir un programaque genere la pagina entera (las partes estticas y dinmicas) usando el mismo

    programa. Si estamos buscando una solucin en la cual podamos separar las dospartes, no tenemos que buscar ms. Las JavaServer Pages (JSP) estn aqu.

    Las pginas JSP permiten que separemos la presentacin final de la lgica denegocio (capas media y final). Es un gran "Rapid Application Development" (RAD)de aplicaciones Web. Esta seccin explica los conceptos y las ventajas de latecnologa JSP, y luego demostraremos cmo utilizar esta tecnologa emocionante,y cmo crear componentes reutilizables para manejar formularios.

    La Web Dinmica

    El Web se ha desarrollado desde un sistema de informacin distribuido hypermediabasado en red que ofreca informacin esttica hasta un mercado para vender ycomprar mercancias y servicios. Las aplicaciones cada vez ms sofisticadas parapermitir este mercado requieren una tecnologa para presentar la informacindinmica.

    Las soluciones de primera generacin incluyeron CGI, que es un mecanismo paraejecutar programas externos en un servidor web. El problema con los scripts CGI esla escalabilidad; se crea un nuevo proceso para cada peticin.

    Las soluciones de segunda generacin incluyeron vendedores de servidores Webque proporcionaban plug-ins y a APIs para sus servidores. El problema es que sussoluciones eran especficas a sus productos servidores. Por ejemplo, Microsoftproporcion las pginas activas del servidor (ASP) que hicieron ms fcil crear elcontenido dinmico. Sin embargo, su solucin slo trabajaba con Microsoft IIS oPersonal Web Server. Por lo tanto, si deseabamos utilizar ASP tenamos queconfiarnos a los productos de Microsoft y no estaramos gozando de la libertad deseleccionar nuestro servidor web y sistema operativo preferidos!

    Otra tecnologa de segunda generacin que es absolutamente popular en lasempresa son los Servlets. Los Servlets hacen ms fcil escribir aplicaciones del ladodel servidor usando la tecnologa Java. El problema con los CGI o los Servlets, sinembargo, es que tenemos que seguir el ciclo de vida de escribir, compilar ydesplegar .

    Las pginas JSP son una solucin de tercera generacin que se pueden combinarfcilmente con algunas soluciones de la segunda generacin, creando el contenidodinmico, y hacindo ms fcil y ms rpido construir las aplicaciones basadas enWeb que trabajan con una variedad de otras tecnologas: servidores Web,navegadores Web, servidores de aplicacin y otras herramientas de desarrollo.

    JavaServer Pages (JSP)

    La tecnologa JSP es una especificacin abierta (y gratis) disponible y desarrolladapor Sun Microsystems como un alternativa a Active Server Pages (ASP) deMicrosoft, y son un componente dominante de la especificacin de Java 2 Enterprise

    Edition (J2EE). Muchos de los servidores de aplicaciones comercialmente

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    2/69

    disponibles (como BEA WebLogic, IBM WebSphere, Live JRun, Orion, etctera) yautilizan tecnologa JSP.

    JSP contra ASP

    JSP y ASP ofrecen funciones similares. Ambos utilizan etiquetas para permitircdigo embebido en una pgina HTML, seguimiento de sesin, y conexin a basesde datos. Algunas de las diferencias triviales son:

    Las pginas ASP estn escritas en VBScript y las pginas JSP estn escritas enlenguaje Java. Por lo tanto, las pginas JSP son independientes de la plataforma

    y las pginas ASP no lo son.

    Las pginas JSP usan tecnologa JavaBeans como arquitectura de componentesy las pginas ASP usan componentes ActiveX.

    Ms all de estas diferencias triviales, hay varias diferencias importantes, quepodran ayudarnos a elegir la tecnologa para nuestras aplicaciones:

    Velocidad y Escalabilidad: Aunque las pginas ASP son cacheadas, siempreson interpretadas, las pginas JSP son compiladas en Servlets Java y cargadas en

    memoria la primera vez que se las llama, y son ejecutadas para todas las

    llamadas siguientes. Esto le da a las pginas JSP la ventaja de la velocidad y

    escalabilidad sobre las pginas ASP.

    Etiquetas Extensibles: Las pginas JSP tiene una caracterstica avanzadaconocida como etiquetas extensibles. Esto mecanismo permite a los

    desarrolladores crear etiquetas personalizadas. En otras palabras, las etiquetas

    extensibles nos permiten extender la sntaxis de las etiquetas de las pginas JSP.

    No podemos hacer esto en ASP. Libertad de Eleccin: A menos que instalemos Chili!Soft ASP, las pginas

    ASP slo trabajan con Microsoft IIS y Personal Web Server. El uso de pginas

    ASP requiere un compromiso con los productos de Microsoft, mientras que las

    pginas JSP no nos imponen ningn servidor web ni sistema operativo. Las

    pginas JSP se estn conviertiendo en un estndard ampliamente soportado.

    Para una comparacin ms detallada entre las pginas JSP y ASP puedes verComparing JSP and ASP.

    Entorno de Software

    Para ejecutar las pginas JSP, necesitamos un servidor web con un contenedor Webque cumpla con las especificaciones de JSP y de Servlet. El contenedor Web seejecuta en el servidor Web y maneja la ejecucin de todas las pginas JSP y de losservlets que se ejecutan en ese servidor Web. Tomcat 3.2.1 es una completaimplementacin de referencia para las especificacions Java Servlet 2.2 y JSP 1.1.Dese aqu puedes descargar las versiones binarias de Tomcat.

    Para configurar Tomcat:

    Configuramos la variable de entorno JAVA_HOME para que apunte aldirectorio raz de nuestra instalacin de Java 2 Standard Edition (J2SE).

    Configuramos la variable de entorno TOMCAT_HOME para que apunte aldirectorio raz de nuestra instalacin de Tomcat.

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    3/69

    Para arrancar Tomcat, usamos TOMCAT_HOME/bin/startup.bat para Windowso startup.sh para UNIX.

    Por defecto, empezar a escuchar en el puerto 8080.

    Grabamos nuestros ficheros .jsp en TOMCAT_HOME/webapps/examples/jsp ynuestras clases JavaBeans en TOMCAT_HOME/webapps/examples/web-inf/classes.

    Nota:

    Si estamos trabajando bajo Windows, podemos obtener un error Out of spaceenvironment cuando intentemos arrancar Tomcat. Hay dos maneras de corregiresto: cambiar la configuracin inicial de la memoria de la ventana de DOS a unvalor mayor de 3200. O editar el fichero config.sys y agregar la lnea siguiente:SHELL=c:\PATHTO\command.com /E:4096 /P.

    Cmo Funcionan las Pginas JSP?

    Una pgina JSP es bsicamente una pgina Web con HTML tradicional y cdigoJava. La extensin de fichero de una pgina JSP es ".jsp" en vez de ".html" o".htm", y eso le dice al servidor que esta pgina requiere un manejo especial quese conseguir con una extensin del servidor o un plug-in. Aqu hay un sencilloejemplo :

    Ejemplo 1: date.jsp

    JSP ExampleDate and Time

    Este ejemplo contiene HTML tradicional y algn cdigo Java. La etiqueta identifica el final de un scriptlet.Cuando un navegador solicite la pgina date.jsp veremos algo similar a la Figura 1.

    Figura 1: Peticin de date.jsp

    Detrs de la Escena

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    4/69

    Cuando se llame a sta pgina (date.jsp), ser compilada (por el motor JSP) en unServlet Java. En este momento el Servlet es manejado por el motor Servelt comocualquier otro Servlet. El motor Servlet carga la clase Servlet (usando un cargadorde clases) y lo ejecuta para crear HTML dinmico para enviarlo al navegador, comose ve en la Figura 2. Para este ejemplo, el Servelt crea un objeto Date y lo escribecomo un String en el objeto out, que es el stream de salida hacia el navegador.

    Figura 2: Flujo Peticin/Respuesta cuando se llama a una pgina JSP.

    La siguiente vez que se solicite la pgina, el motor JSP ejecuta el Servlet yacargado a menos que la pgina JSP haya cambiado, en cuyo caso esautomticamente recompilada en un Servlet y ejecutada.

    Elementos de Script

    En el ejemplo date.jsp se usa todo el nombre de la clase Date incluyendo el nombredel paquete, lo que podra llegar a ser tedioso. Si queremos crear un ejemplar de laclase Date usando simplemente: Date today = new Date(); sin tener queespecificar el path completo de la clase, usamos la directiva page de esta forma:

    Ejemplo 2 :date2.jsp

    JSP ExampleDate and Time

    Todava hay otra forma de hacer lo mismo usando la etiqueta

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    5/69

    JSP Example

    Date and TimeToday's date is:

    Como podemos ver, se puede conseguir el mismo resultado usando diferentesetiquetas y tcnicas. Hay varios elementos de script JSP. Hay algunas reglasconvencionales que nos ayudarn a usar ms efectivamente los elementos deScript JSP.

    Usamos para manejar declaraciones, expresiones, o cualquier otrotipo de cdigo vlido.

    Usamos la directiva page como en para definir el lenguaje deescript. Tambin puede usarse para especificar sentencias import. Aqu hay un

    ejemplo:

    Usamos para declarar variables o mtodos. Por ejemplo:

    Usamos para definir una expresin y forzar el resultado a un String.Por ejemplo: o .

    Usamos la directiva include como en para insertar elcontenido de otro fichero en el fichero JSP principal. Por ejemplo:

    Puedes encontrar ms informacin sobre las directivas y scriptles de JSP en laspginas del tutorial sobre Servlets y JSP

    Manejar Formularios

    Una de las partes ms comunes en aplicaciones de comercio electrnico es unformulario HTML donde el usuario introduce alguna informacin como su nombre ydireccin. Usando JSP, los datos del formulario (la informacin que el usuariointroduce en l) se almacenan en un objeto request que es enviado desde elnavegador hasta el contenedor JSP. La peticin es procesada y el resultado se envaa travs de un objeto response de vuelta al navegador. Estos dos objetos estdisponibles implcitamente para nosotros.

    Para demostrar como manejar formularios HTML usando JSP, aqu tenemos unformulario de ejemplo con dos campos: uno para el nombre y otro para el email.Como podemos ver, el formulario HTML est definido en un fichero fuente JSP. Seutiliza el mtodo request.getParameter para recuperar los datos desde el formulario

    en variables creadas usando etiquetas JSP.

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    6/69

    La pgina process.jsp imprime un formulario o la informacin proporcionada por elusuario dependiendo de los valores de los campo del formulario. Si los valores delformulario son null se muestra el formulario, si no es as, se mostrar lainformacin proporcionada por el usuario. Observa que el formulario es creado ymanejado por el cdigo del mismo fichero JSP.

    Ejemplo 4: process.jsp

    Form Example

    User Info Request Form

    Your name:

    Your email:

    You have provided the following info:

    Name:

    Email:

    Si solicitarmos process.jsp desde un navegador Web, veramos algo similar a lafigura 3:

    Figura 3: imagen de process.jsp

    Introducimos nuestro nombre y email y pulsamos Process para enviar el formulariopara su proceso, y veremos algo similar a a la Figura 4:

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    7/69

    Figura 4 : Formulario procesado

    Componentes Reutilizables

    El ejemplo del formulario anterior es simple en el sentido de que no hay muchocdigo implicado. Cuanto ms cdigo est implicado, ms importante es no mezclarla lgica del negocio con la presentacin final en el mismo fichero. La separacin dela lgica de negocio de la presentacin permite cambios en cualquier sitio sinafectar al otro. Sin embargo, el cdigo de produccin JSP se debe limitar a lapresentacin final. As pues, cmo implementamos la parte de la lgica de

    negocio?

    Aqu es donde los JavaBeans entran en juego. Esta tecnologa es un modelo decomponente portable, independiente de la plataforma que permite a losdesarrolladors escribir componentes y reutilizarlos en cualquier lugar. En elcontexto de JSP, los JavaBeans contienen la lgica de negocio que devuelve datos aun script en una pgina JSP, que a su vez formatea los datos devueltos por elcomponente JavaBean para su visualizacin en el navegdor. Una pgina JSP utilizaun componente JavaBean fijando y obteniendo las propiedades que proporciona.

    Cules son los beneficios?

    Hay muchos beneficios en la utilizacin de JavaBeans para mejorar las pginas JSP:

    Componentes Reutilizables: diferentes aplicaciones pueden reutilizar los mismoscomponentes.

    Separacin de la lgica de negocio de la lgica de presentacin: podemosmodificar la forma de mostrar los datos sin que afecte a la lgica del negocio.

    Protegemos nuestra propiedad intelectual manteniendo secreto nuestro cdigofuente.

    Ejemplo: Usar JavaBeans con JSP

    Ahora, veamos como modificar el ejemplo anterior, process.jsp para usarJavaBeans. En el formulario anterior haba dos campos: name y email. EnJavaBeans, son llamados propiedades. Por eso, primero escribimos un componenteJavaBean con mtodos setX getX, donde X es el nombre de la propiedad. Porejemplo, si tenemos unos mtodos llamados setName y getName entoncestenemos una propiedad llamada name. El ejemplo 5 muestra un componenteFormBean.

    Los buenos componentes deben poder interoperar con otros componentes dediferentes vendedores. Por lo tanto, para conseguir la reutilizacin del componente,debemos seguir dos reglas importantes (que son impuestas por la arquitectura

    JavaBeans):

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    8/69

    1. Nuestra clase bean debe proporcionar un constructor sin argumentos para quepueda ser creado usando Beans.instantiate.

    2. Nuestra clase bean debe soportar persistencia implementando el interfaceSerializable o Externalizable.

    Ejemplo 5: FormBean.java

    package userinfo;import java.io.*;

    public class FormBean implements Serializable {private String name;private String email;public FormBean() {name = null;email = null;

    }public void setName(String name) {this.name = name;

    }public String getName() {return name;

    }public void setEmail(String email) {this.email = email;

    }public String getEmail() {return email;

    }}

    Para poder usar el componente FormBean en el fichero JSP, necesitamosejemplarizar el componente. Esto se hace usando la etiqueta . Lasiguiente lnea se ejecuta cuando se ha ejemplarizado el bean, y

    se usa para inicializar sus propiedades. En este caso, ambas propiedades (name yemail) se configuran usando una sla sentencia. Otra posible forma de configurarlas propiedades es hacerlo una a una, pero primero necesitamos recuperar losdatos desde el formulario. Aqu tenemos un ejemplo de como configurar lapropiedad name:

    Una vez que se han inicializado las propiedades con los datos recuperados delformulario, se recuperan los valores de las propiedades usando en la parte else, como se ve en el Ejemplo 6:

    Ejemplo 6: process2.jsp

    Form Example

    User Info Request Form

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    9/69

    Your name:

    Your email:

    You have provided the following info:

    Name:

    Email:

    Conclusin

    Los desarrolladores interesados en crear aplicaciones Web de calidad debenfamiliarizarse con las tecnologas que son aplicables no solamente para el mercadode hoy en da sino tambin para el de maana, a saber JSP y XML. La siguientepgina discutir las capacidades que proporciona la tecnologa JSP y que sonideales para trabajar con XML; y muestra cmo utilizar con eficacia JSP y XML. JSPy XML hacen una combinacin excelente para las aplicaciones Web que comparteninformacin, porque las pginas JSP tienen soporte interno de XML en la forma delibreras de etiquetas JSP personalizadas.

    Parte II: JSP con XML en Mente

    El "Extensible Markup Language" (XML) se ha convertido en el formato estndar defacto para la representacin de datos en Internet. Los datos XML se puedenprocesar e interpretar en cualquier plataforma -- desde el dispositivo de mano auna unidad central. Es un compaero perfecto para las aplicaciones Java quenecesitan datos portables.

    Java es el lenguaje de programacin ganador para utilizar con XML. La mayora delos analizadores de sintaxis de XML se escriben en Java, y proporciona unacoleccin comprensiva de APIs Java pensada especficamente para construiraplicaciones basadas en XML. La tecnologa JavaServer Pages (JSP) tiene acceso atodo esto puesto que puede utilizar todo el poder de la plataforma Java paraacceder a objetos del lenguaje de programacin para analizar y transformardocumentos XML. JSP se ha diseado con XML en mente; podemos escribir unapgina JSP como un documento XML!

    Esta pgina presenta una breve introduccin a XML y luego muestra como:

    Presentar documentos XML Generar XML usando JSP Analizar documentos XML usando "Simple Access API for XML" (SAX) y

    "Document Object Model" (DOM)

    Usar SAX y DOM en JSP Transformar XML en otros lenguajes de marcas.

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    10/69

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    11/69

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    12/69

    Figura 1: stocks.xml en un navegador

    Bsicamente, el navegador ha analizado el documento y lo ha mostrado de unaforma estructurada. Pero, esto no es realmente til desde el punto de vista de un

    usuario. Los usuarios desean ver los datos mostrados como informacin til de unaforma que sea fcil de navegar.

    Una forma agradable para mostrar documentos XML es aplicar una transformacinsobre el documento XML, para extraer los datos o para crear un nuevo formato(como transformar datos XML a HTML). Esta transformacin se puede hacer usandoun lenguaje de transformacin como "Extensible Stylesheet LanguageTransformation" (XSLT), que forma parte de XSL. XSL permite que escribamos elvocabulario XML para especificar la semntica del formato. Es decir hay dos partesde XSL, que son parte de la actividad de estilo del World Wide Web Consortium(W3C).

    Lenguaje de Transformacin (XSLT) Lenguaje de Formateo (objetos de formateo XSL)

    La hoja de estilos XSL del Ejemplo 2 realiza la transformacin rquerida para elelemento portfolio. Genera marcas HTML y extrae datos de los elementos deldocumento stocks.xml.

    Ejemplo 2: stocks.xsl

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    13/69

    Stocks

    Stock SymbolCompany NamePrice

    Parece un poco complejo , no? Sola al principio, una vez que conozcamos lasntaxis XSL es bastante sencillo. Aqu lo tenemos todo sobre la sntaxis de arriba:

    xsl:stylesheet: elemento raz xsl:template: cmo transformar los nodos seleccionados match: atributo para seleccionar un nodo "/": nodo raz del documento XML de entrada xsl:apply-templates: aplica las plantillas a los hijos del nodo seleccionado xsl:value-of: nodo seleccionados (extrae datos de los nodos seleccionados)

    Ahora la cuestin es: cmo usar esta hoja de estilos XSL con el documentostocks.xml? La respuesta es sencilla, necesitamos modificar la primera lnea deldocumento stocks.xml del Ejemplo 1 para usar la hoja de estilos stocks.xsl para

    su representacin. La primera lnea del ejemplo 1 ahora debera ser:

    Esto dice bsicamente que cuando cargamos stocks.xml en un navegador (seranalizado como un rbol de nodos), se debe utilizar la hoja de estiloscorrespondiente para extraer datos de los nodos del rbol. Cuando cargamos elfichero stocks.xml modificado en un navegador que soporta XML y XSL (como IEde Microsoft), veremos algo similar a la figura 2.:

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    14/69

    Figura 2: Usando una hoja de estilo (stocks.xsl)

    Generar XML desde JSP

    Se puede usar la tecnologa JSP para generar documentos XML. Una pgina JSPpodra generar fcilmente una respuesta conteniendo el documento stocks.xml delEjemplo 1, como se ve en el ejemplo 3. El principal requerimiento para generar

    XML es que la pgina JSP seleccione el tipo de contenido de la pgina de formaapropiada. Como podemos ver a partir del ejemplo 3, el tipo de contenido seselecciona a text/xml. Se puede usar la misma tcnica para generar otros lenguajesde marcas (como WML).

    Ejemplo 3:genXML.jsp

    SUNWSun Microsystems17.1

    AOLAmerica Online51.05

    IBMInternational BusinessMachines116.10

    MOTMOTOROLA15.20

    Si solicitamos la pgina genXML.jsp desde un servidor Web (como Tomcat),veramos algo similar a la figura 1.

    Generar XML desde JSP y JavaBeans

    Los datos para XML tambin pueden recuperarse desde un componente JavaBean.Por ejemplo, el siguiente componente JavaBean, PortfolioBean, define un bean condatos de stocks:

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    15/69

    Ejemplo 4: PortfolioBean.java

    package stocks;

    import java.util.*;

    public class PortfolioBean implements

    java.io.Serializable {private Vector portfolio = new Vector();

    public PortfolioBean() {portfolio.addElement(new Stock("SUNW","Sun Microsystems", (float) 17.1));portfolio.addElement(new Stock("AOL","America Online", (float) 51.05));portfolio.addElement(new Stock("IBM","International Business Machines",(float) 116.10));

    portfolio.addElement(new Stock("MOT","MOTOROLA", (float) 15.20));

    }

    public Iterator getPortfolio() {return portfolio.iterator();

    }}

    La clase PortfolioBean usa la clase Stock que se muestra en el Ejemplo 5.

    Ejemplo 5: Stock.java

    package stocks;

    public class Stock implements java.io.Serializable {private String symbol;private String name;private float price;

    public Stock(String symbol, String name,float price) {this.symbol = symbol;this.name = name;this.price = price;

    }

    public String getSymbol() {return symbol;

    }

    public String getName() {return name;

    }

    public float getPrice() {

    return price;}

    }

    Ahora, podemos escribir una pgina JSP para generar un documento XML donde losdatos son recuperados desde el PortfolioBean, como se ve en el Ejemplo 6.

    Ejemplo 6: stocks.jsp

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    16/69

    portfolio.getPortfolio();Stock stock = null;%>

    Si solicitamos la pgina stocks.jsp desde un navegador Web que soporte XML,obtendramos algo similar a la Figura 3.

    Figure 3: Generar XML desde JSP y JavaBeans

    Si reemplazamos la lnea:

    con una lnea que especifique una hoja de estilos:

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    17/69

    El documento XML ser generado y se aplicar la hoja de estilo XSL y veremos algosimilar a la figura 2 anterior.

    Convertir XML a Objetos del Lado del Servidor

    Hemos visto cmo generar XML, as que la pregunta ahora es cmo consumirlo (ousarlo) en aplicaciones. Para poder hacer todo lo que necesitamos para convertirXML en objetos del lado del servidor y extraer las propiedades del objeto. Laconversin no es automtica; tenemos que analizar manualmente un documentoXML, y encapsularlo dentro de un componente JavaBeans. En el futuro sinembargo, la tecnologa de unin XML/Java automatizar este proceso puespermitir compilar un esquema XML en clases Java.

    Para analizar se pueden usar dos interfaces:

    Simple API for XML (SAX) Document Object Model (DOM)

    Antes de introducirnos en estas tcnica de anlisis, primero describiremos elentorno de software.

    El Entorno de Software

    El entorno de software que usaremos para analizar es el API para Prorcesamientode XML (JAXP) versin 1.1 que soporta SAX , DOM level 2, y XSL transformations.JAXP puede ser descargado desde aqu.

    Para instalarlo, lo descomprimimos en un directorio de nuestro eleccin, y

    actualizamos el classpath para incluir el rbol de fichero JAR del JAXP.

    crimson.jar: el analizador XML por defecto, que fue derivado del analizador"Java Project X " de Sun

    xalan.jar: El motor XSLT por defecto jaxp.jar: los APIs

    Alternativamente, podemos instalar estos ficheros JAR como extensiones de Java 2simplemente copindolos en el directorio JAVA_HOME/jre/lib/ext, dondeJAVA_HOME es el directorio donde instalamos el JDK (por ejemplo c:\jdk1.3).Instalar los ficheros JAR como extensiones de Java 2 elimina la necesidad demodificar el classpath.

    API Simple para XML (SAX)

    SAX es un sencillo API para XML. No es un analizador! Simplemente es un interfaceestndar, implementado por muchos y diferentes analizadores XML, que fuedesarrollado por los miembros de la XML-DEV mailing list, actualmente hospedadapor OASIS.

    La ventaja principal de SAX es que es ligero y rpido. Esto es principalmenteporque es un API basado en eventos, lo que significa que reporta eventos deanlisis (como el comienzo y el final de los elementos) directamente a la aplicacin

    usando servicios repetidos, segn lo mostrado en la Figura 4. Por lo tanto, la

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    18/69

    aplicacin implementa manejadores para ocuparse de los diversos eventos, como elmanejo de eventos en un interface grfico de usuario.

    Figura 4: SAX usa retrollamadas para notificar a los manejadores las cosas de inters

    Usar SAX implica los siguientes pasos, mostrados en le Figura 7.

    Implementar uno o ms manejadores (en este ejemplo se implementa elContentHandler)

    Crear un XMLReader Crear un InputSource Llamar a parse sobre la fuente de entrada

    Observa que MySAXParserBean sobreescribe los mtodos startElement,endElement, y characters, todos los cuales estn definidos por el interfaceContentHandler. El analizador llama al mtodo startElement al principio de cadaelemento del documento XML, y llama al mtodo characters para reportar cadadato de caracter, y finalmente llama al mtodo endElement al final de cadaelemento del documento XML.

    Ejemplo 7: MyParserBean.java

    package saxbean;

    import java.io.*;import java.util.*;import org.xml.sax.*;import org.xml.sax.helpers.DefaultHandler;import javax.xml.parsers.SAXParserFactory;importjavax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;

    public class MySAXParserBean extendsDefaultHandler implements java.io.Serializable {

    private String text;private Vector vector = new Vector();private MyElement current = null;

    public MySAXParserBean() {}

    public Vector parse(String filename) throwsException {SAXParserFactory spf =SAXParserFactory.newInstance();

    spf.setValidating(false);SAXParser saxParser = spf.newSAXParser();// create an XML readerXMLReader reader = saxParser.getXMLReader();FileReader file = new FileReader(filename);

    // set handlerreader.setContentHandler(this);// call parse on an input source

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    19/69

    reader.parse(new InputSource(file));return vector;

    }

    // receive notification of the beginning of anelementpublic void startElement (String uri, String name,String qName, Attributes atts) {

    current = new MyElement(uri, name, qName, atts);vector.addElement(current);text = new String();

    }

    // receive notification of the end of an elementpublic void endElement (String uri, String name,String qName) {if(current != null && text != null) {

    current.setValue(text.trim());}current = null;

    }

    // receive notification of character datapublic void characters (char ch[], int start,int length) {if(current != null && text != null) {

    String value = new String(ch, start, length);text += value;

    }}

    }

    MySAXParserBean est usando la clase MyElement, que se define en el ejemplo 8.

    Ejemplo 8: MyElement.java

    package saxbean;

    import org.xml.sax.Attributes;

    public class MyElement implementsjava.io.Serializable {

    String uri;String localName;String qName;String value=null;Attributes attributes;

    public MyElement(String uri, String localName,String qName, Attributes attributes) {this.uri = uri;this.localName = localName;

    this.qName = qName;this.attributes = attributes;

    }

    public String getUri() {return uri;

    }

    public String getLocalName() {return localName;

    }

    public String getQname() {return qName;

    }

    public Attributes getAttributes() {return attributes;}

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    20/69

    public String getValue() {

    return value;}

    public void setValue(String value) {this.value = value;

    }

    }

    Ahora, si queremos, podemos probar el MySAXParserBean desde la lnea decomando para asegurarnos de que funciona. El ejemplo 9 muestra una sencillaclase de prueba:

    Ejemplo 9: MyTestDriver.java

    import java.io.*;import java.util.*;

    public class MyTestDriver {

    public static void main(String argv[]) {String file = new String(argv[0]);MySAXParserBean p = new MySAXParserBean();String str = null;try {

    Collection v = p.parse(file);Iterator it = v.iterator();while(it.hasNext()) {

    MyElement element =(MyElement)it.next();String tag = element.getLocalName();

    if(tag.equals("symbol")) {System.out.println("Symbol." + element.getValue());

    } else if(tag.equals("name")) {System.out.println("Name: "

    +element.getValue());} else if (tag.equals("price")) {System.out.println("Price: "+element.getValue());

    }}

    } catch (Exception e) {}

    }}

    Si ejecutamos MyTestDriver proporcionndole el documento XML del ejemplo 1"stocks.xml", veremos algo similar a la Figura 5.

    Figura 5: Probar el analizador XML desde la lnea de comandos.

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    21/69

    Ahora, veamos cmo usar el MySAXParserBean desde una pgina JSP. Comopodemos ver desde el Ejemplo 10, es sencillo. LLamamos al mtodo parse deMySAXParserBean sobre el documento XML (stocks.xml), y luego iteramos sobrelos stocks para extraer los datos y formatearlos en una tabla HTML.

    Nota:

    El documento XML de entrada al mtodo parse pueder ser una URL que referencie aun documento XML (como http://www.host.com/xml/ebiz.xml).

    Ejemplo 10: saxstocks.jsp

    sax parser

    My PortfolioStock Symbol

    Company NamePrice

    Si solicitamos saxstocks.jsp veremos algo similar a la Figura 6.

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    22/69

    Figura 6: Usar MySAXParserBean desdeJSP

    Document Object Model (DOM)

    DOM es un interface neutral a la plataforma - y al lenguaje- para acceder yactualizar documentos. Sin embargo, al contrario que SAX, DOM accede a undocumento XML a travs de una estructura arborescente, compuesta por nodoselemento y nodos de texto, segn lo mostrado en la figura 7.

    Figura 7: DOM crea un rbol desde un documento XML.

    El rbol ser construido en memoria y por lo tanto se consumen grandes requisitosde memoria al usar DOM. Sin embargo, la ventaja de DOM es que es ms simple deprogramar que SAX. Como podemos ver desde el ejemplo 11, un documento XMLse puede convertir en un rbol con tres lneas de cdigo. Una vez que tengamos un

    rbol, podemos recorrerlo o atravesarlo hacia adelante y hacia atrs.

    Ejemplo 11: MyDOMParserBean.java

    package dombean;

    import javax.xml.parsers.*;import org.w3c.dom.*;

    import java.io.*;

    public class MyDOMParserBeanimplements java.io.Serializable {

    public MyDOMParserBean() {}

    public static DocumentgetDocument(String file) throws Exception {

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    23/69

    // Step 1: create a DocumentBuilderFactoryDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    // Step 2: create a DocumentBuilderDocumentBuilder db = dbf.newDocumentBuilder();

    // Step 3: parse the input file to geta Document object

    Document doc = db.parse(new File(file));return doc;

    }}

    Esto producir un rbol, por eso necesitamos atraversarlo, Esto se hace usando elmtodo traverseTree en la pgina JSP, domstocks.jsp, en el ejemplo 12.

    Ejemplo 12: domstocks.jsp

    dom parser

    My PortfolioStock SymbolCompany NamePrice

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    24/69

    break;}// handle text nodescase Node.TEXT_NODE: {

    String data =node.getNodeValue().trim();

    if((data.indexOf("\n") 0)) {

    out.println(""+data+"");

    }}

    }}

    %>

    Si solicitamos domstocks.jsp desde un navegador, veramos algo similar a lafigura 6 de arriba.

    Transformar XML

    Como que los navegadores estn llegando a estar disponibles en ms dispositivos,la habilidad de transformar datos de Internet en mltiples formatos, como XML,HTML, WML, o XHTML, se est convirtiendo cada vez en ms importante. El XSLT sepuede utilizar para transformar XML en cualquier formato deseado. Un motor detransformacin o un procesador tomara un documento XML como entrada yutilizara la hoja de estilo de transformacin XSL para crear un nuevo formato dedocumento, segn lo mostrado en la figura 8.

    Figura 8: Usar un motor XSLT

    El ejemplo siguiente, xml2html, muestra cmo transformar el documento XML,stocks.xml, en un documento HTML, stocks.html. Como podemos ver, una vezque tengamos el documento XML y la hoja de estilo XSL a aplicar, toda latransformacin se hace en tres lneas.

    Ejemplo 13: xml2html.java

    import javax.xml.transform.*;

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    25/69

    import javax.xml.transform.stream.*;import java.io.*;

    public class xml2html {public static void main(String[] args)

    throws TransformerException,TransformerConfigurationException,

    FileNotFoundException, IOException

    {TransformerFactory tFactory = TransformerFactory.newInstance();Transformer transformer = tFactory.newTransformer(new

    StreamSource("stocks.xsl"));transformer.transform(new StreamSource(args[0]), new StreamResult(new

    FileOutputStream(args[1])));System.out.println("** The output is written in "+ args[1]+" **");

    }}

    Para ejecutar este ejemplo, usamos el comando:

    C:> java xml2html stocks.xml stocks.html

    stocks.xml es el fichero de entrada, y ser transformado en stocks.htmlbasndose en la hoja de estilos stocks.xsl. Aqu estamos utilizando la hoja deestilo anterior, pero hemos agregado un par de nuevas lneas para especificar elmtodo de salida (HTML en este caso) segn lo mostrado en el ejemplo 14.

    Ejemplo 14:stocks2.xsl

    Se generarn las etiquetas HTML como se muestra en la Figura 9:

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    26/69

    Figura 9: Transformacin xml2html

    Parte III: Desarrollar Etiquetas JSP PersonalizadasLa tecnologa JavaServer Pages (JSP) hace fcil embeber trozos de cdigo Java (oscriptlets) en documento HTML. Sin embargo, esta solucin, podra no ser adecuadapara todos los desarrolladores de contenido HTML, quizs porque no conocen Java ono les interesa aprender su sntaxis. Aunque los JavaBeans pueden usarse paraencapsular mucho cdigo Java, usndolos en pginas JSP todava requieren que losdesarrolladores de contenido tengan algn conocimiento sobre su sntaxis.

    La tecnologa JSP nos permite introducir nuevas etiquetas personalizadas a travsde una librera de etiquetas. Como desarrollador Java, podemos ampliar las pginasJSP introduciendo etiquetas personalizadas que pueden ser desplegadas y usadas

    en una sntaxis al estilo HTML. Las etiquetas personalizadas tambin nos permitenproporcionar un mejor empaquetamiento, mejorando la separacin entre la lgicadel negocio y su representacin.

    Est pgina presenta una breve introduccin a las etiquetas personalizadas,presenta:

    Cmo desarrollar y desplegar etiquetas sencillas. Cmo desarrollar y desplegar etiquetas avanzadas: etiquetas parametrizadas y

    con cuerpo.

    Cmo describir etiquetas con el "Tag Library Descriptor" (TLD)Finalmente, se proporcionarn algunas guas para la programacin.

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    27/69

    Introduccin a las Etiquetas

    Si tenemos experiencia con HTML, ya conocemos algo sobre los tipos de etiquetasque se pueden usar. Bsicamente hay dos tipo de etiquetas, y mbos pueden teneratributos (informacin sobre cmo la etiqueta debera hacer su trabajo):

    Etiquetas sin cuerpo: Una etiqueta sin cuerpo es una etiqueta que tiene unaetiqueta de apertura pero no tiene su correspondiente etiqueta de cierre. Tiene la

    sntaxis:

    Las etiquetas sin cuerpo se usan para representar ciertas funciones, como lapresentacin de un campo de entrada o para mostrar una imagen. Aqutenemos un ejemplo de una etiqueta sin cuerpo en HTML:

    Etiquetas con cuerpo: Una etiqueta con cuerpo tiene una etiqueta de inicio yuna etiqueta de fin. Tiene la sntaxis:

    ...tag body...

    Las etiquetas con cuerpo se usan para realizar operaciones sobre elcontenido del cuerpo, como formatearlo. Aqu tenemos un ejemplo de una

    etiqueta con cuerpo en HTML:

    Custom Tags

    Etiquetas JSP Personalizadas

    Las etiquetas JSP personalizadas son simplemente clases Java que implementanunos interfaces especiales. Una vez que se han desarrollado y desplegado, susacciones pueden ser llamadas desde nuestro HTML usando sntaxis XML. Tienen unaetiqueta de apertura y otra de cierre. Y podran o no podran tener un cuerpo. Lasetiquetas sin cuerpo pueden expresarse como:

    Y una etiqueta con cuerpo, podra expresarse de esta forma:

    body

    De nuevo, ambos tipos podran tener atributos que sirven para personalizar elcomportamiento de la etiqueta. La siguiente etiqueta tiene un atributo llamadoname, que acepta un valor String obtenido valdiando la variable yourName:

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    28/69

    O podra escribirse como una etiqueta con cuerpo:

    Nota:

    Cualquier dato que sea un simple String, o pueda ser generado evaluando unaexpresin simple, debera ser pasado como un atributo y no como contenido delcuerpo.

    Beneficios de las Etiquetas Personalizadas

    Algo muy importante a observar sobre las etiquetas JSP personalizadas es que noofrecen ms funcionalidad que los scriptles, simplemente proporcionan un mejorempaquetamiento, ayudandonos a mejorar la separacin entre la lgica del negocioy su representacin. Algunos de sus beneficios son:

    Pueden reducir o eliminar los scriptlets en nuestras aplicaciones JSP. Cualquierparmetro necesario para la etiqueta puede pasarse como atributo o contenido

    del cuerpo, por lo tanto, no se necesita cdigo Java para inicializar o seleccionar

    propiedades de componentes.

    Tienen una sntaxis muy simple. Los scriptlets estn escritos en Java, pero lasetiquetas personalizadas pueden usar una sntaxis al estilo HTML.

    Pueden mejorar la productividad de los desarrolladores de contenido que no sonprogramadores, permitindoles realizar tareas que no pueden hacer con HTML.

    Son reutilizables. Ahorran tiempo de desarrollo y de prueba. Los Scritplets noson reusables, a menos que llamemos reutilizacin a "copiar-y-pegar".

    En breve, podemos usar etiquetas personalizadas para realizar tareas complejas dela misma forma que utilizamos HTML para crear una representacin.

    Definir una Etiqueta

    Una etiqueta es una clase Java que implementa un interface especializado. Se usapara encapsular la funcionalidad desde una pgina JSP. Como mencionamosanteriormente, una etiqueta puede o no tener cuerpo. Para definir una sencillaetiqueta sin cuerpo, nuestra clase debe implementar el interface Tag. El desarrollode etiquetas con cuerpo se discute ms adelante. El ejemplo 1 muestra el cdigo

    fuente del interface Tag que debemos implementar:

    Ejemplo 1: Tag.java

    public interface Tag {public final static int SKIP_BODY = 0;public final static int EVAL_BODY_INCLUDE = 1;public final static int SKIP_PAGE = 5;public final static int EVAL_PAGE = 6;

    void setPageContext(PageContext pageContext);void setParent(Tag parent);Tag getParent();int doStartTag() throws JspException;int doEndTag() throws JspException;void release();

    }

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    29/69

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    30/69

    public class HelloTag implements Tag {

    private PageContext pageContext;private Tag parent;

    public HelloTag() {super();

    }

    public int doStartTag() throws JspException {try {

    pageContext.getOut().print("This is my first tag!");

    } catch (IOException ioe) {throw new JspException("Error:IOException while writing to client"+ ioe.getMessage());

    }return SKIP_BODY;

    }

    public int doEndTag() throws JspException {return SKIP_PAGE;

    }

    public void release() {}

    public void setPageContext(PageContextpageContext) {

    this.pageContext = pageContext;}

    public void setParent(Tag parent) {this.parent = parent;

    }

    public Tag getParent() {return parent;

    }}

    Los dos mtodos importantes a observar en HelloTag son doStartTag y doEndTag.El primero es invocado cuando se encuentra la etiqueta de inicio. En este ejemplo,este mtodo devuelve SKIP_BODY porque es una simple etiqueta sin cuerpo. elmtodo doEndTag es invocado cuando se encuentra la etiqueta de cierre. En esteejemplo devuelve SKIP_PAGE porque no queremos evaluar el resto de la pgina, deotro modo debera devolver EVAL_PAGE.

    Para compilar la clase HelloTag, asumiendo que Tomcat est instalado enc:\tomcat:

    Creamos un nuevo subdirectorio llamando tags, que es el nombre del paqueteque contiene la clase HelloTag. Este debera crearse en:

    c:\tomcat\webapps\examples\web-inf\classes.

    Grabamos HelloTag.java en el subdirectorio tags. Lo compilamos con el comando: c:\tomcat\webapps\examples\web-inf\classes\tags> javac -classpath c:\tomcat\lib\servlet.jar HelloTag.java

    2. Crear el Descriptor de Librera de Etiquetas

    El siguiente paso es especificar cmo ejecutar la etiqueta el motor de ejecucinJSP . Esto puede hacerse crerando un "Tag Library Descriptor" (TLD), que es undocumento XML. El ejemplo 3 muestra un TLD de ejemplo:

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    31/69

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    32/69

    fichero: c:\tomcat\webapps\examples\web-inf\web.xmly aadimos las

    siguientes lneas antes de la ltima lnea, que es :6. 7. mytags8. /WEB-INF/jsp/9. mytaglib.tld10.

    Ahora, escribimos un JSP y usamos la primera sntaxis. Lo podremos ver en elejemplo 4:

    Ejemplo 4: Hello.jsp

    Hello Tag

    My first tag prints:

    El taglib se usa para decirle al motor de ejecucin JSP donde encontrar el descriptorpara nuestra etiqueta, y el prefix especifica cmo se referir a las etiquetas de estalibrera. Con esto correcto, el motor de ejecucin JSP reconocer cualquier uso denuestra etiqueta a lo largo del JSP, mientras que la precedamos con el prefijo firstcomo en .

    Alternativamente, podemos usar la segunda opcin de referencia creando unfichero JAR. O podemos usar la tercera opcin simplemente reemplazando laprimera lnea del ejemplo 4 con la siguiente lnea:

    Bsicamente, hemos usado el nombre mytags que se ha aadido a web.xml, parareferenciar a la librera de etiquetas. Para el resto de los ejemplos de esta pginautilizaremos este tipo de referencia.

    Ahora, si solicitamos Hello.jsp desde nuestro navegador, veramos algo similar lala figura 1:

    Figura 1: Primera Etiqueta Personalizada

    La etiqueta personalizada desarrollada en el ejemplo es una etiqueta sencilla, el

    objetivo era slo ofrecernos uno poco del sabor del esfuerzo que implica eldesarrollo de etiquetas personalizadas. Podramos haber observado que incluso est

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    33/69

    simple etiqueta requiere que implementemmos un gran nmero de mtodos,algunos de los cuales tienen implementaciones muy simples. Para minimizar elesfuerzo implicado, los diseadores de JSP proporcionaron una plantilla a utilizar enla implementacin de etiquetas sencillas. La plantilla es la clase abstractaTagSupport. Es una clase de conveniencia que proporciona implementaciones pordefecto para todos los mtodos del interface Tag.

    Por lo tanto, la forma ms fcil de escribir etiquetas sencillas es extender la claseTagSupport en vez de implementar el interface Tag. Podemos pensar en la claseabstracta TagSupport como en un adaptador. Habiendo dicho esto, la claseHelloTag del ejemplo 4 podra implementarse ms fcilmente como se ve en elejemplo 5.

    Ejemplo 5: Extender la clase TagSupport

    package tags;

    import java.io.*;import javax.servlet.jsp.*;

    import javax.servlet.jsp.tagext.*;

    public class HelloTag extends TagSupport {

    public int doStartTag() throws JspException {try {

    pageContext.getOut().print("This is myfirst tag!");

    } catch (IOException ioe) {throw new JspException("Error:IOException while writing

    to client" + ioe.getMessage());}return SKIP_BODY;

    }

    public int doEndTag() throws JspException {return SKIP_PAGE;

    }}

    Etiquetas Parametrizadas

    Hamos visto como desarrollar etiquetas sencillas. Ahora veamos cmo desarrollaretiquetas parametrizadas--etiquetas que tienen atributos. Hay dos nuevas cosasque necesitamos aadir al ejemplo anterior para manejar atributos:

    1. Aadir un mtodo set2. Aadir una nueva etiqueta a mytagslib.tld

    Aadir un mtodo set y cambiar el mensaje de salida resulta en el Ejemplo 5:

    Ejemplo 5: Una etiqueta con atributo

    package tags;

    import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;

    public class HelloTagParam extends TagSupport {private String name;

    public void setName(String name) {

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    34/69

    this.name = name;}

    public int doStartTag() throws JspException {try {

    pageContext.getOut().print("Welcome toJSP Tag Programming, " +name);

    } catch (IOException ioe) {throw new JspException("Error:IOExceptionwhile writing to client");

    }return SKIP_BODY;

    }

    public int doEndTag() throws JspException {return SKIP_PAGE;

    }}

    Lo siguiente que necesitamos hacer es aadir una nueva etiqueta a mytaglib.tld.La nueva etiqueta se muestra en el ejemplo 6. Este fragmento de cdigo debera

    aadirse a mytaglib.tldjusto antes de la lnea, :

    Ejemplo 6: revisin de mytaglib.tld

    helloparamtags.HelloTagParamemptyTag with Parameter

    namefalsefalse

    Hemos aadido una nueva etiqueta llamada helloparam. Observa la nueva etiqueta, que especifica que la etiqueta helloparam acepta un atributo cuyonombre es name. La etiqueta se selecciona a false, significando que elatributo es opcional; la etiqueta se selecciona a false especificandoque no se har evaluacin en el momento de la ejecucin.

    No necesitamos aadir nada al fichero descriptor de aplicacin web web.xml porqueestamos usando la misma librera de etiquetas: mytaglib.tld.

    Ahora, podemos probar la nueva etiqueta. El cdigo fuente del ejemplo 7 muestracmo probarla usando un atributo name de "JavaDuke".

    Ejemplo 7: HelloTagParam.jsp

    Hello Tag with Parameter

    My parameterized tag prints:

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    35/69

    Si solicitamos HelloTagParam.jsp desde un navegador web, veremos una salidasimilar a la de la Figura 2:

    Figura 2: Probando una etiqueta parametrizada.

    Libreras de Etiquetas

    Una librera de etiquetas es una coleccin de etiquetas personalizadas JSP. ElJakarta Taglibs Project proporciona varias lbreras de etiquetas tiles para analizar

    XML, transformaciones, email, bases de datos, y otros usos. Peuden descargarse yusarse muy fcilmente.

    Aqu desarrollamos nuestra librera de etiquetas. Como un ejemplo, desarrollamosuna sencila librera matemtica que proporciona dos etiquetas, una para sumar dosnmeros y la otra para restar un nmero de otro. Cada etiqueta est representadapor una clase. El cdigo fuente de las dos clases, Add.java y Subtract.java, semuestra en el ejemplo 8.

    Ejemplo 8: Add.java y Subtract.java

    package tags;

    import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;

    public class Add extends TagSupport {private int num1, num2;

    public void setNum1(int num1) {this.num1 = num1;

    }

    public void setNum2(int num2) {this.num2 = num2;

    }

    public int doStartTag() throws JspException {try {

    pageContext.getOut().print("Welcometo FirstGrade Math! ");pageContext.getOut().print("The sum of: " +num1 + " and " + num2 + " is: " + (num1+num2));

    } catch (IOException ioe) {throw new JspException("Error:IOExceptionwhile writing to client");

    }return SKIP_BODY;

    }}

    // Subtract.java

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    36/69

    package tags;

    import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;

    public class Subtract extends TagSupport {private int num1, num2;

    public void setNum1(int num1) {this.num1 = num1;

    }

    public void setNum2(int num2) {this.num2 = num2;

    }

    public int doStartTag() throws JspException {try {

    pageContext.getOut().print("Welcome to FirstGrade Math! ");pageContext.getOut().print("If yousubtract:

    " + num2 + " from " + num1 +", you get: "+ (num1 - num2));} catch (IOException ioe) {

    throw new JspException("Error:IOExceptionwhile writing to client");

    }return SKIP_BODY;

    }}

    El cdigo fuente es fcil de entender. Observa una cosa que hemos repetido enAdd.java y Subract.java es la llamada a pageContext.getOut.print. Una formamejor de hacer esto sera obtener un objeto JspWriter y luego usarlo para imprimirhacia el cliente:

    JspWriter out = pageContext.getOut();out.print("first line");out.print("second line");

    El siguiente paso es revisar el fichero descriptor de librera de etiquetas,mytaglib.tld, y aadimos las descripciones para las dos nuevas etiquetas. Elejemplo 9 muestra la descripcin de las nuevas etiquetas. Aadimos el siguientefragmento de XML a mytaglib.tld, justo antes de la ltima lnea.

    Ejemplo 9: revisar mytaglib.tld

    addtags.AddemptyTag with Parameter

    num1truefalse

    num2truefalse

    sub

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    37/69

    tags.SubtractemptyTag with Parameter

    num1truefalse

    num2truefalse

    Como podemos ver, cada etiqueta requiere dos atributos que deben llamarse num1y num2.

    Ahora podemos probar nuestra nueva librera de etiquetas matemticas usando elprobador mostrado en el ejemplo 10.

    Ejemplo 10: math.jsp

    Hello Tag with Parameter

    Calling first tag

    Calling second tag

    Si solicitamos math.jsp desde un navegador web, veramos una salida similar a lade la Figura 3:

    Figura 3: Probando la librera de etiquetas matemticas.

    Etiquetas con Cuerpo

    Un manejador de etiquetas para una etiqueta con cuerpo se implementa de formadiferente dependiendeo de si se necesita evaluar el cuerpo slo una vez o variasveces.

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    38/69

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    39/69

    Observa que cuando escribimos una etiqueta con cuerpo, el valor de la etiqueta debe ser JSP o jspcontent, como se explic anteriormente.

    En el ejemplo 12, podemos ver un probador para este ejemplo:

    Ejemplo 12: lowercase.jsp

    Body Tag

    Welcome to JSP Custom Tags Programming.

    Si solictamos lowercase.jsp desde un navegador web, veramos algo similar a lafigura 4:

    Figura 4: Probar la etiqueta lowercase

    Multiples Evaluaciones

    Ahora veamos un ejemplo de un cuerpo de etiqueta evaluado mtiples veces. Elejemplo acepta un string e imprime el string tantas veces como se indique en elJSP. El cdigo fuente se muestra en el ejemplo 13:

    Ejemplo 13: LoopTag.java

    package tags;

    import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;

    public class LoopTag extends BodyTagSupport {

    int times = 0;

    BodyContent bodyContent;

    public void setTimes(int times) {

    this.times = times;}

    public int doStartTag() throws JspException {if (times>0) {return EVAL_BODY_TAG;

    } else {

    return SKIP_BODY;}}

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    40/69

    public void setBodyContent(BodyContentbodyContent) {

    this.bodyContent = bodyContent;}

    public int doAfterBody() throws JspException {if (times >1) {times--;

    return EVAL_BODY_TAG;} else {

    return SKIP_BODY;}

    }

    public int doEndTag() throws JspException {try {

    if(bodyContent != null) {bodyContent.writeOut(bodyContent.getEnclosingWriter());

    }} catch(IOException e) {throw new JspException("Error: "+e.getMessage());

    }

    return EVAL_PAGE;}}

    En este ejemplo, los mtodos implementados juegan los siguientes papeles:

    El mtodo doStartTag obtiene la llamada al inicio de la etiqueta. Chequea si senecesita realizar el bucle.

    El mtodo setBodyContent es llamado por el contenedor JSP para chequear porms de un bucle.

    El mtodo doAfterBody es llamado despus de cada evaluacin; el nmero deveces que se necesite realizar el bucle es decrementado en uno, luego devuelve

    SKIP_BODY cuando el nmero de veces no es mayor que uno. El mtodo doEndTag es llamado al final de la etiqueta, y el contenido (si existe)

    se escribe en el writer encerrado.

    Similarmente a los ejemplos anteriores, el siguiente paso es aadir un nuevodescriptor de etiqueta a mytaglib.tld. Las siguientes lneas meustran lo quenecesitamos aadir:

    looptags.LoopTagJSP

    Tag with body and parameter

    timestruetrue

    Observa que la etiqueta especifica que las evaluaciones seejecutarn en tiempo de ejecucin.

    En el Ejemplo 14 podemos ver un JSP probador:

    Ejemplo 14: loops.jsp

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    41/69

    Body Tag

    Welcome to Custom Tags Programming.

    Finalmente, si solicitamos loops.jsp desde un navegador, veramos una salidasimilar a la de la Figura 5:

    Figura 5: Probando loops.jsp

    Guas de Programacin

    Aqu hay unas cuantas guas a tener en mente cuando desarrollemos libreras deetiquetas JSP:

    Mantenerla simple: si una etiqueta requiere muchos atributos, debemos intentardividirla en varias etiquetas.

    Hacerla utilizable: consultemos a los usuarios de las etiquetas (desarrolladoresHTML) para conseguir un alto grado de utilizabilidad.

    No inventemos un lenguaje de programacin en JSP: no desarrollemosetiquetas personalizadas que permitan a los usuarios escribir programas

    explcitos.

    Intentemos no re-inventar la rueda: ya existen varias libreras de etiquetas JSPa nuestra disposicin, como las del Jakarta Taglibs Project. Deberemos

    chequearlas para ver si ya existe alguna etiqueta que nos pueda servir y notengamos que re-inventar la rueda.

    Conclusin

    En la pgina anterior Parte III: JSP con XML en Mente, vimos como analizardocumentos XML. Pero incluso el ojo desentrenado habr observado que hemosembebido mucho cdigo de anlisis (o lgica) en JSP. Incluso aunque hemos usadoJavaBeans para encapsular mucho cdigo Java, todava hemos terminado pginasJSP mezclando la lgica de programacin con la presentacin.

    Las etiquetas personalizadas nos ayudan a mejorar la separacin de la lgica del

    programa (anlisis e iteraccin de la Parte II) de la presentacin. Los distintosejemplos mostrados en esta pgina muestran como desarrollar y desplegar

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    42/69

    etiquetas simples y avanzadas. Como ejercicio, podras querer reescribir losejemplos SAX y DOM de la Parte II como libreras de etiquetas. Tambin podrasechar un vistazo a lo que tiene que ofrecer el Jakarta Taglibs Project sobre anlisisde XML y transformaciones XSL. Tambin proporciona libreras de etiquetas paraotras cosas.

    Parte IV: Usar los Servicios de J2EE desde JSP

    Java 2 Enterprise Edition (J2EE) es un estndar que define un entorno para eldesarrollo y despliegue de aplicaciones empresariales. Reduce el coste y lacomplejidad del desarrollo de aplicaciones empresariales multi-capa y proporcionaun modelo de aplicacin distribuida multi-capa. En otras palabras, es enteramentedistribuido y por lo tanto, las distintas partes de una aplicacion se pueden ejecutaren diferentes dispositivos.

    Las aplicaciones Web desarrolladas usando JavaServer Pages (JSP) podran requeriralguna interaccin con servicios J2EE. Por ejemplo, un sistema de control de

    inventario basado en Web podra necesitar acceder a servicios de directorio de J2EEpara obtener el acceso a una base de datos. O podramos querer usar JavaBeansEnterprise (EJB) en nuestra aplicacin.

    Esta pgina presenta una breve introduccin a J2EE, y nos muestra cmo:

    Describir servicios J2EE en un Descriptor de Desarrollo Web (web.xml) Referenciar servicios J2EE Acceder o usar servicios J2EE desde JSPs

    Introduccin a J2EE

    J2EE es una plataforma estndar para desarrollar y desplegar aplicacionesempresariales. La arquitectura de J2EE, que est basada en componentes, hacemuy sencillo el desarrollo de este tipo de aplicaciones porque la lgica de negociosest organizada dentro de componentes reutilizables y el servicio subyacente loproporciona el J2EE en la forma de un contenedor por cada tipo de componente.Pensemos en un contenedor como un interface entre el componente y lafuncionalidad de bajo-nivel que soporta el componente. Por lo tanto, antes de poderejecutar un componente de una aplicacin cliente, debe configurarse como unservicio J2EE y desplegarse dentro de su contenedor.

    En la siguiene tabla se describen brevemente los servicios estndar incluidos en la

    versin 1.3 de la J2EE specification:

    Servicio Estndar Descripcin

    HTTP

    Define el servicio HTTP donde el API del lado del cliente estdefinido por el paquete java.net, y el API del lado del servidorest definido por el API Servlet (incluyendo JSP). HTTPS, o eluso de HTTP sobre "Secure Socket Layer" (SSL), estsoportado por los mismos APIs del cliente y del servidor queHTTP.

    EnterpriseJavaBeans (EJBs)

    Un modelo de componente para desarrollo empresarial enJava.

    Java Transaction API(JTA)

    Un interface para componentes de aplicaciones J2EE paramanejar transaciones.

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    43/69

    RMI-IIOP

    Define los APIs que permiten el uso de programacin al estiloRMI que es independiente del protocolo subyacente. Lasaplicaciones J2EE necesitan usar RMI-IIOP cuando acceden acomponentes EJB.

    Java IDLPermite a las aplicaciones J2EE invocar a objetos CORBA

    usnado el protocolo IIOP.JDBC API para acceder a bases de datos.

    Java MessageService (JMS)

    API para mensajera que soporta punto-a-punto y modelos depublicacin por subscripcin.

    Java Naming andDirectory Interface(JNDI)

    API para acceder a sistemas de nombres y directorios derecursos J2EE.

    JavaMail Un API estndar para enviar email.

    JavaBeansActivation

    Framework (JAF)

    Un API estndar usado por JavaMail.

    Java API for XMLParsing (JAXP)

    Un API estndar para analizar documentos XML. Incluyesoporte para SAX y DOM.

    J2EE ConnectorArchitecture

    Un API estndar para permitir la conectividad de sistemaslegales y aplicaciones empresariales no-Java.

    Java Authenticationand AuthorizationService (JAAS)

    Un API estndar para permtiir que los servicios J2EEautentifiquen y fuercen el control de acceso sobre losusuarios.

    J2EE promueve el desarrollo de aplicaciones multi-capa en las que el contenedorweb almacena componentes web que estn dedicados a menejar la lgica de

    presentacin de una aplicacin dada, y responden a las peticiones del cliente (comoun navegador web). Por otro lado, el contenedor EJB, almacena componentes deaplicacin que responden a las peticiones de la capa web como se muestra en lafigura 1:

    Figura 1: Aplicaciones Multi-capa

    Las aplicaciones que usan esta arquitectura son escalables implcitamente. Estaarquitectura separa el acceso a los datos de las interacciones con el usuario final, yse asegura la reutilizacin del cdigo basado en componentes. En la capa web, J2EEpromueve el uso de JSPs para la creaccin de contenido dinmico para los clientesweb.

    Etiquetas Personalizadas y J2EE

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    44/69

    J2EE tiene mucho que ofrecer a los desarrolladores de aplicaciones web y a losdesarrolladores de etiquetas JSP personalizadas. Como hemos podido ver de latabla anterior, tiene un rico conjunto de APIs estndars para enviar email, accedera bases de datos, analizar documentos XML, etc. Nuestras aplicaciones Web puedenbeneficiarse de etos APIs. Por ejemplo, podemos escribir una etiqueta JSPpersonalizada que enve email que puede ser facilmente utilizada por

    desarrolladores de contenido web que no estn familiarizados con Java. Si no estsfamiliarizado con las etiquetas JSP personalizadas, sus beneficios y cmo crerarlas,puedes volver a la pgina anterior Desarrollar Etiquetas JSP Personalizadas.

    EJBs

    Un EJB es un componente del lado del servidor que encapsula la lgica del negociode una aplicacin. En cualquier aplicacin, los beans enterprise implementan losmtodos de la lgica del negocio, que pueden ser invocados por clientes remotospara acceder a los servicios importantes proporcionados por la aplicacin.

    Beneficios

    Los EJBs simplifican el desarrollo de grandes aplicaciones empresariales seguras ydistribuidas por las siguientes razones:

    Los desarrolladores pueden concentrarse en solventar la lgica del negocio:el contenedor EJB proporciona servicos a nivel del sistema como el control de

    transaciones y las autorizaciones de seguridad. Por lo tanto, los desarrolladores

    no tienen que preocuparse de estos problemas.

    Clientes pequeos: Los desarrolladores no tienen que desarrollar cdigo paralas reglas de negocio o accesos a bases de datos; pueden concentrarse en la

    presentacin del cliente. El resultado final es que los clientes son pequeos, yesto es especialmente importante para clientes que se ejecutan en pequeos

    dispositivos con recustos limitados.

    Desarrollo rpido: Los EJBs son componentes portables, y por lo tanto losensambladores de aplicaciones pueden construir nuevas aplicaciones desde

    beans existentes. Las aplicaciones resultantes se pueden ejecutar en cualquier

    servidor compatible J2EE.

    Componentes

    Hay dos tipos principales de componentes EJB : session y entity. Un EJB de sesin

    se usa para realizar una tarea para un cliente, y un EJB de entidad es especfico deldominio y se usa para representar un objeto de entidad del negocio que existe enun almacenamiento persistente. Sin embargo, los beans de entidad y de sesintienen algunas diferencias que podemos ver en la siguiente tabla:

    EJB de Sesin EJB de Entidad

    Transitorio Persistente

    Puede ser usado por un slo cliente. Puede ser usadopor muchos clientes.

    No tiene identidad Tiene una identidad (como una clave primaria)

    Desarrollar EJBs

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    45/69

    Para desarrollar EJBs, todo bean enterprise necesita:

    Un interface remoto que exponga los mtodos que soporta bean enterprise. Un interface home que proporciona los mtodos del ciclo de vida del bean

    enterprise.

    Una clase de implementacin, incluyendo la lgica de negocio que necesite.EJBs contra Servlets

    A primera vista, los EJBs y los Servlets son tecnologas similares porque ambos soncomponentes distribuidos del lado del servidor. Sin embargo, hay una diferenciaimportante entre los dos en el tipo de solucin que ofrecen; los EJBs no puedenaceptar peticiones HTTP. En otras palabras, los EJBs no peuden servir peticionesque vienen directamente desde un navegador Web, y los servlets si pueden.Servlets y JSPs se pueden usar para implementar presentacin y control web, peroal contrario que los EJBs, no pueden manejar transaciones distribuidas. Los EJBspueden ser llamados desde cualquier cliente basado en Java.

    Cando usar EJBs?

    Los EJBs son buenos para las aplicaciones que tienen alguno de estosrequerimientos:

    Escalabilidad: si tenemos un nmero creciente de usuarios, los EJBs nospermitirn distribuir los componentes de nuestra aplicacin entre varias

    mquinas con su localizacin transparente para los usuarios.

    Integridad de Datos: los EJBs nos facilitan el uso de transaciones distribuidas. Variedad de clientes: si nuestra aplicacin va a ser accedida por una variedad

    de clientes (como navegadores tradicionales o navegadores WAP), se pueden

    usar los EJBs para almacenar el modelo del negocio, y se puede usar una

    variedad de clientes para acceder a la misma informacin.

    Describir y Referenciar Servicios J2EE

    Ahora que hemos visto una introduccin a J2EE y los EJBs, veremos cmoreferenciar, acceder y usar dichos servicios. Afortunadamente, la especificacinJ2EE define una forma estndard para y usar sus sevicios. Los servicos J2EEpueden ser referenciados buscndolos de acuerdo a un nombre nico en undirectorio. Esta funcionalidad est soportada por el "Java Naming and Directory

    Interface" o JNDI. Para que esto funcione, cada sistema compatible J2EEproporciona un servicio JNDI llamado un environment (entorno) que contiene:

    Variables de entorno Referencias a EJBs Referencias a Factoras de Recursos

    Variables de Entorno

    El entorno de nombrado de los componentes de la aplicacin permite que estoscomponentes sean personalizados sin tener que acceder o modificar el cdigo

    fuente de dichos componentes. Cada componente de la aplicacin define su propioconjunto de entrada de entorno. Todos los ejemplares de un componente de la

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    46/69

    aplicacin dentro del mismo contenedor comparten las mismas entradas. Esimportante observar que no est permitido que los ejemplares de los componentesde la aplicacin modifiquen su entorno durante la ejecucin.

    Declarar Variables de Entorno

    El proveedor de componentes de la aplicacin debe declarar todas las entradas deentorno accedidas desde el cdigo del componente de la aplicacin. Se declaranusando la etiqueta en el descriptor de despliegue (web.xml enTomcat por ejemplo ). Los elementos de la etiqueta son:

    : una descripcin opcional de la entrada de entorno. : el nombre de la entrada de entorno. : el tipo de variable de entorno esperada. Puede ser uno de los

    siguientes tipos Java: Boolean, Byte, Double, Character, Float, Integer, Long,

    Short, String.

    : un valor para la entrada de entorno que debe correspondercon el tipo suministrado dentro de . Este valor puedemodificarse posteriormente, pero si no se seecciona deber especificarse durante

    el despliegue.

    El cdigo del ejemplo 1 muestra una decalracin de dos entradas de entorno. Paraespecificar una declaracin de un nuevo entorno, simplemente los aadimos anuestro descriptor de apliacin Web (web.xml).

    Ejemplo 1: Declarar variables de entorno

    welcome message

    greetingsjava.lang.StringWelcome to the Inventory Control

    System

    maximum number of productsinventory/maxjava.lang.Integer27

    Cada etiqueta describe una sla entrada de entorno. Por eso, en esteejemplo, se han definido dos variables de entorno, la primera es una llamada

    greetings, que es del tipo String y tiene un valor inicial por defecto de: Welcome tothe Inventory Control System. La segunda entrada se llama inventory/max, y esdel tipo Integer y tiene un valor inicial por defecto de 27.

    Ahora, un ejemplar de componente de aplicacin puede localizar la entrada deentorno usando JNDI. Crea un objeto javax.naming.InitialContext usando elconstructor sin argumentos. Busca el entorno de nombrado a travs delInitialContext usando el URL JNDI que empieza con java:comp/env. El ejemplo 2muestra cmo un componente de aplicacin accede a sus entradas de entorno:

    Ejemplo 2: Acceder a entradas de entorno

    // obtain the application component's environment// naming contextjavax.naming.Context ctx = new javax.naming.InitialContext();

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    47/69

    javax.naming.Context env = ctx.lookup("java:comp/env");

    // obtain the greetings message//configured by the deployerString str = (String) env.lookup("greetings");

    // use the greetings messageSystem.out.println(greetings);

    // obtain the maximum number of products//configured by the deployerInteger maximum = (Integer) env.lookup("inventory/max");//use the entry to customize business logic

    Observamos que el componente de la aplicacin tambin podra usar las entradasde entorno usando los nombres de paths completos, de esta forma:

    javax.naming.Context ctx = new javax.naming.InitialContext();String str = (String) ctx.lookup("java:comp/env/greetings");

    Este fragmento de cdigo se puede usar en un JSP como se v en el Ejemplo 3:

    ejemplo 3: Acceder a entradas de etorno desde un JSP

    JSP ExampleInventory System

    Sin embargo, por ltimo podras querer acceder a entradas de entorno desde unaetiqueta personalizada. Para eso, desarrollaramos una etiqueta personalizada ouna librera de etiquetas que pudiera ser reutilizada sin tener que cortar y pegar elcdigo. Una librera personalizada puede ser fcilmente desarrollada siguiendo lospasos descritos en la pgina anterior Desarrollar Etiquetas JSP Personalizadas.

    Referencias EJB

    Un proveedor de componentes de aplicacin puede referirse a los interfaces homeEJB usando nombres lgicos (llamados referencias EJB) en lugar de valores deregistro JNDI. Estas son referencias espciales en el entorno de nombrado de loscomponentes de la aplicacin. Estas referencias permiten a las aplicaciones Webacceder a los EJBs de una forma personalizada.

    Declarar Referencias EJB

    Una referencia EJB es una entrada en el entorno del componente de la aplicacin.Sin embargo, no se debe usar para declararla. En su lugar, debemosdeclararla usando la etiqueta del descriptor de despliegue web. Los

    elementos de la etiqueta son:

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    48/69

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    49/69

    conexiones JMS, conexiones de email, etc. Las URLs JNDI empiezan con:java:comp/env/jdbc, java:comp/env/jms, y java:comp/env/mail, respectivamente.

    Declarar Referencias de Factoras de Recursos

    Una referencia a una factora de recursos es una entrada en el descritor dedespliegue de una aplicacin web. Debe declararse usando la etiqueta . Los elementos de esta etiqueta son:

    : un descriptor opcional de la referencia a la factora de recursos. : contiene el nombre de la entrada de entorno. : especifica la factora de recursos utilizada. Algunas factoras de

    recursos estndars de J2EE son: javax.sql.DataSource para factoras de

    conexiones JDBC; javax.jms.QueueConnectionFactory y

    javax.jms.TopicConnectionFactory para conexiones JMS; y javax.mail.Session

    para factoras de conexiones JavaMail.

    : especifica el tipo de autentificacin de recursos y cmo se deberarealizar. Por ejemplo, si se selecciona a Container, el contenedor hace la

    autentificacin usando propiedades configuradas durante el despliegue. Por otro

    lado, si se selecciona a Application, instruye al contenedor para permitir que la

    aplicacin autentifique programticamente.

    El ejemplo 6 muestra una declaracin de una referencia de factora de recursosemail. Para especificar una declaracin para una nueva entrada, simplemente laaadimos a nuestro descriptor de aplicacin web (web.xml).

    Ejemplo 6: Declarar una Referencia de Factora de Recursos

    email session reference

    factorymail/mailsessionjavax.mail.SessionContainer

    Cada elemento describe una sla entrada de referencia a una factora derecursos. Por lo tanto, en este ejemplo se ha definido una entrada con el nombremail/session del tipo javax.mail.Session seleccionando al Container.

    Ahora, un ejemplar de componente de aplicacin puede obtener la entrada dereferencia a la factora de recursos usando JNDI. Como con las otras entradas, creaun objeto javax.naming.InitialContext usando el constructor sin argumentos. Luegobusca el entorno de nombrado a travs del InitialContext usando el URL JNDI paraemail que empieza con java:comp/env/mail. El ejemplo 7 muestra cmo uncomponente de aplicacin obtiene una referencia a una factora de recursos paraenvar un mensaje de email:

    Ejemplo 7: Obtener una Referencia a una factoria de recursos y enviar un email.

    // obtain the initial JNDI contextjavax.naming.Context ctx =new javax.naming.InitialContext();// perform JNDI lookup to retrieve//the session instance

    javax.mail.Session session =(javax.mail.Session)

    ctx.lookup(

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    50/69

    "java:comp/env/mail/mailsession");// create a new message and set the sender,// receiver, subject, and content of msgjavax.mail.Message msg = new

    javax.mail.internet.MimeMessage(session);msg.setFrom("email address goes here");msg.setRecipient(Message.RecipientType.TO, "to email address");

    msg.setSubject("JavaMail Example");msg.setContext("write the content here", "text/plain");// send messagejavax.mail.Transport.send(msg);

    De nuevo, este cdigo puede usarse directamente en nuestros JSPs, o podemosdesarrollar una librera de etiquetas personalizada para acceder y utilizar variasreferencias a factoras de recursos.

    Como otro ejemplo, el ejemplo 8 muestra una declaracin de una factora derecursos de base de datos:

    Ejemplo 8: Declarar una Factora de recursos para bases de datos

    database referencefactoryjdbc/EmployeeDBjavax.sql.DataSourceContainer

    El ejemplo 9 muestra cmo un componente de aplicacin obtiene una referencia auna factora de conexiones a bases de datos y la usa:

    Ejemplo 9: Obtener una referencia a una factora de conexiones de bases de datosy utilizarla

    // obtain the initial JNDI contextjavax.naming.Context ctx =new javax.naming.InitialContext();// perform JDNI lookup to//obtain database connection factoryjavax.sql.DataSource ds =(javax.sql.DataSource)

    ctx.lookup("java:comp/env/jdbc/EmployeeDB");// Invoke factory to obtain a resourcejavax.sql.Connectin conn = ds.getConnection();// use the connection....

    Conclusin

    J2EE ofrece muchos servicios que son importantes para las aplicaciones web. Estosservicios van desde la apertura de conexiones a bases de datos usando JDBC, hastaenvar email, pasando por acceder y usar beans enterprise. Esta pgina junto conlos programas de ejemplo, nos ha mostrado cmo acceder a los servicios J2EEdesde dentro de JSPs. La incorporacin de EBJs dentro de nuestros JSPs puedehacerse fcilmente, creando una solucin reutilizable mendiante el desarrollo deetiquetas personalizadas.

    Por qu no accedemos a los servicios J2EE desde Servlets? Aunque es posiblehacerlo, terminaramos escribiendo mucho cdigo no reutilizable. Si deseamos usar

    servicios J2EE desde JSPs, desarrollar libreras de etiquetas personalizadas

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    51/69

    proporciona una solucin reutilizable que incluso puede ser usada pordesarrolladores de contenido que no tienen experiencia con Java.

    Parte V: Crear una Aplicacin Web de E-Mail usando Libreras

    de Etiquetas JSP

    Introduccin

    El API JavaMail es un extensin estndar de Java. Proporciona una mtodoestrictamente independiente del protocolo de enviar y recibir emails. Laarquitectura de capas de JavaMail permite el uso de varios protocolos de acceso amensajes, como POP3 e IMAP, y protocolos de transferencia de mensajes comoSMTP. JavaMail Interacta con el contenido de los mensajes a travs del"JavaBeans Activation Framework" (JAF). JAF proporciona una forma uniforme dedeterminar el tipo de mensaje y su encapsularlo. Para ms informacin puedes verJavaBeans Activation Framework, en la site de Sun

    Las "JavaServer Pages" (JSP) permiten a los desarrolladores crear pginasdinmicas ricas en contenido rpida y fcilmente. JSP utiliza etiquetas al estilo deXML para encapsular la lgica que genera el contenido web. Las pginas JSPseparan la lgica de la pgina de su diseo y estructura, lo que evita elsolapamiento de roles entre los diseadores web y los programadores. Losdiseadores disean las pginas web y los programadores les aaden la lgica y elcdigo. Para ms informacin puedes ver Servlets y JSP

    Este artculo explora las posibilidades de combinar estas dos tecnologas y crearuna aplicacin email desplegable en la web que use el API JavaMail y libreras deetiquetas JSP para su presentacin. Las pginas JSP estn pensadas para

    proporcionar un "mtodo declarativo y cntrico de presentacin del desarrollo deservlets". Un pgina JSP ideal no contiene ninguna lnea de cdigo o scriptles. En sulugar la funcionalidad y la lgica del negocio se ejecutan en etiquetas que o estndefinidas en el API o en libreras de etiquetas personalizadas. La aplicacin "EmailWeb Application" (EWA) presentada en este artculo usa una librera de etiquetaspersonalizadas. Las etiquetas estn implementadas usando el API JavaMail.

    Especificacin Funcional

    EWA soporta las funcionalidades bsicas de una aplicacin email. como chequeo delogin y envo de email. Ms especficamente, se soportan las siguientesfuncionalidades:

    Login en un servidor IMAP Listar todos los mensajes en la carpeta INBOX Ver los mensajes seleccionados Recuperar y ver los attachments de los mensajes seleccionados Componer y enviar mensajes

    Arquitectura de la Aplicacin

    EWA es una aplicacin web de tres capas. Reside en un servidor de aplicacionesweb que interacta con el servidor correo IMAP. Los clientes son pginas webgeneradas por pginas JSP desarrolladas en un entorno JSP/Servlet.

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    52/69

    EWA utiliza una patrn de diseo derivado de "Model-View-Controller" (MVC). En elparadigma MVC, la entrada del usuario, el modelado del mundo exterior y larealimentacin visual al usuario son explcitamente separados y manejados por trestipos de objetos, cada uno especializado en su propia tarea.

    La vista trabaja la salida grfica y/o textual de la porcin de pantalla mapeada queest asignada a esta aplicacin. El controlador interpreta las entradas del usuario atravs del ratn y del teclado, ordenando al modelo y/o la vista que se modifiquende la forma apriada. Finalmente, el modelo maneja el comportamiento y los datosde la aplicacin dominante, responde a las peticiones de informacin sobre suestado (normalmente desde la vista), y responde a las instrucciones de cambio deestado (normalmente desde el controlador).

    En esta aplicacin, el modelo consiste en el mensaje IMAP almacenado en elMailUserBean, la librera de etiquetas y el AttachmentServlet, que accede/maneja elalmacenamiento del mensaje. La vista consta de componentes HTML y JSP queproporcionan el interface de usuario. El controlador es el FilterServlet, que valida elestado del login del usuario.

    El Modelo

    MailUserBean

    Este es el JavaBean que almacena la informacin de email del usuario, como elhostname, el username, la password, la session y el protocol. Tiene mtodospara obtener y almacenar estos parmetros. Para propsitos de esta demostracinel protocolo ha sido codificado para ser IMAP. Este bean implementa los mtodoslogin y logout del usuario. Usa los objetos Session y Store de mail para almacenarla combinacin de hostname, username y password

    import java.util.*;import javax.mail.*;

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    53/69

    /*** This JavaBean is used to store mail user information.*/

    public class MailUserBean {private Folder folder;private String hostname;private String username;private String password;

    private Session session;private Store store;private URLName url;private String protocol = "imap";private String mbox = "INBOX";

    public MailUserBean(){}

    /*** Returns the javax.mail.Folder object.*/public Folder getFolder() {

    return folder;}

    /**

    * Returns the number of messages in the folder.*/public int getMessageCount() throws MessagingException {

    return folder.getMessageCount();}

    /*** hostname getter method.*/public String getHostname() {

    return hostname;}

    /*** hostname setter method.*/public void setHostname(String hostname) {

    this.hostname = hostname;}

    /*** username getter method.*/public String getUsername() {

    return username;}

    /*** username setter method.*/public void setUsername(String username) {

    this.username = username;}

    /*** password getter method.*/public String getPassword() {

    return password;}

    /*** password setter method.*/public void setPassword(String password) {

    this.password = password;}

    /*** session getter method.*/public Session getSession() {

    return session;

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    54/69

    }

    /*** session setter method.*/public void setSession(Session s) {

    this.session = session;}

    /*** store getter method.*/public Store getStore() {

    return store;}

    /*** store setter method.*/public void setStore(Store store) {

    this.store = store;}

    /**

    * url getter method.*/public URLName getUrl() {

    return url;}

    /*** Method for checking if the user is logged in.*/public boolean isLoggedIn() {

    return store.isConnected();}

    /*** Method used to login to the mail host.*/public void login() throws Exception {

    url = new URLName(protocol, getHostname(), -1, mbox,getUsername(), getPassword());

    Properties props = System.getProperties();session = Session.getInstance(props, null);store = session.getStore(url);store.connect();folder = session.getFolder(url);

    folder.open(Folder.READ_WRITE);}

    /*** Method used to login to the mail host.*/public void login(String hostname, String username, String password)

    throws Exception {

    this.hostname = hostname;this.username = username;this.password = password;

    login();}

    /*** Method used to logout from the mail host.*/public void logout() throws MessagingException {

    folder.close(false);store.close();store = null;session = null;

    }}

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    55/69

    Librera de Etiquetas

    La librera de etiquetas contiene las siguientes etiquetas personalizadas:

    message: usada para leer un mensaje, clases controladoras: MessageTag.java,MessageTEI.java

    listmessages: usada para iterar a travs de la lista de mensajes, clasescontroladoras: ListMessagesTag.java, ListMessagesTEI.java

    sendmail: usada para enviar mensajes, clase controladora: SendTag.javaEl fichero descriptor de etiquetas define el nombre de la etiqueta, su clase(o clases)controladoras, atributos, contenidos del cuerpo, etc. Por ejemplo, este fichero"taglig.tld" define todas las etiquetas de esta aplicacin:

    1.01.1javamailhttp://java.sun.com/products/javamail/demo/webapplistattachmentsListAttachmentsTagListAttachmentsTEIJSP

    A listattachments tagid

    truetrue

    messageinfotruetrue

    listmessagesListMessagesTagListMessagesTEIJSP

    A listmessages tagidtruetrue

    folderfalsetrue

    sessionfalsetrue

    messageMessageTag

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    56/69

    MessageTEIempty

    A message tagidtrue

    truefolderfalsetrue

    sessionfalsetrue

    numtruetrue

    sendmailSendTagJSP

    An sendmail taghostfalsetrue

    portfalse

    truerecipientstruetrue

    sendertruetrue

    subjectfalsetrue

    Cada una de las etiquetas tiene su propia clase controladora que implementa lasacciones de la etiqueta. Por ejemplo, la etiqueta listmessages est implementadaen ListMessagesTag.java:

    import java.io.*;import java.util.*;import javax.mail.*;import javax.mail.internet.*;

    import javax.mail.search.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    57/69

    /*** Custom tag for listing messages. The scripting variable is only* within the body of the tag.*/

    public class ListMessagesTag extends BodyTagSupport {private String folder;private String session;

    private int msgNum = 0;private int messageCount = 0;private Message message;private Message[] messages;private MessageInfo messageinfo;

    /*** folder attribute getter method.*/public String getFolder() {

    return folder;}

    /*** session attribute getter method.*/

    public String getSession() {return session;}

    /*** folder setter method.*/public void setFolder(String folder) {

    this.folder = folder;}

    /*** session attribute setter method.*/public void setSession(String session) {

    this.session = session;}

    /*** Method for processing the start of the tag.*/public int doStartTag() throws JspException {

    messageinfo = new MessageInfo();

    try {Folder folder = (Folder)pageContext.getAttribute(

    getFolder(), PageContext.SESSION_SCOPE);FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.DELETED), false);messages = folder.search(ft);messageCount = messages.length;

    } catch (Exception ex) {throw new JspException(ex.getMessage());

    }

    if (messageCount > 0) {getMessage();return BodyTag.EVAL_BODY_TAG;

    } elsereturn BodyTag.SKIP_BODY;

    }

    /*** Method for processing the body content of the tag.*/public int doAfterBody() throws JspException {

    BodyContent body = getBodyContent();try {

    body.writeOut(getPreviousOut());} catch (IOException e) {

    throw new JspTagException("IterationTag: " + e.getMessage());}

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    58/69

    // clear up so the next time the body content is emptybody.clearBody();

    if (msgNum < messageCount) {getMessage();return BodyTag.EVAL_BODY_TAG;

    } else {return BodyTag.SKIP_BODY;

    }}

    /*** Helper method for retrieving messages.*/private void getMessage() throws JspException {

    message = messages[msgNum++];messageinfo.setMessage(message);pageContext.setAttribute(getId(), messageinfo);

    }}

    Las clases TEI son clases "Tag Extra Info" que proporcionan informacin sobre las

    variables de scripting que se crean/modifican en tiempo de ejecucin. Sonnecesarias para etiquetas que definen variables de scripting. Esta informacin seusa durante la fase de traducin de JSP. Aqu tenemos la clase TEI de la etiquetaListMessages

    import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;

    /*** Extra information class to support the scripting variable created by the* ListMessagesTag class. The scope of the variable is limited to the body* of the tag.*/

    public class ListMessagesTEI extends TagExtraInfo {

    public ListMessagesTEI() {super();

    }

    public VariableInfo[] getVariableInfo(TagData data) {VariableInfo info = new VariableInfo(data.getId(),"MessageInfo",

    true, VariableInfo.NESTED);VariableInfo[] varInfo = { info };return varInfo;

    }}

    AttachmentServlet

    AttachmentServlet obtiene un stream de una parte dada de un mensaje multipartey lo enva hacia el navegador con el tipo de contenido apropiado. Este servlet seusa para mostrar attachments y se relaciona con las capacidades de manejar tiposde contenidos que tiene el navegador.

    import java.io.*;import javax.mail.*;import javax.mail.internet.*;import javax.servlet.*;import javax.servlet.http.*;

    /*** This servlet gets the input stream for a given msg part and* pushes it out to the browser with the correct content type.* Used to display attachments and relies on the browser's

  • 8/6/2019 (espaol) manual programacion java jsp y xml

    59/69

    * content handling capabilities.*/

    public class AttachmentServlet extend