Desarrollo de Aplicaciones Web con JSP y XML

El API JavaMail es un extensi�n est�ndar de Java. Proporciona una m�todo estrictamente independiente del protocolo de enviar y recibir emails. La arquitectura de capas de JavaMail permite el uso de varios protocolos de acceso a mensajes, como POP3 e IMAP, y protocolos de transferencia de mensajes como SMTP. JavaMail Interact�a con el contenido de los mensajes a trav�s del "JavaBeans Activation Framework" (JAF). JAF proporciona una forma uniforme de determinar el tipo de mensaje y su encapsularlo. Para m�s informaci�n puedes ver JavaBeans Activation Framework, en la site de Sun

Las "JavaServer Pages" (JSP) permiten a los desarrolladores crear p�ginas din�micas ricas en contenido r�pida y f�cilmente. JSP utiliza etiquetas al estilo de XML para encapsular la l�gica que genera el contenido web. Las p�ginas JSP separan la l�gica de la p�gina de su dise�o y estructura, lo que evita el solapamiento de roles entre los dise�adores web y los programadores. Los dise�adores dise�an las p�ginas web y los programadores les a�aden la l�gica y el c�digo. Para m�s informaci�n puedes ver Servlets y JSP

Este art�culo explora las posibilidades de combinar estas dos tecnolog�as y crear una aplicaci�n email desplegable en la web que use el API JavaMail y librer�as de etiquetas JSP para su presentaci�n. Las p�ginas JSP est�n pensadas para proporcionar un "m�todo declarativo y c�ntrico de presentaci�n del desarrollo de servlets". Un p�gina JSP ideal no contiene ninguna l�nea de c�digo o scriptles. En su lugar la funcionalidad y la l�gica del negocio se ejecutan en etiquetas que o est�n definidas en el API o en librer�as de etiquetas personalizadas. La aplicaci�n "Email Web Application" (EWA) presentada en este art�culo usa una librer�a de etiquetas personalizadas. Las etiquetas est�n implementadas usando el API JavaMail.

.�Especificaci�n Funcional

EWA soporta las funcionalidades b�sicas de una aplicaci�n email. como chequeo de login y env�o de email. M�s espec�ficamente, se soportan las siguientes funcionalidades:

  • 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 Aplicaci�n

EWA es una aplicaci�n web de tres capas. Reside en un servidor de aplicaciones web que interact�a con el servidor correo IMAP. Los clientes son p�ginas web generadas por p�ginas JSP desarrolladas en un entorno JSP/Servlet.

EWA utiliza una patr�n de dise�o derivado de "Model-View-Controller" (MVC). En el paradigma MVC, la entrada del usuario, el modelado del mundo exterior y la realimentaci�n visual al usuario son expl�citamente separados y manejados por tres tipos de objetos, cada uno especializado en su propia tarea.

La vista trabaja la salida gr�fica y/o textual de la porci�n de pantalla mapeada que est� asignada a esta aplicaci�n. El controlador interpreta las entradas del usuario a trav�s del rat�n y del teclado, ordenando al modelo y/o la vista que se modifiquen de la forma apriada. Finalmente, el modelo maneja el comportamiento y los datos de la aplicaci�n dominante, responde a las peticiones de informaci�n sobre su estado (normalmente desde la vista), y responde a las instrucciones de cambio de estado (normalmente desde el controlador).

En esta aplicaci�n, el modelo consiste en el mensaje IMAP almacenado en el MailUserBean, la librer�a de etiquetas y el AttachmentServlet, que accede/maneja el almacenamiento del mensaje. La vista consta de componentes HTML y JSP que proporcionan el interface de usuario. El controlador es el FilterServlet, que valida el estado del login del usuario.

.�El Modelo

MailUserBean

Este es el JavaBean que almacena la informaci�n de email del usuario, como el hostname, el username, la password, la session y el protocol. Tiene m�todos para obtener y almacenar estos par�metros. Para prop�sitos de esta demostraci�n el protocolo ha sido codificado para ser IMAP. Este bean implementa los m�todos login y logout del usuario. Usa los objetos Session y Store de mail para almacenar la combinaci�n de hostname, username y password

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

/**
 * 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;
    }

    /**
     * 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;
    }
}

Librer�a de Etiquetas

La librer�a de etiquetas contiene las siguientes etiquetas personalizadas:

  • message: usada para leer un mensaje, clases controladoras: MessageTag.java, MessageTEI.java
  • listmessages: usada para iterar a trav�s de la lista de mensajes, clases controladoras: ListMessagesTag.java, ListMessagesTEI.java
  • sendmail: usada para enviar mensajes, clase controladora: SendTag.java

El 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 aplicaci�n:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
        "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>javamail</shortname>
  <uri>http://java.sun.com/products/javamail/demo/webapp</uri>
  <tag>
    <name>listattachments</name>
    <tagclass>ListAttachmentsTag</tagclass>
    <teiclass>ListAttachmentsTEI</teiclass>
    <bodycontent>JSP</bodycontent>
    <info>
        A listattachments tag
    </info>
    <attribute>
      <name>id</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>messageinfo</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  <tag>
    <name>listmessages</name>
    <tagclass>ListMessagesTag</tagclass>
    <teiclass>ListMessagesTEI</teiclass>
    <bodycontent>JSP</bodycontent>
    <info>
        A listmessages tag
    </info>
    <attribute>
      <name>id</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>folder</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>session</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  <tag>
    <name>message</name>
    <tagclass>MessageTag</tagclass>
    <teiclass>MessageTEI</teiclass>
    <bodycontent>empty</bodycontent>
    <info>
        A message tag
    </info>
    <attribute>
      <name>id</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>folder</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>session</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>num</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  <tag>
    <name>sendmail</name>
    <tagclass>SendTag</tagclass>
    <bodycontent>JSP</bodycontent>
    <info>
        An sendmail tag
    </info>
    <attribute>
      <name>host</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>port</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>recipients</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>sender</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>subject</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>

Cada una de las etiquetas tiene su propia clase controladora que implementa las acciones de la etiqueta. Por ejemplo, la etiqueta listmessages est� implementada en 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.*;

/**
 * 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;
        } else
            return 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());
        }
        
        // clear up so the next time the body content is empty
        body.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 informaci�n sobre las variables de scripting que se crean/modifican en tiempo de ejecuci�n. Son necesarias para etiquetas que definen variables de scripting. Esta informaci�n se usa durante la fase de traduci�n de JSP. Aqu� tenemos la clase TEI de la etiqueta ListMessages

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 multiparte y lo env�a hacia el navegador con el tipo de contenido apropiado. Este servlet se usa para mostrar attachments y se relaciona con las capacidades de manejar tipos de 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
 * content handling capabilities.
 */
public class AttachmentServlet extends HttpServlet {

    /**
     * This method handles the GET requests from the client.
     */
    public void doGet(HttpServletRequest request, HttpServletResponse  response)
        throws IOException, ServletException {
      
        HttpSession session = request.getSession();
        ServletOutputStream out = response.getOutputStream();
        int msgNum = Integer.parseInt(request.getParameter("message"));
        int partNum = Integer.parseInt(request.getParameter("part"));
        MailUserBean mailuser = (MailUserBean)session.getAttribute("mailuser");

        // check to be sure we're still logged in
        if (mailuser.isLoggedIn()) {
            try {
                Message msg = mailuser.getFolder().getMessage(msgNum);

                Multipart multipart = (Multipart)msg.getContent();
	        Part part = multipart.getBodyPart(partNum);
                
                String sct = part.getContentType();
	        if (sct == null) {
		    out.println("invalid part");
		    return;
	        }
	        ContentType ct = new ContentType(sct);

	        response.setContentType(ct.getBaseType());
	        InputStream is = part.getInputStream();
	        int i;
	        while ((i = is.read()) != -1)
		    out.write(i);
	        out.flush();
	        out.close();

            } catch (MessagingException ex) {
                throw new ServletException(ex.getMessage());
            }
        } else {
            getServletConfig().getServletContext().
                getRequestDispatcher("/index.html").
                forward(request, response);
        }
    }   
}

.�La Vista

La vista consta de JavaMail.html, que es el punto de entrada inicial. Esta p�gina requiere que el usuario introduzca un username, un password y un hostname IMAP. Despu�s de haber validado la informaci�n de login, el usuario navega a traves de una serie de p�ginas web.

.�El Controlador

El controlador es el FilterServlet. Este servlet se usa para determinar si el usuario hab�a entrado anteriormente de enviar la petici�n a la URL seleccionada. El m�todo doPost maneja el env�o POST de dos formas: login.jsp y compose.jsp. El m�todo doGet maneja las peticiones GET desde el cliente.

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

/**
 * This servlet is used to determine whether the user is logged in before
 * forwarding the request to the selected URL.
 */
public class FilterServlet extends HttpServlet {

    /**
     * This method handles the "POST" submission from two forms: the
     * login form and the message compose form.
     */
    public void doPost(HttpServletRequest request, 
                       HttpServletResponse  response) 
                       throws IOException, ServletException {

        String servletPath = request.getServletPath();
        servletPath = servletPath.concat(".jsp");
        
        getServletConfig().getServletContext().
            getRequestDispatcher("/" + servletPath).forward(request, response);
    }

    /**
     * This method handles the GET requests from the client.
     */
    public void doGet(HttpServletRequest request, 
                      HttpServletResponse  response)
                      throws IOException, ServletException {
      
        // check to be sure we're still logged in 
        // before forwarding the request.
        HttpSession session = request.getSession();
        MailUserBean mailuser = (MailUserBean)session.getAttribute("mailuser");
        String servletPath = request.getServletPath();
        servletPath = servletPath.concat(".jsp");
        
        if (mailuser.isLoggedIn())
            getServletConfig().getServletContext().
                getRequestDispatcher("/" + servletPath).
                forward(request, response);
        else
            getServletConfig().getServletContext().
                getRequestDispatcher("/index.html").
                forward(request, response);
    }
}

.�Desarrollo de la aplicaci�n

Esta aplicaci�n fue desarrollada usando:

  • JavaMail 1.2
  • Servlet 2.2
  • JavaServer Pages 1.1
  • JavaBeans Activation Framework (JAF) 1.0.1

Para ejecutar esta aplicaci�n, necesitamos lo siguiente:

  1. Una implementaci�n JSP/Servlet que pueda ser ejecutada como una aplicaci�n solitaria o como una extensi�n de un servidor Wev. Para est� aplicaci�n, usamos Tomcat 3.2.1.
  2. Un servidor de mail IMAP.

Aqu� tenemos unas cuantas im�genes de la ejecuci�n del ejemplo, con su correspondiente c�digo fuente. El punto de entrada es index.html.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>

<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1">
<TITLE>JavaMail</TITLE>
</HEAD>

<BODY BGCOLOR="#CCCCFF">

<FORM ACTION="login" METHOD=POST ENCTYPE="application/x-www-form-urlencoded">
<P ALIGN="CENTER"><B>Welcome to JavaMail</B></P>

<P ALIGN="CENTER"><B>HTML Email Reader Demo</B></P>
<CENTER>
<P>
<TABLE BORDER="0" WIDTH="100%">
<TR>
<TD WIDTH="40%">
<P ALIGN="RIGHT">IMAP Hostname:
</TD>
<TD WIDTH="60%"><INPUT TYPE="TEXT" NAME="hostname" SIZE="25"></TD>
</TR>
<TR>
<TD WIDTH="40%">
<P ALIGN="RIGHT">Username:
</TD>
<TD WIDTH="60%"><INPUT TYPE="TEXT" NAME="username" SIZE="25"></TD>
</TR>
<TR>
<TD WIDTH="40%">
<P ALIGN="RIGHT">Password:
</TD>
<TD WIDTH="60%"><INPUT TYPE="PASSWORD" NAME="password" SIZE="25"></TD>
</TR>
</TABLE>
<INPUT TYPE="SUBMIT" VALUE="Login">
<INPUT TYPE="RESET" NAME="Reset" VALUE="Reset"></P>
</CENTER>

<P><B><I>Features:</I></B></P>

<UL>
<LI>HTML access to your IMAP mailbox
<LI>Proxy-able anywhere HTTP can be proxied
<LI>Easy to use
<LI>Uses web browser's content handling capabilities
</UL>

<P><B><I>Limitations:</I></B></P>

<UL>
<LI>Only INBOX support (no user folders)
<LI>Can't delete, copy, move, print, save, forward, reply to, search in
messages but it could be done
<LI>Doesn't check for new messages (have to log out and log back it)
</UL>
<P>
<HR ALIGN="CENTER">
</P>
</FORM>
</BODY>
</HTML>

Un login con �xito nos lleva al inbox. Si el login falla, se muestra la p�gina de error. Entonces el usuario tiene una opci�n para ver los detalles del error.

<%@ page language="java" import="MailUserBean" %>
<%@ page errorPage="errorpage.jsp" %>
<%@ taglib uri="http://java.sun.com/products/javamail/demo/webapp" 
    prefix="javamail" %>

<html>
<head>
	<title>JavaMail messageheaders</title>
</head>

<body bgcolor="#ccccff"><hr>
    
<center><font face="Arial,Helvetica" font size="+3">
<b>Folder INBOX</b></font></center><p>
   
<font face="Arial,Helvetica" font size="+3">
<b><a href="logout">Logout</a>
<a href="compose" target="compose">Compose</a>
</b></font>
<hr>
    
<table cellpadding=1 cellspacing=1 width="100%" border=1>
<tr>
<td width="25%" bgcolor="ffffcc">
<font face="Arial,Helvetica" font size="+1">
<b>Sender</b></font></td>
<td width="15%" bgcolor="ffffcc">
<font face="Arial,Helvetica" font size="+1">
<b>Date</b></font></td>
<td bgcolor="ffffcc">
<font face="Arial,Helvetica" font size="+1">
<b>Subject</b></font></td>
</tr>
<javamail:listmessages
 id="parteV_msginfo"
 folder="folder">
<%-- from --%>
<tr valign=middle>
<td width="25%" bgcolor="ffffff">
<font face="Arial,Helvetica">
<% if (msginfo.hasFrom()) { %>
<%= msginfo.getFrom() %>
</font>
<% } else { %>
<font face="Arial,Helvetica,sans-serif">
Unknown
<% } %>
</font></td>
<%-- date --%>
<td nowrap width="15%" bgcolor="ffffff">
<font face="Arial,Helvetica">
<%= msginfo.getDate() %>
</font></td>
<%-- subject & link --%>
<td bgcolor="ffffff">
<font face="Arial,Helvetica">
<a href="messagecontent?message=<%= msginfo.getNum() %>">
<% if (msginfo.hasSubject()) { %>
<%=    msginfo.getSubject() %>
<% } else { %>
<i>No Subject</i>
<% } %>
</a>
</font></td>
</tr>
</javamail:listmessages>
</table>
</body>
</html>

<%@ page isErrorPage="true" %>
<html>
<head>
<title>JavaMail errorpage</title>
</head>
<body bgcolor="white">
<form ACTION="errordetails" METHOD=POST>
<% session.putValue("details", exception.toString()); %>
<h2>An error occured while attempting to perform the operation you requested.
</h2>
<input type="submit" name="Error Details" value="Error Details">
</body>
</html>

<%@ page isErrorPage="true" %>
<html>
<head>
<title>JavaMail errordetails</title>
</head>
<body bgcolor="white">
<%= session.getValue("details") %>
</body>
</html>

Desde dentro del inbox, el usuario tiene la opci�n de componer un mensaje o salir.

<%@ page language="java" %>
<%@ page errorPage="errorpage.jsp" %>

<html>
<head>
	<title>JavaMail compose</title>
</head>

<body bgcolor="#ccccff">
<form ACTION="send" METHOD=POST>
<input type="hidden" name="send" value="send">
<p align="center">
<b><font size="4" face="Verdana, Arial, Helvetica">
JavaMail Compose Message</font></b>
<p>
<table border="0" width="100%">
<tr>
<td width="16%" height="22">	
<p align="right">
<b><font face="Verdana, Arial, Helvetica">To:</font></b></td>
<td width="84%" height="22">
<% if (request.getParameter("to") != null) { %>
<input type="text" name="to" value="<%= request.getParameter("to") %>" size="30">
<% } else { %>
<input type="text" name="to" size="30"> 
<% } %>
<font size="1" face="Verdana, Arial, Helvetica">
 (separate addresses with commas)</font></td></tr>
<tr>
<td width="16%"><p align="right">
<b><font face="Verdana, Arial, Helvetica">From:</font></b></td>
<td width="84%">
<input type="text" name="from" size="30"> 
<font size="1" face="Verdana, Arial, Helvetica">
 (separate addresses with commas)</font></td></tr>
<tr>
<td width="16%"><p align="right">
<b><font face="Verdana, Arial, Helvetica">Subject:</font></b></td>
<td width="84%">
<input type="text" name="subject" size="55"></td></tr>
<tr>
<td width="16%">&nbsp;</td>
<td width="84%"><textarea name="text" rows="15" cols="53"></textarea></td></tr>
<tr>
<td width="16%" height="32">&nbsp;</td>
<td width="84%" height="32">
<input type="submit" name="Send" value="Send">
<input type="reset" name="Reset" value="Reset"></td></tr>
</table>
</form>
</body>
</html>

<%@ page language="java" import="MailUserBean" %>
<%@ page errorPage="errorpage.jsp" %>
<jsp:useBean id="parteV_mailuser" scope="session" class="MailUserBean" />

<html>
<head>
	<title>JavaMail logout</title>
</head>

<% mailuser.logout(); %>

<body>
<h2>Logged out OK</h2><a href=index.html>click here to login</a>
</body>
</html>

EWA est� compuesto por un documento HTML y varios documentos web (servlets y JSP y etiquetas persnalizadas). a parte de estos, tiene dos directorios:META-INF y WEB-INF.

El directorio META-INF contiene:

  • El fichero de manifiesto para la aplicaci�n.

El directorio WEB-INF contiene:

  • El fichero web.xml que contiene la configuraci�n y la informaci�n de despliegue de la aplicaci�n.
  • El directorio classes que contiene las clases servlet y de utilidad usadas por la aplicaci�n web.
  • El directorio lib que contiene el archivo (jtl.jar) para la librer�a de etiquetas personalizadas.

Aqu� puedes decargar los fuentes de la aplicaci�n EWA

.�Construir y empaquetar la aplicaci�n JavaMail

Una vez descomprimido el fichero zip de descarga, los ficheros fuente se encontrar�n en los siguientes directorios:

  • src/classes
  • src/docroot
  • src/taglib

Dentro del fichero zip tambi�n podr�s encontrar dos ficheros de scripts (build.sh y build.bat) para construir y empaquetar la aplicaci�n. Antes de ejecutar estos scripts debes asegurarte de que los siguientes ficheros est�n en tu CLASSPATH:

  • mail.jar - The JavaMail jar file
  • activation.jar - the JAF jar file
  • servlet.jar - the servlet/JSP jar file

Si lo haces a mano, debes realizar los siguientes pasos para construir y empaquetar la aplicacion:

  1. Crear un directorio llamado "src/docroot/WEB-INF/classes".
  2. Crear un directorio llamado "src/docroot/WEB-INF/lib".
  3. Compilar los ficheros del directorio "src/classes" y a�adirlos al directorio "src/docroot/WEB-INF/classes".
  4. Compilar los ficheros del directorio "src/tablib".
  5. Crear un archivo jar (jtl.jar) con las clases de la librer�a taglib y a�adirlo a "src/docroot/WEB-INF/lib".
  6. Crear un archivo web (.war) con los contenidos de "src/docroot" (y todos sus subdirectorios).

Una nota sobre el env�o de mail

Para poder env�ar correo usando esta aplicaci�n , es necesario especificar un host SMTP. Esto puede hacerse de un par de formas:

  1. Usar la variable de entorno TOMCAT_OPTS.
    A�adiendo lo siguiente al fichero de configuraci�n de Tomcat:
    	-Dmail.smtp.host=yourSMTPmailservername
    
    Rearrancar el servidor.
  2. Modificar el fichero send.jsp y actualizar el fichero javamail.war:
    A�adir el siguiente par�metro a la etiqueta <javamail:sendmail>:
    	host="yourSMTPmailservername"
    
    Reempaquetar el fichero javamail.war para incluir el fichero send.jsp modificado.

.�Conclusi�n

Esta aplicaci�n demuestra una forma de desarrollar una aplicaci�n usando el API JavaMail y JSP. Se ha hecho un esfuerzo para implementar la mayor�a de las acciones en la librer�a de etiquetas y as� minimizar el c�digo en-l�nea. Sin embargo, el manejo de attachment se ha realizado en un servlet en lugar de en una etiqueta. Esto fue m�s una materia de conveniencia que de dise�o. La funcionalidad de AttachmentServlet se podr�a haber implementado perfectamente en un etiqueta.

La siguiente versi�n del API JavaMail contendr� una aplicaci�n demo similar a la explicada en este art�culo. Contendr� m�s caracter�sticas y ciertas modificaciones a esta versi�n. Por favor visita JavaMail API and Internet Mail Resources para ver las actualizaciones.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR