Práctica
3: Productor/Consumidor CORBA bajo Web
MODULO 2: Programación Servlet
1.
Descargar J2SE (plataforma Java)
Acceda a la
siguiente dirección
http://java.sun.com/j2se/
Descargue la
ultima versión
de J2SE. Aparecerá algún botón o enlace que diga
"J2SE
Downloads"
Por ejemplo, en el momento
que se redacta este documento la ultima versión es: J2SE 1.4.1
Seleccionar la versión
SDK para plataforma Linux (es un RPM)
Acepte la LICENCIA pulsando
el botón ACCEPT que hay al finao el botón ACCEPT que hay
al final de la página.
Pinche sobre la linea Download
para descargar>Pinche sobre la linea Download para descargar la
versión
(Download j2sdk-1_4_1_02-linux-i586-rpm.bin)
Es buena costumbre descargar
los programas en /tmp
Una vez el archivo en disco,
el ejecutable es un ".bin" que encierra un ".rpm". Para ejecutarlo
primer
debe cambiar los permisos de ejecución del archivo. Asigne
permisos
de ejecución para los tres niveles (usuario, grupo y otros).
Esto
se puede hacer desde una ventana de archivos, y pulsando el
botón
derecho sobre el archivo; luego en la ventana que aparece, seleccionar
la ficha Permisos.
Cuando haya cambiado los
permisos, situese (desde una ventana de consola) en el directorio donde
ha descargado el archivo (en /tmp).
Desde el directorio escriba
./j2sdk-1_4_1_02-linux-i586-rpm.bin
Esto ultimo
debería
empezar a descomprimir el archivo parapezar a descomprimir el archivo
para
generar el RPM (utilice la barra espaciadora para pasar las pantallas
que
le irán apareciendo, y al final conteste Y a la pregunta que se
le hace)
Como se ha dicho, esto debería
generar el archivo j2sdk-1_4_1_02-linux-i586-rpm en el mismo directorio
Ahora vamos a instalar Java.
Para ello, desde la ventana de archivo, pinche sobre el archivo RPM.
Esto
debería invocar a un programa que instala solo el programa Java.
Compruebe que la instalación
se hace en /usr/java, generando dentro de este, otro directorio con la
versión instalada (en nuestro caso se genera
/usr/java/j2sdk1.4.1_02)
Ahora para que se reconozca
la ruta de Java, hay que activar la variable de entorno que controla
Java.
Esto se hace con la variable JAVA_HOME. Para ello, desde una consola de
Linux, ponga
JAVA_HOME=/usr/java/j2sdk1.4.1_02/
y luego escriba
export
JAVA_HOME
esto hace que
se reconozca
el compilador de Java. Si aun asi no reconoce Java, intente activarlo
tambien
con el PATH:
PATH=/usr/java/j2sdk1.4.1_02/bin/:$PATH
y luego escriba
export PATH
ATENCION: NO
CIERRE LA CONSOLA
DE LINUX!!
2.
Descargar TOMCAT:
Acceda a la siguiente dirección:
http://jakarta.apache.org/builds/jakarta-tomcat/
Seleccione el
directorio
de la ultima versión. Por ejemplo, cuando se hizo este documento
era:
http://jakarta.apache.org/builds/jakarta-tomcat/nightly-5/
y luego la mas
reciente.
En nuestro caso:
http://jakarta.apache.org/builds/jakarta-tomcat/nightly-5/30-Jan-2003/
Luego descargue
el archivo
correspondiente (almacénelo en el /tmp):
jakarta-tomcat-5.0.tar.gz
Descomprima el
archivo. Esto
debería generar un directorio dentro del actual. En nuestro caso:
/tmp/jakarta-tomcat-5.0.1
Almacene el
directorio jakarta-tomcat-5.0.1
en el directorio /usr/local/. Este directorio es donde
normalmente
se almacenan los programas en Linux, similar a "Archivos de programas"
de Windows.
Active TOMCAT. Esto se puede hacer de dos
formas, o con la opcion startup.sh o con la opción catalina.sh.
En ambos casos se activa un servidor de recursos web.
En ambos casos,
desde la misma consola donde ha activado el JAVA_HOME, escriba:
/usr/local/jakarta-tomcat-5.0.1/bin/startup.sh
o escriba (opción recomendada):
/usr/local/jakarta-tomcat-5.0.1/bin/catalina.sh
Se
debería iniciar
TOMCAT. Luego, ya puede abrir una navegador (Netscape o Mozilla) y usar
la dirección:
http://labxxx.ual.es:8080/
xxx = es el
numero del PC
donde esté trabajando. 8080 = es el puerto donde se activan las
Servlets
Acceda a los
ejemplos JSP
y Servlets e investigue su funcionamiento.
Tambien puede utilizar la direccion
localhost para las pruebas iniciales, en la forma:
http://localhost:8080/
Por omision, el
puerto es
el 8080. Si desea cambiar el puerto de entrada, esto se puede hacer
editando
el archivo: web.xml
Para parar
tomcat se hace
asi:
/tmp/jakarta-tomcat-5.0.1/bin/shutdown.sh
para la opcion startup,
o pulsando CONTROL + C si ha
activado el servidor con catalina.
NOTA
IMPORTANTE:
Cuando active o desactive Tomcat por la via startup/shutdown puede que en
ocasiones permanezca activo un proceso java
que impida la ejecución http://...:8080
desde Mozilla. Si este es el caso, debería comprobar si el
proceso java está
activo, y luego eliminarlo desde una consola (usando ps y luego kill -9), si es el caso.
Ejercicio:
Con el servidor de tomcat activo, acceda a la pagina
inicial con localhost:8080 e investigue los ejemplos de servlet y jsp
que trae la libreria.
3.
Activar una Servlet mia:
Activar
una servlet no es demasiado complejo. Se puede hacer de dos formas, una
mediante una ventana HTML para el administrador o el gestor de Tomcat,
y otra creando directamente los directorios necesarios para este fin.
En
nuestro caso lo vamos a realizar de la segunda forma.
Los
servlets se crean en el directorio $TOMCAT/webapps, siendo $TOMCAT la
ruta
donde está almacenado el Jakarta Tomcat. Por ejemplo, en el
momento
que se hizo esta prueba, el directorio general de servlets era:
/usr/local/jakarta-tomcat-5.0.1/webapps
Dentro
de este directorio se pueden crear tantas Servlets y HTML como
queremos.
Lo normal es que para cada proyecto generemos un directorio, dentro de
este. Por ejemplo, si vamos a implementar un conjunto de Servlet
relacionadas
con temas de contabilidad (dentro de un Sistema que estamos
desarollando),
podriamos crear un directorio que se llame contabilidad, y
dentro
de este habra que definir otra estructura de directorios, que veremos a
continuacion. Para generalizar, supongamos un direcotio llamado miproyecto.
/usr/local/jakarta-tomcat-5.0.1/webapps/miproyecto/
Las
páginas HTML pueden ir directamente en este directorio (la
página
principal generalmente llamada index.html), y las clases de servlet se
almacenan en un directorio llamado WEB-INF, y a su vez, dentro
de
este, en el directoriorectamente en este directorio (la página
principal
generalmente llamada index.html), y las clases de servlet se almacenan
en un directorio llamado WEB-INF, y a su vez, dentro de este,
en
el directorio classes.
+--
miproyecto +-- WEB-INF +-- classes +-- *.class
+-- *.html
Los
fuentes (.java) se pueden guardar donde uno quiera, lo que importa es
que
las clases compiladas esten en el directorio classes.
Para
registrar una servlet es necesario hacerse en un archivo llamado web.xml
que debe estar en el directorio WEB-INF. El contenido de este
archivo
almacena un registro XML para cada servlet almacenda dentro del
directorio classes. Lo que se muestra a continuación es
un
ejemplo del
contenido del archivo web.xml.
<?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>Servlet 2.4
Examples</display-name>
<description>
Servlet 2.4 Examples.
</description>
<servlet>
<servlet-name>contacto</servlet-name>
<servlet-class>contacto</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>contacto</servlet-name>
<url-pattern>/servlet/contacto</url-pattern>
</servlet-mapping>
</web-app>
|
Figura
1. Contenido de web.xml
En
el ejemplo de la figura anterior hay una sola servlet registrada
que se llama contacto. Fijese que para registrar una servlet
hay
que crear dos registros: uno con la etiqueta <servlet> ...
</servlet>
y otro con la etiquetas <servlet-mapping> ...
</servlet-mapping>.
Por cada servlet nueva hay que crear estos dos registros. Dentro de la
servlet, se debe especificar el nombre de la servlet y el nombre de la
clase que contiene la servlet. Generalmente son el mismo nombre (aunque
puede ser diferente).
No
es necesario nada mas. En resumen:
- el directorio de proyecto deberá tener un
directorio WEB-INF
y los archivos HTML.
- dentro del directorio WEB-INF
deberá contener dos cosas:
el directorio classes y archivo web.xml con las servlet
en
XML. registradas.
- dentro del directorio classes se deberán
almacenar los archivos .class.
Para
llamar a una clase que hay dentro de mi proyecto hay que tener un
especial
cuidado, porque fijese como se hace:
http://labxxx.ual.es:8080/miproyecto/servlet/miPrograma
Esto
debería llamar a una Servlet (una clase) que se llama miPrograma,
y que físicamente se encontraría en la ruta de disco:
/usr/local/jakarta-tomcat-5.0.1/webapps/miproyecto/WEB-INF/classes/
Si
mi servlet debe ser llamada desde una página web, usando por
ejemplo
un boton, esta página web la podríamos guardar en el
directorio
miproyecto. Si es la página principal, deberíamos
llamarla
index.html, y en la llamada solo deberíamos poner:
http://labxxx.ual.es:8080/miproyecto/
Si
debemos usar otra página, solo podemos el nombre de la misma:
http://labxxx.ual.es:8080/miproyecto/miPagina.html
En
cualquier caso, estos dos páginas HTML (y todas las demas), se
almecenan,
como se ha dicho, en:
/usr/local/jakarta-tomcat-5.0.1/webapps/miproyecto/
IMPORTANTE:
Atención,
cada vez que modifiquemos una servlet, incluyamos una nueva, o se
altere
los directorios comentados anteriormente, es necesario desactivar
TOMCAT y luego
volver
a activarlo para que los cambios tengan efecto.
Si el servidor Tomcat está activo con startup.sh el proceso se para con shutdown.sh. Es
recomendable que cierre Mozilla ANTES
de activar de nuevo TOMCAT mediante startup.sh.
Si ha seguido esta opcion y no consigue entrar luego con http://...:8080/ compruebe si
existe algun proceso java
activo. Esto se puede hacer desde una consola mediante la orden ps. Aparecerá una lista de
procesos activos. Si aparece un proceso java, finalice su
ejecución. La parada (eliminación) se puede hacer
mediante una orden kill, por
ejemplo kill -9 numero.
Si la activación de Tomcat se ha
relizado con Catalina (catalina.sh)
solo hay que parar la ejecución del servidor desde la consola,
pulsando CONTROL + C, y luego volverlo a activar con catalina.sh. Para esta opción
no es necesario cerrar antes Mozilla, puede permanecer abierto.
Por tanto los pasos serían (opcion startup/shutdown):
1. Hacer las modificaciones,
y luego para que tengan efecto (o para probarlas)
2. Desactivar Tomcat
3. Cerrar Netscape (en caso
de estar abierto)
4. Activar de nuevo Tomcat
para que lea el nuevo estado de Servlets.
5. Abrir Netscape llamando
a la aplicacion que queremos probar.
Opcion Catalina (catalina.sh):
1. Hacer las modificaciones,
y luego para que tengan efecto (o para probarlas)
2. Desactivar Catalina (Control + C).
3. Activar de nuevo
Catalina (catalina.sh)
para que lea el nuevo estado de Servlets.
4. Compilar una Servlet
Para
compilar una servlet es necesario activar la variable de entorno
CLASSPATH para que contenga la libreria para programar con Servlet.
Dentro
del Tomcat que hemos instalado ya hay una libreria que se llama servlet-api.jar
y que se encuentra en: /usr/local/jakarta-tomcat-5.0.1/common/lib/common/lib/
Por
tanto, para que esta variable tenga efecto, desde la consola hay
que introducir:
CLASSPATH=/usr/local/jakarta-tomcat-5.0.1/common/lib/servlet-api.jar:$CLASSPATH
y
luego
export
CLASSPATH
Luego,
para compilar el fuente (.java) solo hay que compilarlo de forma
normal:
javac
miPrograma.java
A
continuación se muestra un ejemplo de Servlet:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;
public class contacto extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse
response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter out =
response.getWriter();
out.println("GET Request. No FORM
Data Posted");
}
public void doPost (HttpServletRequest request,
HttpServletResponse response)
throws
IOException, ServletException {
Enumeration
elements = request.getParameterNames();
String
name1 = (String)elements.nextElement(); /** Email */
String
value_name1 = request.getParameter(name1);
String
name2 = (String)elements.nextElement(); /** Valor de elemento */
String
value_name2 = request.getParameter(name2);
/** Se
genera la salida HTML para mostrar en el cliente */
response.setContentType("text/html");
PrintWriter
out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Sistemas
de Informacion Distribuidos</title>");
out.println("</head>");
out.println("<body>");
out.println("<br>La
dirección "+value_name2+" ha almacenado un
elemento.");
out.println("</body></html>");
}
}
|
Figura
2. Una sencilla servlet
Toda
servlet tiene dos métodos: doGet y doPost.
La servlet debe extender la clase HttpServlet. Casi toda la
funcionalidad
se realiza en el método doPost. Este metodo utiliza dos
parametros:
una para la entrada a la servlet y otra para generar salidas. En este
ejemplo,
la salida (response) es una página HTML creada en el
código.
NOTA:
En la página principal
de Tomcat (a nivel local, http://labxxx.ual.es:8080/) dispone de una
ayuda
sobre la API Servlet, muy util para cuando tenga que programar con
Servlet.
No dude en consultar estas páginas web.
5.
EJERCICIO:
Observe
en los ejemplos de
Tomcat el codigo fuente de una Servlet cómo se genera una
página
HTML de respuesta en la llamada.
Observe
cómo se usa
el POST y GET de una página HTML y cómo se hace esto en
una
Servlet.
Una
vez que lo haya analizado,
intente crear una simple Servlet que responda ante una llamada de la
página
HTML del productor/consumidor. En la respuesta ponga lo que quiera
(luego
lo cambiaremos).
No
olvide consultar también
la página web del laboratorio, donde se ofrece informacion
más
detallada sobre el ejercicio del PRODUCTOR/CONSUMIDOR.
LSID,
Laboratorio
de Sistemas de Información Distribuidos
Departamento
de Informática
Universidad
de Almeria, España
Luis.Iribarne@ual.es