domingo, 2 de junio de 2013

Apache Tomcat

Como instalar Apache Tomcat 7 y
Programación con Java Servlet

Este tutorial puede ser completado en aproximadamente 3 horas, preferentemente con la ayuda de un instructor. Esta guía de instalación y configuración es aplicable para Tomcat en su versión 7 y muy probablemente para versiones anteriores.

1. Introducción
1.1 Aplicación Web (Webapp)
Una aplicación web o webapp, a diferencia de una aplicación standalone, requiere conexión a internet. Ejemplos de webapps son google, amazon, ebay, facebok y twitter. Una aplicación web es típicamente una aplicación cliente-servidor de 3-capas (3-tier) normalmente con una base de datos involucrada. Las webapps corren sobre el protocolo TCP/IP. Los usuarios acceden a una aplicación web a través de un navegador (cliente HTTP).
Una aplicación web requiere cinco componentes, tal como se ilustra a continuación:
  1. Servidor HTTP: Por ejemplo: Apache HTTP Server, Apache Tomcat HTTP Server, Microsoft IIS, etc...
  2. Cliente HTTP (o Navegador Web): Por ejemplo: Internet Explorer, FireFox, Chrome, etc...
  3. Base de datos: Por ejemplo: MySQL, Apache Derby, mSQL, SQLite, PostgreSQL, OpenOffice's Base; Commercial Oracle, IBM DB2, SAP SyBase, MS SQL Server, MS Access.
  4. Programa Cliente: pueden ser escritos en HTML Form, JavaScript, VBScript, Flash, etc...
  5. Programa Servidor: pueden ser escritos en Java Servlet/JSP, ASP, PHP, CGI, etc...


El procedimiento es:
  1. El usuario, vía un navegador, introduce una dirección URL a un servidor HTTP para arrancar una aplicación web.
  2. Un programa por el lado del cliente (como un formulario HTML) es cargado en el navegador del cliente.
  3. El usuario realiza la consulta “query criteria” mediante un formulario que nos permite definir consultas con un estilo orientado a objetos.
  4. El programa por el lado del cliente envía los parámetros de la query al programa por el lado del servidor.
  5. El programa por el lado del servidor consulta la base de datos y devuelve el resultado al cliente.
  6. El programa por el lado del cliente muestra el resultado en el navegador.
1.2 Protocolo de transferencia de hipertexto (HTTP).
HTTP es un protocolo asíncrono de consulta-respuesta. Un cliente envía un mensaje de consulta al servidor. El servidor devuelve un mensaje de respuesta al cliente. La sintaxis del mensaje está definido en la especificación HTTP.


1.3 Servidor HTTP Apache Tomcat
Apache Tomcat es un servidor HTTP apto para Java, el cual puede ejecutar programas especiales de Java conocidos como Java Servlet y Java Server Pages (JSP). Tomcat es un proyecto de código abierto, bajo la “Fundación de Software Apache” la cual dispone además del servidor HTTP más potente y más usado de código abierto.
Podemos encontrar Tomcat en http://tomcat.apache.org. De forma alternativa puedes encontrar Tomcat en la web oficial de Apache en http://www.apache.org..
Tomcast fue originalmente escrito por James Duncan Davison en 1998 cuando aún trabaja para Sun, basado en una primera version de un servidor Sun llamado Java Web Server (JWS). Empezó en la versión 3.0 después de que JSWDK 2.1 lo sustituyera. Sun con posterioridad haría Tomcat de código abierto para terminar cediéndoselo a Apache.
Las diferentes releases de Tomcat son:
  1. Tomcat 3.x (1999): RI para Servlet 2.2, JSP 1.1
  2. Tomcat 4.x (2001): RI para Servlet 2.3, JSP 1.2
  3. Tomcat 5.x (2002): RI para Servlet 2.4, JSP 2.0
  4. Tomcat 6.x (2006): RI para Servlet 2.5, JSP 2.1
  5. Tomcat 7.x (2010): RI para Servlet 3.0, JSP 2.2, EL 2.2

2. Como instalar Tomcat 7 y prepararse para programar con Java Servlet
2.1 PASO 1: Descargar e Instalar Tomcat
(Para usuarios de Mac) Lee "How to Install Tomcat 7 on Mac" Step 1 <= En inglés.
  1. De http://tomcat.apache.org Selecciona "Downloads" "Tomcat 7.0" "7.0.{xx}" (donde {xx} es el número de la última actualización) "Binary Distributions" "Core" "zip" "apache-tomcat-7.0.{xx}.zip".
  2. Descomprime el .zip en un directorio de tu elección. NO descomprimas el archivo en el Escritorio (ya que es una ruta difícil de localizar). Se sugiere usar “d:\miproyecto”. Tomcat será descomprimido dentro del directorio “d:\miproyecto\apache-tomcat-7.0.{xx}” . Para facilitar el uso acortaremos y renombraremos este directorio a “d:\miproyecto\tomcat”. Anota el directorio de tu instalación de Tomcat. De aquí en adelante nos referiremos al directorio de instalación de Tomcat como <TOMCAT_HOME> o <CATALINA_HOME> - “Catalina” es el nombre en clave para Tomcat 5 y superior.
Se recomienda la versión “zip”, ya que puedes simplemente borrar el directorio por completo cuando ya no necesites volver a utilizar Tomcat sin tener que ejecutar ningún desinstalador. Eres libre de mover o renombrar el directorio de instalación de Tomcat. Puedes instalar (descomprimir) múltiples copias de Tomcat en el mismo ordenador. Para producción es más fácil usar el instalador para configurar Tomcat de forma adecuada.
Echa un vistazo al directorio de instalación de Tomcat. Contiene los siguientes sub-directorios.
  • bin: Contiene los scripts de startup y shutdown (arranque y apagado).
  • conf: Contiene los archivos de configuración, tales como server.xml, web.xml, context.xml, y tomcat-users.xml.
  • lib: Contiene los ficheros de librería JAR de Tomcat accesible para todas las aplicaciones web. Podrías también colocar aquí librería externa como los drivers de MySQL JDBC.
  • logs: Contiene los registros de eventos (logs). Si necesitas revisar algún mensaje de error estará aquí.
  • webapps: Contiene las aplicaciones web que serán desplegadas. También puedes colocar los ficheros WAR en esta carpeta.
  • work: Directorio de trabajo de Tomcat usado por JSP, para la conversión JSP-a-Servlet.
  • temp: Ficheros temporales.
  • (Para usuarios avanzados de Windows 7/Vista) Una mejor aproximación es mantener el nombre de la carpeta original, apache-tomcat-7.0.{xx}, pero creando un vínculo simbólico llamado tomcat en la línea de comando sería: "mklink /D tomcat apache-tomcat-7.0.30".
  • Un vínculo simbólico es un objeto del sistema de archivos que apunta a otro objeto del sistema de archivos. El objeto al que se apunta se denomina objeto de destino. Los vínculos simbólicos son transparentes para los usuarios. Los vínculos aparecen como directorios o archivos normales y el usuario o la aplicación los pueden usar exactamente de la misma manera.
2.2 PASO 2: Crear una variable de entorno JAVA_HOME
(Para usuarios de Mac) Saltarse este paso.
Necesitas crear una variable de entorno llamada “JAVA_HOME” y asignarle el directorio del JDK instalado.
  1. Primero, toma nota del directorio donde se encuentre el JDK de Java instalado. Por defecto es "c:\program files\java\jdk1.7.0_{xx}", donde {xx} es el número de la última versión. Es importante verificar el directorio del JDK antes de seguir.
  2. En la línea de comandos de Windows "set JAVA_HOME" para comprobar si la variable de entorno ha sido fijada:
C:\> set JAVA_HOME
Variable de entorno JAVA_HOME no definida
Si por el contrario JAVA_HOME ha sido definida, comprobar que esté apuntando al directorio del JDK instalado en caso contrario ir al siguiente paso.
  1. Para definir la variable de entorno JAVA_HOME en Windows 2000/XP/Vista/7/: Ve a “Inicio” Panel de control Sistema Configuración Avanzada del sistema Pestaña “Opciones Avanzadas” Variables de Entorno Variables del sistema "Nueva… (o "Editar" para modificaciones) En "Nombre de la variable”, introduce "JAVA_HOME" En "Valor de la variable”, introduce la ruta del directorio del JDK instalado en tu equipo. (ejemplo, "c:\program file\java\jdk1.7.0_{xx}") – Copia y pega la ruta para evitar errores al teclearla.
  2. Para verificar, cierra y abre una nueva línea de comandos (Tecla Windows+R e introduce CMD+Enter) , ahora en la línea de comandos vuelve a escribir:
C:\> set JAVA_HOME
JAVA_HOME=C:\Program Files\Java\jdk1.7.0_09 <= Verifica esta ruta.

2.3 PASO 3: Configurar el Servidor Tomcat
(Para usuarios de Mac) Tomcat está situado en “/Applications/tomcat" si seguiste el Paso 1.

(Nota para usuarios de Windows) Si necesitas poder ver las extensiones de los ficheros (como .txt, .ini) ve a "Panel de Control" -> Opciones de carpeta -> Selecciona la pestaña "Ver" -> Desmarca "Ocultar las extensiones de archivos para tipos de archivos conocidos".

La configuración de Tomcat está situada en el sub-directorio “conf” del directorio de (por ejemplo, "d:\myproject\tomcat\conf"). Hay 4 ficheros XML de configuración:
  1. server.xml
  2. web.xml
  3. context.xml
  4. tomcat-users.xml
Haz una copia de seguridad de estos ficheros antes de continuar.

Paso 3(a) "conf\server.xml" – Configura el puerto TCP.
Usa un editor de texto como NotePad++ para abrir el fichero de configuración “server.xml”.
El puerto por defecto configurado en Tomcat es el 8080, puedes elegir un número entre 1024 and 65535 que no esté siendo usado por otra aplicación. Para este ejemplo se usará el puerto 9999. (Para el servidor de producción debería usarse el puerto 80, el cual es pre-asignado para servidores HTTP como el puerto por defecto.)
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="9999" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

Paso 3(b) "conf\web.xml" – Habilitación del Listado de Directorios
De nuevo, usa un editor de texto y abre el fichero de configuración “web.xml”.
Habilitaremos el listado de directorios cambiando “listings” de “false” a “true” para el servlet por defecto “default”. Esto es práctico para sistema de testeo, pero no para producción por razones de seguridad:

<!-- The default servlet for all web applications, that serves static -->
<!-- resources. It processes all requests that are not mapped to other -->
<!-- servlets with servlet mappings. -->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>


Paso 3(c) "conf\context.xml" – Habilitación de actualización automática
Añadiremos el atributo reloadable="true" al elemento <Context> para habilitar la recarga automática después de que el código cambie. De nuevo indicar que es práctico sólo para testeo pero no para producción, debido a la carga que supone para el sistema detectar los cambios:
<Context reloadable="true">
......
</Context>

Paso 3(d) "conf\tomcat-users.xml"
Habilitar el administrador de Tomcat añadiendo las líneas resaltadas:
<tomcat-users>
<role rolename="manager-gui"/>
<user username="manager" password="xxxx" roles="manager-gui"/>
</tomcat-users>

2.4 PASO 4: Iniciar el Servidor Tomcat
Los ejecutables de Tomcat están en el sub-directorio “bin” (ejemplo, "d:\myproject\tomcat\bin").

Paso 4(a) Arrancar Servidor
Inicia una línea de comandos del Sistema (CMD). Ve al directorio “<TOMCAT_HOME>\bin” y ejecuta “startup.bat” como se explica a continuación:
// Cambia al directorio “\bin” de la ruta de instalación de Tomcat
// Asume que Tomcat está instalado en "d:\myproject\tomcat"
> d: // Cambia a la unidad d:
> cd \myproject\tomcat\bin // Cambia a TU directorio “bin” de Tomcat
// Inicia el servidor
D:\myproject\tomcat\bin> startup

Una nueva ventana de la consola aparece. Estudia los mensajes que muestra. Busca y comprueba que Tomcat esté corriendo en el puerto 9999. Errores futuros serán enviados a esta ventana. Los System.out.println() que hagan tu servlets de Java será enviado también a esta consola.
......
INFO: Initializing Coyote HTTP/1.1 on http-9999
......
INFO: Starting Coyote HTTP/1.1 on http-9999
......
INFO: Server startup in 699 ms

(Para usuarios de Mac) Tomcat está instalado en "/Applications/tomcat". Para iniciar el servidor de Tomcat, abre un Nuevo “Terminal” y haz lo siguiente:
$ cd /Applications/tomcat/bin
$ ./catalina.sh run
Si no puedes iniciar Tomcat: LeeComo depurar”.

Paso 4(b) Iniciar un Cliente para acceder al Servidor
Abre un navegador (como cliente HTTP) e introduce la siguiente URL "http://localhost:9999" para acceder a la página de bienvenida del servidor Tomcat. El hostname "localhost" (con la dirección IP de 127.0.0.1) es utilizado para testeo en local. Para usuarios en otros ordenadores en red, deberán usar la dirección IP del servidor o bien el nombre del dominio DNS o el hostname en el formato “http://serverHostnameOrIPAddress:9999".


Prueba a introducir la siguiente dirección http://localhost:9999/examples para ver el servlet y los ejemplos JSP. Prueba alguno de los ejemplos mostrados.
Para ejecutar el administrador web de Tomcat teclea http://localhost:9999/manager/html. Introduce el usuario y password configurado con anterioridad en tomcat-users.xml.

Paso 4(c) Apagar el Servidor
Puedes apagar el servidor de dos formas:
  1. Presionando control-C en la consola de Tomcat, o
  2. Ejecutando "<TOMCAT_HOME>\bin\shutdown.bat".
(Para usuarios de Mac) Para apagar el servidor, presiona control-c (NO command-c), o abre una nueva ventana “Terminal” y teclea lo siguiente:
$ cd /Applications/tomcat/bin
$ ./shutdown.sh

PRECAUCIÓN: Debes CERRAR debidamente Tomcat. Si no lo haces podrías encontrarte con problemas al volver a iniciarlo.

2.5 PASO 5: Desarrollar e Implementar una aplicación Web
Paso 5(a) Crea una estructura de carpetas para tu aplicación Web.
Antes de nada, elige un nombre para tu aplicación. En el ejemplo la llamaremos “hello”. Ve al sub-directorio de Tomcat “webapps” y crea la siguiente estructura para tu aplicación Web (tal y como se ilustra).
  1. Dentro de "webapps", crea el raiz de tu aplicación "hello" (por ejemplo., "<TOMCAT_HOME>\webapps\hello").
  2. Dentro de "hello", crea un sub-directorio "WEB-INF" (sensible a mayúsculas, con un guion y NO un guion bajo) (por ejemplo, "<TOMCAT_HOME>\webapps\hello\WEB-INF").
  3. Dentro de "WEB-INF", crea un sub-directorio "classes" (sensible a mayúsculas) (por ejemplo, "<TOMCAT_HOME>\webapps\hello\WEB-INF\classes").
Tendrás que colocar tus recursos web (por ejemplo., HTMLs, CSSs, imágenes, scripts, servlets, JSPs) en el directorio correcto.
  • "hello": Debes poner todos los ficheros HTML y recursos, visibles para todos los usuarios web (por ejemplo, CSSs, images, scripts, JSPs) dentro de este directorio base.
  • "hello\WEB-INF": Este directorio, aunque se encuentre dentro del raíz, no es visible para los usuarios de la web. Aquí es donde se encuentra el fichero "web.xml".
  • "hello\WEB-INF\classes": Este directorio albergará todas las clases Java.
  • Debes reiniciar tu servidor Tomcat para comprobar que tu aplicación “hello” ha sido implementada correctamente.
Para acceder a tu aplicación "hello" teclea en el navegador:
http://localhost:9999/hello

Deberías poder ver el listado de directorios dentro de "<TOMCAT_HOME>\webapps\hello", el cual estará vacío  ya que se habilitó con anterioridad el listado de directorios en el archivo web.xml.

Paso 5(b) Escribir una página de bienvenida
Crea la siguiente página HTML y guárdala como "HelloHome.html" en el directorio "hello".
1
2
3
4
5
6
<html>
<head><title>Mi Página Web de inicio</title></head>
<body>
<h1>Mi Nombre es tal y cual y esta es mi página.</h1>
</body>
</html>

Puedes visitar esta página introduciendo en el navegador la siguiente dirección:
http://localhost:9999/hello/HelloHome.html
De forma alternativa, puedes entrar en el raíz de tu aplicación de esta forma:
http://localhost:9999/hello
El servidor devolverá el listado de directorios y archivos de tu directorio base. De esta forma podrás hacer clic sobre "HelloHome.html".
Renombra "HelloHome.html" a "index.html", e introduce lo siguiente en el navegador:
http://localhost:9999/hello
Ahora, el servidor te redireccionará automáticamente a "index.html" si el directorio raíz contiene un "index.html", en vez de ofrecerte un listado de archivos y directorios.
Puedes comprobar que tu página de inicio funcione correctamente accediendo desde otro ordenador a:
http://mipagina.esÓmidireccionIP:9999/hello
http://mipagina.esÓmidireccionIP:9999/hello/HelloHome.html
http://mipagina.esÓmidireccionIP:9999/hello/index.html
Puedes usar comandos como "ipconfig", "winipcfg", "ping" para averiguar tu dirección IP.

Los errores más probable son “Unable to Connect” (Incapaz de conectar), "Internet Explorer no puede mostrar la página web", y "404 Not Found". En estos casos lee la sección "Como depurar.

2.6 PASO 6: Escribe un "Hello-world" Java Servlet
Un servlet es un programa Java que corre dentro de un servidor HTTP preparado para Java, como Apache Tomcat. Un usuario invoca un servlet a través de una URL apropiada de un servidor web (o cliente HTTP).
Antes de continuar, se asume que estamos suficientemente familiarizados con Java y que tenemos instalado lo siguiente:
  1. JDK (Leer "Como instalar el JDK y empezar”).
  2. Un editor de texto adecuado para insertar código como Notepad++ (Leer "Editores de Texto para programadores”); o bien un IDE (Entorno de desarrollo integrado como Eclipse o NetBeans).
Paso 6(a) Instalar la librería API de Servlet
Antes de poder escribir nuestro primer servlet, necesitamos instalar el API de Servlet que no toma parte del JDK (aunque pertenece a Java EE), Tomcat también incluye una copia de este API.
COPIA el archivo JAR del API Servlet de Tomcat localizado en "<TOMCAT_HOME>\lib\servlet-api.jar", (por ejemplo, "d:\miproyecto\tomcat\lib\servlet-api.jar") dentro del directorio “ext” del JDK "<JAVA_HOME>\jre\lib\ext", (por ejemplo, "c:\program files\java\jdk1.7.0\jre\lib\ext").
(Para usuarios de Mac) COPIA el JAR ("servlet-api.jar") de "/Applications/tomcat/lib" al directorio “Extensión” del JDK "/Library/Java/Extension".
(Para usuarios avanzados sólo) Puedes incluir el archivo JAR en el CLASSPATH: o bien el directorio extensión del JDK.

Paso 6(b) Escribir un "Hello-world" Java Servlet
Un servlet de Java es un programa que corre dentro de un servidor HTTP. Un usuario invoca el servlet a través de una dirección URL en un navegador (o cliente HTTP).
En este ejemplo, vamos a escribir un servlet llamado HelloServlet, el cual dirá “Hello, World!”. Lo configuraremos de tal forma que los usuarios puedan acceder a este servlet a través de la URL http://hostname:port/hello/sayhello tal y como se ilustra a continuación:
Escribe el siguiente código fuente llamado "HelloServlet.java" y guárdalo dentro del directorio "classes" (por ejemplo, "<TOMCAT_HOME>\webapps\hello\WEB-INF\classes\HelloServlet.java"). Compila la fuente a "HelloServlet.class". Este servlet dice "Hello" y muestra información solicitada imprimiendo un número al azar por cada solicitud.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Para guarder como "<TOMCAT_HOME>\webapps\hello\WEB-INF\classes\HelloServlet.java"
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// Ajusta la respuesta del tipo MIME del mensaje de respuesta
response.setContentType("text/html");
// Asigna a una variable de tipo PrintWriter el mensaje de respuesta
PrintWriter out = response.getWriter();
// Escribe el mensaje de respuesta en una página HTML
try {
out.println("<html>");
out.println("<head><title>Hello, World</title></head>");
out.println("<body>");
out.println("<h1>Hello, world!</h1>"); // says Hello
// Muestra información solicitada por el cliente
out.println("<p>Request URI: " + request.getRequestURI() + "</p>");
out.println("<p>Protocol: " + request.getProtocol() + "</p>");
out.println("<p>PathInfo: " + request.getPathInfo() + "</p>");
out.println("<p>Remote Address: " + request.getRemoteAddr() + "</p>");
// Genera un número al azar por cada solicitud
out.println("<p>A Número al Azar: <strong>" + Math.random() + "</strong></p>");
out.println("</body></html>");
} finally {
out.close(); // Siempre cerrar el PrintWriter
}
}
}

Paso 6(c) Configurar la URL de llamada al Servlet en "webapps\hello\WEB-INF\web.xml"
El usuario invoca el servlet, el cual se encuentra en el servidor web, mediante una solicitud URL del navegador. Ahora configuraremos esta solicitud URL de nuestro HelloServlet.
Crea el siguiente fichero de configuración llamado "web.xml", y guárdalo dentro de "webapps\hello\WEB-INF" (por ejemplo, "<TOMCAT_HOME>\webapps\hello\WEB-INF\web.xml").

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!—Guardar como "hello\WEB-INF\web.xml" -->
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<!-- Nota: Todos los elementos <servlet> DEBEN ser agrupados y colocados
Dentro de la etiqueta <servlet-mapping> -->
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/sayhello</url-pattern>
</servlet-mapping>
</web-app>

En la configuración de arriba, un servlet que tiene un fichero class "HelloServlet.class" es mapeado para solicitudes URL como "/sayhello" (a través de servlet-name "HelloWorld"), dentro de la aplicación web "hello". En otras palabras, la URL completa para llamar a este servlet sería: "http://hostname:port/hello/sayhello".
Este fichero de configuración, guardado dentro de tu aplicación "hello", es sólo aplicable a esta aplicación "hello" en particular.
Reinicia tu servidor Tomcat.
IMPORTANTE: Para CADA servlet tendrás que escribir el par de <servlet> y <servlet-mapping> con un <servlet-name> en común. Ten en cuenta que todos los elementos <servlet> DEBEN estar agrupados juntos y colocados dentro de la etiqueta <servlet-mapping> del fichero de configuración.
Paso 6(d) Invocar el Servlet
Para ejecutar este servlet, incia una ventana de tu navegador, e introduce la siguiente URL:
http://localhost:9999/hello/sayhello
Verás la salida del servlet mostrado en tu navegador.
Refresca el navegador (CTRL+F5), se mostrará otro número al azar así como cada vez que refresques tu navegador. En otras palabras el método doGet() del servlet se ejecuta una vez por cada solicitud.
Intenta ver el “código fuente” de la salida mostrada en el navegador del usuario. Ten en cuenta que los usuarios solo reciben la salida del servlet (generado a través de las sentencias out.println()). Por lo que los usuarios no tendrán acceso al servlet en sí, el cual podría contener información confidencial.

<html>
<head><title>Hello, World</title></head>
<body>
<h1>Hello, world!</h1>
<p>Request URI: /hello/sayhello</p>
<p>Protocol: HTTP/1.1</p>
<p>PathInfo: null</p>
<p>Remote Address: 127.0.0.1</p>
<p>A Random Number: <strong>0.3523682325749493</strong></p>
</body>
</html>

2.7 PASO 7: Escribir una base de datos Servlet
Esta sección asume que estás suficientemente familiarizado en programación Java con base de datos y MySQL.

Paso 7(a) Configurar una Base de datos en MySQL
Arranca tu servidor MySQL. Comprueba el puerto. Asumiremos que el servidor está corriendo en el Puerto 8888 (mientras que Tomcat lo hace por el puerto 9999).
// Para Windows
> d:
> cd \myproject\mysql\bin
> mysqld --console
// Para Mac
$ cd /usr/local/mysql/bin
$ sudo ./mysqld_safe --console
Arranca un cliente MySQL. Se asume que hay un usuario llamado “miusuario” y con password "xxxx".
// Para Windows
> d:
> cd \myproject\mysql\bin
> mysql -u miusuario -p
// Para Mac
$ cd /usr/local/mysql/bin
$ ./mysql -u miusuario -p

Ahora ejecuta las siguiente sentencias SQL para crear una base de datos llamada "tiendaebook", con una tabla llamada "libros" con 5 columnas: id, titulo, autor, precio, cantidad.

create database if not exists tiendaebook;

use tiendaebook;

drop table if exists libros;
create table libros (
id int,
titulo varchar(50),
autor varchar(50),
precio float,
cantidad int,
primary key (id));

insert into libros values (1001, 'Steve Jobs, la biografia', 'Walter Issacson', 9.95, 10);
insert into libros values (1002, 'Curso básico de informatica', 'Hobby Press', 5.95, 20);
insert into libros values (1003, 'El Gran libro de Android', 'Jesús Tomas Girones', 25.80, 25);
insert into libros values (1004, 'Windows 7: Informática para torpes', 'Vicente Trigo', 24.95, 15);
insert into libros values (1005, 'Microsoft Office 2010, todo práctica', 'Rosario Peña', 30.50, 8);

select * from libros;


Paso 7(b) Instala el Driver MySQL JDBC
Tendrás que descargar el driver MySQL JDBC si aún no lo has hecho.
(Para usuarios avanzados sólo) Podrías colocar el archive JAR correspondiente al driver de MySQL "mysql-connector-java-5.1.{xx}-bin.jar" en el directorio "lib" de Tomcat.

Paso 7(c) Escribe un formulario HTML por el lado del Cliente
Vamos a escribir un script HTML para crear un “query form” o formulario de consulta con 3 checkboxes y un botón de enviar, tal y como se muestra abajo. Guarda el fichero HTML como “querylibro.html” en el directorio raíz de tu aplicación “<TOMCAT_HOME>\webapps\hello”.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<head>
<title>Otra librería</title>
</head>
<body>
<h2>Aún otra librería</h2>
<form method="get" action="http://localhost:9999/hello/query">
<b>Elige un autor:</b>
<input type="checkbox" name="autor" value="Walter Issacson">Walter Issacson
<input type="checkbox" name="autor" value="Vicente Trigo">Vicente Trigo
<input type="checkbox" name="autor" value="Rosario Peña">Rosario Peña
<input type="submit" value="Buscar">
</form>
</body>
</html>

Puedes visitar la página que acabamos de crear en la siguiente URL:
http://localhost:9999/hello/querylibro.html
Activa una de las cajas (Por ejemplo, "Rosario Peña”) y haz clic en Buscar. Una solicitud GET de HTTP será enviada a la dirección URL especificada en la etiqueta <form> dentro del atributo "action". Observe la URL de la llamada:
http://localhost:9999/hello/query?autor=Rosario+Peña
La solicitud consiste en dos partes: una URL correspondiente a "action" que es el atributo de la etiqueta <form>, y la pareja "name=value" extraídos de la etiqueta <input>, separados por un signo de interrogación '?'. Tenga en cuenta que los espacios en blancos son reemplazados por el '+' (o bien por %20), ya que los mismos no están permitidos en las URL.
Si activas dos opciones (Por ejemplo, “Rosario Peña” y “Vicente Trigo”), obtendrás la siguiente URL en la que las dos parejas de "name=value" vendrán separadas por un '&'.
http://localhost:9999/hello/query?autor=Rosario+Peña&autor=Vicente+Trigo
A esta altura y sin escribir aún el programa por el lado del servidor, nos aparecerá el mensaje"404 Fichero No Encontrado".

Paso 7(d) Escribe el Servlet que hará las Queries a la Base de datos
El siguiente paso es escribir el programa por el lado del servidor, el cual responde a la solicitud del cliente enviando solicitudes y recibiendo respuestas por parte de la base de datos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Para guarder como "<TOMCAT_HOME>\webapps\hello\WEB-INF\classes\QueryServlet.java".
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class QueryServlet extends HttpServlet { // JDK 6 y superior sólo
// El método doGet() se ejecutará una vez por solicitud a este servlet.
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Ajustar el tipo MIME para el mensaje de respuesta
response.setContentType("text/html");
// Asigna a una variable de tipo PrintWriter el mensaje de respuesta
PrintWriter out = response.getWriter();
Connection conn = null;
Statement stmt = null;
try {
// Paso 1: Asignar un objeto de conexión a la base de datos
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:8888/ebookshop", "miusurio", "xxxx"); // <== Comprobar!
// URL de la base de datos(hostname, puerto, base de datos por defecto), nombreusuario, password
// Paso 2: Asignar un objeto Statement con la conexión
stmt = conn.createStatement();
// Paso 3: Construye la SELECT SQL
String sqlStr = "select * from libros where autor = "
+ "'" + request.getParameter("autor") + "'"
+ " and cantidad > 0 order by precio desc";
// Imprime una página HTML como salida de la consulta
out.println("<html><head><title>Respuesta a la Consulta</title></head><body>");
out.println("<h3>Gracias por su query.</h3>");
out.println("<p>Su consulta es: " + sqlStr + "</p>"); // Imprimir para depuración
ResultSet rset = stmt.executeQuery(sqlStr); // Enviar la query al servidor
// Paso 4: Procesar el ResultSet
int count = 0;
while(rset.next()) {
// Mostrar por pantalla un párrafo <p>...</p> por cada registro
out.println("<p>" + rset.getString("autor")
+ ", " + rset.getString("título")
+ ", $" + rset.getDouble("precio") + "</p>");
count++;
}
out.println("<p>==== " + count + " registros encontrados =====</p>");
out.println("</body></html>");
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
out.close(); // Siempre cerrar el PrintWriter
try {
// Paso 5: Cerrar el resto de recursos, Statement y la Conexión (Connection)
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}

Paso 7(e) Configura la URL de solicitud para el Servlet
Abre el fichero de configuración "web.xml" de tu aplicación "hello" que ya habíamos creado con anterioridad para el HelloServlet, "<TOMCAT_HOME>\webapps\hello\WEB-INF\web.xml". Añádele las siguientes líneas que se muestran en rojo en la ubicación correcta.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!—Para guardar como "hello\WEB-INF\web.xml" -->
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>UserQuery</servlet-name>
<servlet-class>QueryServlet</servlet-class>
</servlet>
<!-- Nota: Todos los elementos <servlet> DEBEN estar agrupados juntos y
colocados dentro de la etiqueta <servlet-mapping> -->
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/sayhello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>UserQuery</servlet-name>
<url-pattern>/query</url-pattern>
</servlet-mapping>
</web-app>

Las líneas de encima configuran la siguiente URL para invocar al QueryServlet:
http://localhost:9999/hello/query

Paso 7(f) Invoca el Servlet desde el formulario por el lado del Cliente
Introduce la siguiente URL en el navegador para ver el formulario creado en "querylibro.html":
http://localhost:9999/hello/querylibro.html
Selecciona un autor (Por ejemplo, "Walter Issacson ") y haz clic en el botón Buscar, lo cual activará el siguiente código en el atributo "action" del <form> junto con la pareja de name=value:
http://localhost:9999/hello/query?autor=Walter+Issacson
Esta URL "/query" dispara el QueryServlet. El QueryServlet recupera el par name=value de "autor=Walter+Issacson". Dentro del QueryServlet, el método request.getParameter("autor") retorna "Walter Issacson", el cual es insertado en la SELECT que se le enviará a la base de datos. El resultado devuelto de la consulta será escrito en la pantalla del cliente como un documento HTML.

3. Como Depurar
"Todo lo que pueda ir mal irá mal.”. Lo más importante que hay que hacer es encontrar el MENSAJE DE ERROR!!!

Siempre...
  1. Refresca tu navegador usando CTRL+F5 (en vez de hacerlo solo con F5) para conseguir una nueva copia en vez de una la cache.
  2. Podrías reiniciar el servidor Tomcat y también el navegador para limpiar la cache.
  3. Comprueba tu ortografía! Asuma siempre que todo los programas son sensibles a mayúsculas, copie y pegue siempre que pueda!.
  4. Y lo MÁS IMPORTANTE – Encuentre el MENSAJE DE ERROR!!!
    1. Compruebe los Mensajes de Error de la consola de Tomcat.
    2. Muchos de los errores pueden ocupar varias pantallas de la consola, por lo que tendrás que hacer scroll hacia arriba lentamente hasta encontrar la PRIMERA LÍNEA del mensaje de error.
    3. Comprueba los ficheros log, localizados en "<TOMCAT_HOME>\logs". Los "catalina.yyyy-mm-dd.log" muestran los mensajes de inicio de Tomcat. También comprueba los "localhost.yyyy-mm-dd.log".

Si todo funcionaba correctamente hace un rato, pregúntate a ti mismo “¿Qué demonios he cambiado?”.
No puedo iniciar Tomcat – La consola de Tomcat aparece y se cierra

  1. Intenta ejecutar el script "configtest.bat" (para Windows) o "./configtest.sh" (para Mac/Linux) para testear los ficheros de configuración.
  2. Verifica los ficheros de los registros de Tomcat en busca de errores. Los ficheros de los registros están localizados en "<TOMCAT_HOME>\logs". Los "catalina.{yyyy-mm-dd}.log" muestran los mensajes de arranque del servidor. Comprueba también los "localhost.{yyyy-mm-dd}.log".
  3. Si el mensaje de error indica que otra instancia de Tomcat está ya ejecutándose (java.net.BindException: Address already in use: JVM_Bind), finalice el proceso de Tomcat tal y como se muestra más abajo.
  4. Si el mensaje de error indica que otra aplicación ya está usando el mismo puerto que Tomcat, entonces tendrás que cambiar el puerto de Tomcat en el archivo server.xml. Puedes introducir el comando "netstat -an" para comprobar el estado de todos los puertos.

Localizando y Finalizando el proceso de Tomcat
  • En Windows, CTRL+ALT+SUPR, para iniciar el “Administrador de Tareas”, Tomcat deberá aparecer como un proceso llamado “java.exe". Finaliza el proceso.
  • En Linux/Mac, tendrás que teclear "ps -ef | grep tomcat" para localizar el proceso. Ahora anota el identificador del proceso (pid) y elimínelo a través de "kill -9 pid".
(Firefox), (IE), (Chrome) y (Safari) No se puede conectar
Causa: Definitivamente no estás conectado a Tomcat.
Solución:
  1. Comprueba que tu servidor Tomcat ha sido arrancado.
  2. Verifica que el hostname y el número del puerto están bien escritos y separados por dos puntos ':'. (http://localhost:9999/...).
Error 404 Fichero No Encontrado (File Not Found)
Causa: Estás conectado a Tomcat pero el servidor no puede encontrar el archivo HTML o el Servlet que has solicitado.
Solución:
  1. Revisa tu ortografía, comprueba las mayúsculas y minúsculas!
  2. Para HTML un archivo con URL http://localhost:9999/xxxx/filename.html:
    1. Abrir  el directorio de Tomcat  "webapps"  y comprueba si el sub-directorio  "xxxx" existe. Recordar que es sensible a mayúscula y minúscula.
    2. Abrir el directorio "xxxx" y comprobar si el fichero  "filename.html" existe.
  3. Para Servlet con URL http://localhost:9999/xxxx/servletURL:
    1. Mira la consola buscando un mensaje de error. Tu aplicación no podrá ser desplegada si cometes un error a la hora de editar el fichero "web.xml", lo cual podría lanzar un buen puñado de errores.
    2. Comprueba la consola de Tomcat   para asegurarte que tu aplicación ha sido desplegada.
    3. Abre el directorio de  Tomcat "webapps" y comprueba que el sub-directorio "xxxx" existe.
    4. Abre  el directorio "xxxx", mira si el sub-sub-directorio  "WEB-INF" (en mayúsculas y con un guión) existe.
    5. Abre  "WEB-INF" y comprueba si el sub-sub-sub-directorio "classes" (en minúsculas) existe.
    6. Abre el fichero de configuración "WEB-INF\web.xml":
      1. Mira que el servletURL esté definido en la etiqueta <servlet-mapping>. Toma nota del nombre en la etiqueta <servlet-name>.
      2. Basado en el nombre anotado, busca la etiqueta <servlet-class>  correspondiente. Ahora toma nota de el ServletClassname.
      3. Abre "WEB-INF\classes", comprueba si el "ServletClassname.class" que anotaste existe. (Nota: es ".class", y NO ".java". Hace falta compilar el fichero ".java" para conseguir el ".class".)


Error 500 Internal Server Error

El Error 500 debería haber provocado muchos mensaje de error en la consola de Tomcat. Vaya a la consola de Tomcat, busque el mensaje de error. El mensaje de error se extiende por decenas de líneas. Hace falta desplazarse hacia arriba lentamente para buscar la primera línea del mensaje de error. Éste debería decirle la causa, por ejemplo, Error de sintaxis SQL, nombre de usuario y/o contraseña erróneos, etc...



REFERENCIAS & RECURSOS
  1. Web Oficial de Apache Tomcat  @ http://tomcat.apache.org.
  2. La documentación de Apache Tomcat  @ "<TOMCAT_HOME>\webapps\docs".
  3. Jason Brittain, Ian F. Darwin, "Tomcat The Definitive Guide", 2nd eds, OReilly, 2007.



        Este documento es una traducción integra de uno de los fantásticos tutoriales ofrecidos de forma gratuita por la universidad tecnológica de Nanyang, en este caso englobado dentro del apartado Programación del lado del servidor:
        http://www3.ntu.edu.sg/home/ehchua/programming/index.html#WebApp

        Si encontraran un error, por favor hagan un comentario para modificarlo, gracias.

        No hay comentarios:

        Publicar un comentario