�Que sucedi� la �ltima vez que usamos una aplicaci�n JSP e introdujimos algo incorrectamente? Si la aplicaci�n estaba bien escrita, probablemente lanzar�a una excepci�n y mostrar�a una p�gina de error. Las excepciones que ocurren durante la ejecuci�n de una aplicaci�n JSP se llaman excepciones en tiempo de ejecuci�n y se describen en este tutorial.
Al igual que en una aplicaci�n Java, una excepci�n es un objeto que es un ejemplar de java.lang.Throwable o de una de sus subclases. Throwable tiene dos subclases est�ndards -java.lang.Exception, que describe excepciones, y java.lang.Error, que describe errores.
Los errores son diferentes de las excepciones. Los errores normalmente indican problemas de enlaces o de la m�quina virtual de los que nuestra aplicaci�n Web podr�a no recuperarse, como errores de memoria. Sin embargo, las excepciones son condiciones que pueden capturarse y recuperarse de ellas. Estas excepciones podr�an ser, por ejemplo, un NullPointerException o un ClassCastException, que nos dicen que se ha pasado un valor nulo o un dato del tipo err�neo a nuestra aplicaci�n mientras se estaba ejecutando.
Las excepciones en tiempo de ejecuci�n son f�ciles de menejar en una aplicaci�n JSP, porque estan almacenadas una cada vez en el objeto impl�cito llamado exception. Podemos usar el objeto exception en un tipo especial de p�gina JSP llamado p�gina de error, donde mostramos el nombre de la clase exception, su seguimiento de pila, y un mensaje informativo para el usuario.
Las excepciones en tiempo de ejecuci�n son lanzadas por el fichero JSP compilado, el fichero class Java que contiene la versi�n traducida de nuestra p�gina JSP. Esto significa que nuestra aplicaci�n ha sido compilada y traducida correctamente. (Las excepciones que ocurren mientras un fichero est� siendo compilado o traducido no son almacenadas en el objetoexception y tienen sus mensajes mostrados en la ventana de comandos, en vez de en la p�gina de error. Estas no son el tipo de excepciones descritas en este tutorial.)
Este tutorial describe c�mo crear una sencilla aplicaci�n JSP con varias p�ginas, un componente JavaBean y una p�gina de error que ofrece mensajes informativos al usuario. En este ejemplo, el Bean sigue la pista sobre la p�gina en la que estaba trabajando el usuario cuando se lanz� la excepci�n, que nos da a nosotros, el desarrollador, informaci�n �til para que podamos mostrar un mensaje informativo. Este es un simple mecanismo de seguimiento de error.
��C�mo A�adir P�ginas de Error?
Aunque las llamemos p�ginas de error, las p�ginas especializadas JSP que describimos aqu� realmente muestran informaci�n sobre excepciones. Para a�adir p�ginas de error que muestren informaci�n de excepciones a una aplicaci�n web, seguimos estos pasos:
- Escribimos nuestro Bean (o bean enterprise, servlet, u otro componente) para que lance ciertas excepcioens bajo ciertas condiciones.
- Usamos un sencillo mecanismo de seguimiento en nuestro componente para ayudarnos a obtener informaci�n sobre lo que estaba haciendo el usuario cuando la excepci�n fue lanzada. (Si nos movemos en el desarrollo de aplicaciones J2EE, nuestra aplicaci�n podr� grabar el estado, que es la mejor forma de proporcionar informaci�n).
- El fichero JSP usa una directiva page con errorPage que selecciona el nombre de un fichero JSP que mostrar� un mensaje al usuario cuando ocurre una excepci�n.
- Escribir un fichero de p�gina de error, usando una directiva page con isErrorPage="true".
- En el fichero de la p�gina de error, usa el objeto exception para obtener informaci�n sobre la excepci�n.
- Usamos mensajes informativos, en nuestra p�gina de error o incluida desde otros ficheros, para darle al usuario un mensaje relevantemente informativo sobre lo que el usuario estaba haciendo cuando se lanz� la excepci�n.
�Ejemplo de Buscador de Direcciones de Email
Este ejemplo, llamado email, almacena nombres y direcciones de e-amil en un fichero map basado en la clase java.util.TreeMap definida en el JDK 1.2. La clase TreeMap crea una estructura de datos llamada "red-black tree". En el �rbol, los datos son almacenados con una clave y un valor. En este ejemplo, el nombre es la clave y la direcci�n email el valor.
Cuando a�adimos una entrada al fichero map, introducimos tanto un nombre (la clave) como una direcci�n email (el valor). Podemos buscar o borrar una direcci�n email introduciendo s�lo un nombre. El nombre no puede se null porque es una clave. Si un usuario intenta introducir un nombre null, la aplicaci�n lanza una excepci�n y muestra una p�gina de error.
��Entonces que es un Red-Black Tree?
Para aquellos que seamos curiosos sobre algoritmos, un �rbol rojo-negro es un arbol binario extendido que se parece a algo similar a esto (conceptualmente, al menos):
Si estas viendo este documento en la pantalla, veras que algunos nodos son rojos y otros on negros.
El �rbol rojo-negro tiene nodos que pueden ser ramas u hojas. Los nodos hojas son los nodos que hay al final de una l�nea, mientras que los nodos ramas son los nodos m�s grandes que conectan con dos o m�s l�neas. Los nodos se almacenan en una estructura compensada en el �rbol, usando las siguientes condiciones:
- Cada nodo tiene dos hijos o es una hoja.
- Cada nodo est� coloreado en rojo en negro.
- Cada nodo hoja est� coloreado en negro.
- Si un nodo es rojo, sus dos hijos son negros.
- Cada camino desde el ra�z hasta una hoja contiene el mismo n�mero de nodos negros.
La ventaja de un �rbol, para nosotros, los desarrolladores Web, es que podemos crear un fichero map que almacena datos en orden ascendente (ordenados por claves) y que tiene tiempos de b�squeda r�pidos.
��C�mo est� Estructurado el Ejemplo?
El ejemplo email tiene tres p�ginas con formularios HTML, dos ficheros de respuesta, una p�gina de error, y un componente JavaBean. Podemos visualizar la estructura de ficheros en algo como esto:
- Map.java es un componente JavaBeans que crea el fichero map.
- email.jsp es una p�gina JSP que muestra un formulario donde el usuario introduce un nombre y una direcci�n email.
- lookup.jsp es una p�gina JSP que permite al usuario buscar una direcci�n email que corresponda con un nombre.
- lookupresponse.jsp est� incluido en lookup.jsp y muestra la entrada que el usuario quiere buscar.
- delete.jsp es una p�gina JSP que permite al usuario borrar una direcci�n email que corresponde con un nombre.
- deleteresponse.jsp est� incluido en delete.jsp y muestra la entrada que fue borrada del fichero map.
- error.jsp es una p�gina de error que muestra informaci�n sobre manejo de excepciones que ocurren durante la adicci�n, b�squeda o borrado de entradas en el fichero map.
�A�adir un Nombre y una Direcci�n Email (email.jsp)
<%@ include file="copyright.html" %> <%@ page isThreadSafe="false" import="java.util.*, email.Map" errorPage="error.jsp" %> <jsp:useBean id="mymap" scope="session" class="email.Map" /> <jsp:setProperty name="mymap" property="name" param="name" /> <jsp:setProperty name="mymap" property="email" param="email" /> <% mymap.setAction( "add" ); %> <html> <head><title>Email Finder</title></head> <body bgcolor="#ffffff" background="background.gif" link="#000099"> <!-- the form table --> <form method="get"> <table border="0" cellspacing="0" cellpadding="5"> <tr> <td width="120"> </td> <td align="right"> <h1>Email Finder</h1> </td> </tr> <tr> <td width="120" align="right"><b>Name</b></td> <td align="left"><input type="text" name="name" size="35"></td> </tr> <tr> <td width="120" align="right"><b>Email Address</b></td> <td align="left"><input type="text" name="email" size="35"></td> </tr> <tr> <td width="120"> </td> <td align="right"> Please enter a name and an email address. </td> </tr> <tr> <td width="120"> </td> <td align="right"> <input type="submit" value="Add"> </td> </tr> <!-- here we call the put method to add the name and email address to the map file --> <% String rname = request.getParameter( "name" ); String remail = request.getParameter( "email" ); if ( rname != null) { mymap.put( rname, remail ); } %> <tr> <td width="120"> </td> <td align="right"> The map file has <font color="blue"><%= mymap.size() %> </font> entries. </font> </td> </tr> <tr> <td width="120"> </td> <td align="right"> <a href="lookup.jsp">Lookup</a> | <a href="delete.jsp">Delete</a> </td> </tr> </table> </form> </body> </html>
�Buscar un Nombre en el Fichero Map (lookup.jsp)
<%@ include file="copyright.html" %> <%@ page isThreadSafe="false" import="java.util.*, email.Map" errorPage="error.jsp" %> <jsp:useBean id="mymap" scope="session" class="email.Map" /> <jsp:setProperty name="mymap" property="name" param="name" /> <% mymap.setAction( "lookup" ); %> <html> <head><title> Email Finder </title></head> <body bgcolor="#ffffff" background="background.gif" link="#000099"> <form method="get"> <table border="0" cellspacing="0" cellpadding="5"> <tr> <td width="120"> </td> <td align="right"> <h1>Email Finder</h1> </td> </tr> <tr> <td width="120" align="right"><b>Name</b></td> <td align="left"><input type="text" name="name" size="35"></td> </tr> <tr> <td width="120"> </td> <td align="right"> Please enter a name for which <br> you'd like an email address. </td> </tr> <tr> <td width="120"> </td> <td align="right"> The map file has <font color="blue"> <%= mymap.size() %></font> entries. </td> </tr> <tr> <td width="120"> </td> <td align="right"> <input type="submit" value="Lookup"> </td> </tr> <% if ( request.getParameter( "name" ) != null ) { %> <%@ include file="lookupresponse.jsp" %> <% } %> <tr> <td width="120"> </td> <td align="right"> <a href="email.jsp">Add</a> | <a href="delete.jsp">Delete</a> </td> </tr> </table> </body> </html>
�Mostrar la Respuesta a la B�squeda (lookupresponse.jsp)
<%@ page import="java.util.*, email.Map" %> <tr> <td width="120"> </td> <td align="right"> <b> Success! </b> </td> </tr> <tr> <td width="120"> </td> <td align="right"> <jsp:getProperty name="mymap" property="name" /> <br> <jsp:getProperty name="mymap" property="email" /> </td> </tr>
�Borrar una Direcci�n Email (delete.jsp)
<%@ include file="copyright.html" %> <%@ page isThreadSafe="false" import="java.util.*, email.Map" errorPage="error.jsp" %> <jsp:useBean id="mymap" scope="session" class="email.Map" /> <jsp:setProperty name="mymap" property="name" param="name" /> <!-- tags the JSP page so that we can display the right exception message later --> <% mymap.setAction( "delete" ); %> <html> <head><title> Email Finder </title></head> <body bgcolor="#ffffff" background="background.gif" link="#000099"> <form method="get"> <table border="0" cellspacing="0" cellpadding="5"> <tr> <td width="120"> </td> <td align="right"> <h1>Email Finder</h1> </td> </tr> <tr> <td width="120" align="right"><b>Name</b></td> <td align="left"> <input type="text" name="name" size="35"> </td> </tr> <tr> <td width="120"> </td> <td align="right"> Please enter a name you would like to delete. </td> </tr> <tr> <td width="120"> </td> <td align="right"> The map file has <font color="blue"> <%= mymap.size() %></font> entries. </td> </tr> <tr> <td width="120"> </td> <td align="right"> <input type="submit" value="Delete"> </td> </tr> <!-- display the name and email address, then delete them from the map file --> <% if ( request.getParameter( "name" ) != null ) { %> <%@ include file="deleteresponse.jsp" %> <% mymap.remove( request.getParameter("name") ) ; } %> <tr> <td width="120"> </td> <td align="right"> <a href="email.jsp">Add</a> | <a href="lookup.jsp">Lookup</a> </td> </tr> </table> </body> </html>
�Mostrar la Respuesta de Borrado (deleteresponse.jsp)
<%@ page import="java.util.*, email.Map" %> <tr> <td width="120"> </td> <td align="right"> <b>Success!</b> </td> </tr> <tr> <td width="120"> </td> <td align="right"> <jsp:getProperty name="mymap" property="name" /> <br> <jsp:getProperty name="mymap" property="email" /> <br><p> has been deleted from the map file. </td> </tr>
�Mostrar Mensajes de Excepci�n (error.jsp)
<%@ include file="copyright.html" %> <%@ page isErrorPage="true" import="java.util.*, email.Map" %> <jsp:useBean id="mymap" scope="session" class="email.Map" /> <html> <head><title>Email Finder</title></head> <body bgcolor="#ffffff" background="background.gif" link="#000099"> <table border="0" cellspacing="0" cellpadding="5"> <tr> <td width="150" align="right"> </td> <td align="right" valign="bottom"> <h1> Email Finder </h1> </td> </tr> <tr> <td width="150" align="right"> </td> <td align="right"> <b>Oops! an exception occurred.</b> </td> </tr> <tr> <td width="150" align="right"> </td> <td align="right">The name of the exception is <%= exception.toString() %>. </td> </tr> <tr> <td width="150" align="right"> </td> <td align="right"> </td> </tr> <% if (mymap.getAction() == "delete" ) { %> <tr> <td width=150 align=right> </td> <td align=right> <b>This means that ...</b> <p>The entry you were trying to <font color="blue">delete</font> is not in the map file <br> <b><i>or</i></b> <br> you did not enter a name to delete. <p> Want to try <a href="delete.jsp">again</a>? </td> </tr> <% } else if (mymap.getAction() == "lookup" ) { %> <tr> <td width="150" align="right"> </td> <td align="right"> <b><i>This means that ...</b></i> <p>the entry you were trying to <font color="blue">look up</font> is not in the map file, <b><i>or</i></b> <br> you did not enter a name to look up. <p> Want to try <a href="lookup.jsp">again</a>? </td> </tr> <% } else if (mymap.getAction() == "add" ) { %> <tr> <td width="150" align="right"> </td> <td align="right"> <b><i>This means that ...</b></i> <p>You were trying to <font color="blue">add</font> an entry with a name of null. <br> The map file doesn't allow this. <p> Want to try <a href="email.jsp">again</a>? </td> </tr> <% } %> </table>
�Crear el Fichero Map (Map.java)
package email; import java.util.*; public class Map extends TreeMap { // In this treemap, name is the key and email is the value private String name, email, action; private int count = 0; public Map() { } public void setName( String formName ) { if ( formName != "" ) { name = formName; } } public String getName() return name; } public void setEmail( String formEmail ) { if ( formEmail != "" ) { email = formEmail; System.out.println( name ); // for debugging only System.out.println( email ); // for debugging only } } public String getEmail() { email = get(name).toString(); return email; } public void setAction( String pageAction ) { action = pageAction; } public String getAction() { return action; } }
�Manejar Excepciones en el Bean
En este ejemplo, el c�digo que lanza excepciones es la clase TreeMap, que extiende nuestro email.Map, por eso no tenemos que escribir c�digo que lance excepciones en el Bean.
Los m�todos que hemos usado de TreeMap son estos con sus excepciones:
- public Object get( Object key ) throws ClassCastException, NullPointerException- recupera una entrada de un fichero map.
- public Object put( Object key, Object value ) throws ClassCastException, NullPointerException-a�ade una entrada al fichero map.
- public Object remove( Object key ) throws ClassCastException, NullPointerException- elimina una entrada del fichero map.
- int size() - devuelve el n�mero de entradas del fichero map.
Por supuesto, si necesitamos m�s informaci�n sobre estos m�todos, podemos buscarlos en el API Javadoc por java.util.TreeMap.
La clase TreeMap lanza una ClassCastException cuando el usuario trata de introducir un dato del tipo err�neo en unf ichero map, por ejemplo, un int donde el fichero map est� esperando un String. Tengamos en cuenta que la clase TreeMap tambi�n se usa en aplicaciones cliente Java. En nuestra aplicaci�n JSP, esta aplicaci�n no ocurrir�, porque el usuario introduce un nombre y una direcci�n email en un formulario HTML, que siempre pasa los datos al Bean como strings. Incluso si el usuario teclea 6 como un nombre, el valor env�ado es un String.
Sin embargo, los m�todos get, put, y remove lanzan una NullPointerException si el usuario no introduce nada o se pasa un valor null al Bean. Esta la excepci�n m�s comun que necesita manejar la aplicaci�n email. Esta excepci�n podr�a ocurrir siempre que el usuario intente a�adir, buscar o eliminar una entrada del fichero map. Recuerda que la clave, (en este caso el nombre) no peude ser null.
�Cuando el Usuario Intenta A�adir un Valor Null
El primer caso, cuando el usuario intenta a�adir un nombre o direcci�n de email nulos, es manejado por un sencillo c�digo en el Bean y en email.jsp. (Aqu� null significa que el usuario no ha introducido nada en la caja de texto del formulario. No maneja el caso en que el usuario teclee uno o dos espacio en blanco, y luego pulsa Return).
El c�digo que maneja la adicci�n de valores null est� en los m�todos setName y setEmail de Map.java y en un scriptlet en email.jsp:
�Capturar un Valor Null Durante la Adicci�n
Map.java: public void setName( String formName ) { if ( formName != "" ) { name = formName; } } public void setEmail( String formEmail ) { if ( formEmail != "" ) { email = formEmail; System.out.println( name ); // for debugging only System.out.println( email ); // for debugging only } } email.jsp: <% String rname = request.getParameter( "name" ); String remail = request.getParameter( "email" ); if ( rname != null) { mymap.put( rname, remail ); } %>
Tanto setName como setEmail chequean su el usuario ha introducido un valor en el formulario antes de seleccionar sus respectivas propiedades. Si el formulario es un valor null, el Bean no selecciona ninguna propiedad, el m�todo put no a�ade nada al fichero map, y no se lanza ninguna excepci�n.
�Cuando el Usuario Intenta Buscar un Valor Null
Pero si vamos a las p�ginas Lookup o Delete del ejemplo e intentamos buscar o borrar una entrada que no est� en el fichero map, la aplicaci�n email lanza una NullPointerException y muestra una p�gina de error.
�Capturar un Valor Null durante la B�squeda
lookup.jsp: <% if ( request.getParameter( "name" ) != null ) { %> <%@ include file="lookupresponse.jsp" %> <% } %> lookupresponse.jsp: <tr> <td width="120"> </td> <td align="right"> <font face="helvetica" size="-2"> <jsp:getProperty name="mymap" property="name" /> <br> <jsp:getProperty name="mymap" property="email" /> </font> </td> </tr>
Este ejemplo tiene dos piezas de c�digo que trabajan juntas. La p�gina lookup.jsp, donde introducimos un nombre por el que queremos buscar en el fichero map, tiene un scriptlet que chequea si el usuario ha introducido un nombre en el formulario o no. Si el usuario no ha introducido un nombre o introduce uno que no existe en el fichero map, el Bean lanza una NullPointerException y la aplicaci�n muestra una p�gina de error -- que es el comportamiento deseado! En este caso, podemos estar felices porque se muestra la p�gina de error.
Podr�amos haber observado que las l�neas del fichero lookupresponse.jsp usan la etiqueta <jsp:getProperty> para recuperar el nombre y la direcci�n email desde el Bean. Tambi�n podr�amos intentar recuperar la direcci�n email usando expresiones, algo como esto:
<%= request.getParameter( "name" ) %> <br> <%= mymap.get( request.getParameter( "name" ) ) %>
Si usamos estas l�neas, el comportamiento de la aplicaci�n ser�a un poco diferente. En vez de lanzar una NullPointerException y mostrar una p�gina de error, mostrar�a el nombre que introdujo el usuario, con la palabra null debajo en la p�gina JSP. En la implementaci�n JSP de Sun, la etiqueta <jsp:getProperty> maneja intencionadamente las valores null de forma diferente que los scriptlets o las expresiones. La forma de manejar los valores Null depende del motor JSP utilizado.
�Cuando el Usuario Intenta Borrar un Valor Null
Manejar el caso de un usuario que intenta borrar un valor null es muy similar a manejar la b�squeda de un valor null.
�Capturar un Valor Null durante el Borrado
delete.jsp: <% if ( request.getParameter( "name" ) != null ) { %> <%@ include file="deleteresponse.jsp" %> <% mymap.remove( request.getParameter("name") ) ; } %> deleteresponse.jsp: <tr> <td width="120"> </td> <td align="right"> <font face="helvetica" size="-2"> <jsp:getProperty name="mymap" property="name" /> <br> <jsp:getProperty name="mymap" property="email" /> <br><p> has been deleted from the map file. </font> </td> </tr>
�Llamar a una P�gina de Error desde otra P�gina
Para hacer que las p�ginas muestren una p�gina de error, cada p�gina de la aplicaci�n email usa una directiva page con el atributo errorPage, de esta forma:
<%@ page isThreadSafe="false" import="java.util.*, email.Map" errorPage="error.jsp" %>
En los ejemplos de c�digo, los ficheros que usan esta directiva son email.jsp, lookup.jsp, y delete.jsp. S�lo podemos especificar un p�gina de error por cada p�gina JSP.
Esto significa que podemos dise�ar una aplicaci�n JSP para que cada p�gina JSP llame a una p�gina de error diferente, o que varias p�ginas JSP llamen a un misma p�gina de error. En la aplicaci�n email, varias p�ginas JSP llaman a un p�gina de error, a s� simplificamos el n�mero de ficheros que necesitamos para mantener una aplicaci�n.
Deber�amos usar al menos una p�gina de error en una aplicaci�n JSP. Si no especificamos una p�gina de error, los mensajes de excepci�n y el seguimiento de pila se mostrar�n en la ventana de comandos desde la que se arranc� el motor JSP, mientras que el navegador Web mostrar� un mensaje de error HTTP no informativo, por ejemplo, un mensaje 404 o 501. Esta definitivamente no es una manera adecuada de manejar excepciones.
�Escribir una P�gina de Error
Una p�gina de error es diferente a una p�gina normal JSP. En una p�gina de error, debemos seleccionar expl�citamente el atributo isErrorPage de la directiva page como true. Tambi�n tendremos acceso al objeto exception, que nos dar� informaci�n sobre la excepci�n.
Primero, veamos un ejemplo de la directiva page de una p�gina de error:
<%@ page isErrorPage="true" import="java.util.*, email.Map" %>
Una vez que hemos seleccionado isErrorPage a true, podemos usar el objeto exception. exception es del tipo java.lang.Throwable, por eso podemos usar cualquier m�todo definido en Throwable con exception en un scriptlet o una expresi�n, por ejemplo:
- <%= exception.toString() %>
- <% exception.printStackTrace(); %>
La expresi�n exception.toString() muestra el nombre de la clase de la excepci�n, por ejemplo, java.lang.NullPointerException, mientras que exception.printStackTrace() muestra el seguimiento de pila de la excepci�n. El nombre de la clase y el seguimiento de pila son probablemente muy �tiles para nuestro usuario. Para evitar esto, podr�amos querer escribir alg�n tipo de mecanismo de seguimiento para proporcionar informaci�n que nos ayude a darle un mensaje informativo a nuestro usuario.
�Escribir un Sencillo Mecanismo de Pila
El ejemplo email usa una propiedad llamada action en Map.java para seguir la p�gina en la que el usuario estaba trabajando cuando se lanz� la excepci�n. Esto nos da informaci�n importante para ayudarnos a escribir un mensaje de error informativo para el usuario. El Bean tiene una variable llamada action, un m�todo getAction, y un m�todo setAction. La declaraciones de variable y m�todos en el Bean se parecen a esto:
private String action; public void setAction( String pageAction ) { action = pageAction; } public String getAction() { return action; }
Cada una de las p�ginas email.jsp, lookup.jsp, y delete.jsp seleccionan el valor de action con una l�nea como esta (que viene desde email.jsp):
<% mymap.setAction( "add" ); %>
Si ocurre una excepci�n, error.jsp chequea el valor de action e incluye el mensaje apropiado para cada valor, usando l�neas como estas:
<% if (mymap.getAction() == "delete" ) { %> .. text message here .. else if (mymap.getAction() == "lookup" ) { %> .. text message here .. else if (mymap.getAction() == "add" ) { %> .. text message here .. <% } %>
Por supuesto, esta es una forma sencilla de implementar seguimiento. Si nos movemos dentro del desarrollo de aplicaciones J2EE con beans enterprise, podemos escribir aplicaciones que graben el estado.
��C�mo ejecuar el Ejemplo?
Para poder ejecutar este ejemplo, necesitamos tener instalado el JDK 1.2 (si no lo tienes, puedes ir a http://java.sun.com/products/OV_jdkProduct.html.)
Los paths dados aqu� son para un sistema UNIX, si est�s usando Windows, deber�s usar los mismos paths pero con el separador de directorios invertido:
- Creamos el directorio (o carpeta) ../jswdk-1.0/examples/jsp/tutorial/email.
- Situamos los siguientes ficheros en el directorio ../tutorial/email: background.gif, delete.jsp, deleteresponse.jsp, email.jsp, error.jsp, lookup.jsp, lookupresponse.jsp.
- Creamos el directorio (o carpeta) ../jswdk-1.0/examples/WEB-INF/jsp/beans/email.
- Situamos los ficheros Map.class y Map.java en el directorio ../beans/email.
- Arrancamos la implementaci�n de referencia JSP de Sun:cd ../jswdk-1.0startserver
- Abrimos un navegador Web y vamos a: http://yourMachineName:8080/examples/jsp/tutorial/email/email.jsp