Fco. Javier García Castellano


Compilación/ejecución de Servlets
 


Introducción

En esta parte del tutorial se verán los pasos que hay que dar para compilar un servlet, colocarlo en Tomcat y ejecutarlo desde un navegador.

Dentro del directorio C:\java\tomcat\webapps crearemos un directorio tutorial donde iremos colocando los fuentes de todos nuestros servlets. Dentro del directorio C:\java\tomcat\webapps\tutorial crearemos WEB-INF y dentro de éste (C:\java\tomcat\webapps\tutorial\WEB-INF ) crearemos el directorio classes que será donde guardaremos nuestros servlets compilados.


Si estamos en la escuela de informática, dentro del directorio ~/tomcat/webapps crearemos un directorio tutorial. En el directorio ~/tomcat/webapps/tutorial crearemos el directorio WEB-INF y dentro de éste (~/tomcat/webapps/tutorial/WEB-INF ) crearemos el directorio classes.

1 Compilar un Servlet

Dentro del directorio C:\java\tomcat\webapps\tutorial\ (en la escuela, será ~/tomcat/webapps/tutorial/) crearemos un fichero llamado HolaMundo.java que será el código fuente de nuestro primer servlet de ejemplo (el típico ejemplo que dice Hola Mundo). Ten cuidado con las mayúsculas, Java es Case Sensitive y el nombre del fichero deberá coincidir con la clase que hay dentro.

El código con el que rellenaremos nuestro HolaMundo.java es:

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

public class HolaMundo extends HttpServlet {

  public void init(ServletConfig conf)
    throws ServletException {
    super.init(conf);
  }

  public void service(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException  {
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();

    out.println("<html>");
    out.println("<body>");
    out.println("<h1>Hola Mundo</h1>");
    out.println("</body>");
    out.println("</html>");
  }
}

Abrimos un Símbolo del sistema (o terminal de comandos) y nos vamos al directorio C:\java\tomcat\webapps\tutorial\ (o ~/tomcat/webapps/tutorial/), donde ya tendremos nuestro HolaMundo.java. Para compilarlo, usaremos el compilador de Java que es javac indicándoles que para compilar el programa use las clases para Servlets (que viene con Tomcat y que estará en \tomcat\common\lib\servlet-api.jar o tomcat/common/lib/servlet-api.jar) , con la siguiente sentencia:

  javac -classpath c:\java\tomcat\common\lib\servlet-api.jar HolaMundo.java

Para compilar nuestro Servlets, usando Linux, en la escuela de informática (después de haber inicializado las variables de entorno), tendremos que poner:

   javac -classpath ~/tomcat/common/lib/servlet-api.jar  HolaMundo.java

Si no hay ningún problema deberá compilarse correctamente y aparecer la clase compilada en un fichero HolaMundo.class, si hubiera algún problema nos lo indicará la salida de javac.


2 Colocar el Servlet

La principal diferencia de un servlet Java respecto a una aplicación Java normal, es que una aplicación (una vez compilada) ya la podríamos ejecutar, mientras que el servlet lo tendremos que añadir al contenedor de servlets, para ello, lo primero que tenemos que hacer es copiar la clase compilada (HolaMundo.class) al directorio C:\java\tomcat\webapps\tutorial\WEB-INF\classes (o ~/tomcat/webapps/tutorial/WEN-INF/classes), que es donde se guardan las clases compiladas (directorio classes).

Ahora tenemos que configurar el servidor de aplicaciones para que se pueda mostrar nuestro servlet al exterior, es decir, tendremos que decirle al servidor donde se encuentra el servlet que hemos creado. La forma de hacer esto es crear un fichero XML llamado web.xml en el directorio WEB-INF e indicando en el mismo donde se encuentra el servlet y como mapearlo en una llamada, tal y como muestra el siguiente ejemplo.

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

    <display-name>Ejemplos tutorial</display-name>
    <description>
      Servlets de ejemplos del tutorial de Servlets y JDBC.
    </description>

    <servlet>
        <servlet-name>HolaMundo</servlet-name>
        <servlet-class>HolaMundo</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HolaMundo</servlet-name>
        <url-pattern>/servlet/HolaMundo</url-pattern>
    </servlet-mapping>

</web-app>

Así con la etiqueta servlet-name indicamos el nombre que le daremos en el navegador al servlet, con servlet-class indicamos el nombre de la clase del servlet. Con la etiqueta servlet-mapping indicamos que para llamar al servlet HolaMundo (esto se hace con <servlet-name>HolaMundo</servlet-name>) hay que hacerlo a través del directorio virtual /servlet/ (esto se hace con <url-pattern>/servlet/HolaMundo</url-pattern>). Por tanto, para acceder a nuestro servlet HolaMundo, tendremos que poner en el navegador la dirección: http://localhost:8081/tutorial/servlet/HolaMundo.


3 Colocar más Servlets

La compilación de los servlets es fácil (lo complicado es programarlos bien) y para que nos los muestre el servidor Tomcat es un poco más complicado ya que no basta con mover el servlet compilado al directorio correcto sino que, además, tendremos que tocar un fichero XML (el fichero web.xml). Vamos a modificar levemente el anterior ejemplo y crear una nueva clase que llamaremos HolaCaracola.java y cuyo código es:

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

public class HolaCaracola extends HttpServlet {

  public void init(ServletConfig conf)
    throws ServletException {
    super.init(conf);
  }

  public void service(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException  {
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();

    out.println("<html>");
    out.println("<head>");
    out.println("<title>Hola Caracola</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Hola <font color='red'>Caracola</font></h1>");
    out.println("</body>");
    out.println("</html>");
  }
}

Lo compilamos con javac -classpath c:\java\tomcat\common\lib\servlet-api.jar HolaCaracola.java (o javac -classpath ~/tomcat/common/lib/servlet-api.jar HolaMundo.java) y movemos el servlet compilado (HolaCaracola.class) al directorio C:\java\tomcat\webapps\tutorial\WEB-INF\classes (o ~/tomcat/webapps/tutorial/WEN-INF/classes), que es donde dijimos que se guardan las clases compiladas.

Modificamos el fichero web.xml del directorio WEB-INF e indicando en el mismo donde se encuentra el servlet (añadiendo la etiqueta Servlet) y como llamarlo (añadiendo la etiqueta servlet-mapping), tal y como muestra el siguiente ejemplo:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

    <display-name>Ejemplos tutorial</display-name>
    <description>
      Servlets de ejemplos del tutorial de Servlets y JDBC.
    </description>


    <servlet>
        <servlet-name>HolaMundo</servlet-name>
        <servlet-class>HolaMundo</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>HolaCaracola</servlet-name>
        <servlet-class>HolaCaracola</servlet-class>
    </servlet>


    <servlet-mapping>
        <servlet-name>HolaMundo</servlet-name>
        <url-pattern>/servlet/HolaMundo</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>HolaCaracola</servlet-name>
        <url-pattern>/servlet/HolaCaracola</url-pattern>
    </servlet-mapping>


</web-app>

De esta forma, para acceder a nuestro servlet HolaCaracola, tendremos que poner en el navegador la dirección: http://localhost:8081/tutorial/servlet/HolaCaracola.