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:
- Servidor HTTP: Por ejemplo: Apache HTTP Server, Apache Tomcat HTTP Server, Microsoft IIS, etc...
- Cliente HTTP (o Navegador Web): Por ejemplo: Internet Explorer, FireFox, Chrome, etc...
- 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.
- Programa Cliente: pueden ser escritos en HTML Form, JavaScript, VBScript, Flash, etc...
- Programa Servidor: pueden ser escritos en Java Servlet/JSP, ASP, PHP, CGI, etc...
El
procedimiento es:
- El usuario, vía un navegador, introduce una dirección URL a un servidor HTTP para arrancar una aplicación web.
- Un programa por el lado del cliente (como un formulario HTML) es cargado en el navegador del cliente.
- El usuario realiza la consulta “query criteria” mediante un formulario que nos permite definir consultas con un estilo orientado a objetos.
- El programa por el lado del cliente envía los parámetros de la query al programa por el lado del servidor.
- El programa por el lado del servidor consulta la base de datos y devuelve el resultado al cliente.
- 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:
- Tomcat 3.x (1999): RI para Servlet 2.2, JSP 1.1
- Tomcat 4.x (2001): RI para Servlet 2.3, JSP 1.2
- Tomcat 5.x (2002): RI para Servlet 2.4, JSP 2.0
- Tomcat 6.x (2006): RI para Servlet 2.5, JSP 2.1
- 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.
- 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".
- 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.
- 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.
- 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.
- 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.
- 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".
(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:
- server.xml
- web.xml
- context.xml
- 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: Lee
“Como
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:
- Presionando control-C en la consola de Tomcat, o
- 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).
- Dentro de "webapps", crea el raiz de tu aplicación "hello" (por ejemplo., "<TOMCAT_HOME>\webapps\hello").
- 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").
- 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:
- JDK (Leer "Como instalar el JDK y empezar”).
- 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...
- Refresca tu navegador usando CTRL+F5 (en vez de hacerlo solo con F5) para conseguir una nueva copia en vez de una la cache.
- Podrías reiniciar el servidor Tomcat y también el navegador para limpiar la cache.
- Comprueba tu ortografía! Asuma siempre que todo los programas son sensibles a mayúsculas, copie y pegue siempre que pueda!.
- Y lo MÁS IMPORTANTE – Encuentre el MENSAJE DE ERROR!!!
- Compruebe los Mensajes de Error de la consola de Tomcat.
- 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.
- 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".
No
puedo iniciar Tomcat – La consola de Tomcat aparece y se cierra
- Intenta ejecutar el script "configtest.bat" (para Windows) o "./configtest.sh" (para Mac/Linux) para testear los ficheros de configuración.
- 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".
- 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.
- 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:
- Comprueba que tu servidor Tomcat ha sido arrancado.
- 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:
- Revisa tu ortografía, comprueba las mayúsculas y minúsculas!
- Para HTML un archivo con URL http://localhost:9999/xxxx/filename.html:
- Abrir el directorio de Tomcat "webapps" y comprueba si el sub-directorio "xxxx" existe. Recordar que es sensible a mayúscula y minúscula.
- Abrir el directorio "xxxx" y comprobar si el fichero "filename.html" existe.
- Para Servlet con URL http://localhost:9999/xxxx/servletURL:
- 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.
- Comprueba la consola de Tomcat para asegurarte que tu aplicación ha sido desplegada.
- Abre el directorio de Tomcat "webapps" y comprueba que el sub-directorio "xxxx" existe.
- Abre el directorio "xxxx", mira si el sub-sub-directorio "WEB-INF" (en mayúsculas y con un guión) existe.
- Abre "WEB-INF" y comprueba si el sub-sub-sub-directorio "classes" (en minúsculas) existe.
- Abre el fichero de configuración "WEB-INF\web.xml":
- Mira que el servletURL esté definido en la etiqueta <servlet-mapping>. Toma nota del nombre en la etiqueta <servlet-name>.
- Basado en el nombre anotado, busca la etiqueta <servlet-class> correspondiente. Ahora toma nota de el ServletClassname.
- 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
- La documentación de Apache Tomcat @ "<TOMCAT_HOME>\webapps\docs".
- 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.
Si encontraran un error, por favor hagan un comentario para modificarlo, gracias.
No hay comentarios:
Publicar un comentario