You are on page 1of 4

CURSOS

Taller de Java
COMO CONTINUACIN DEL SERVIDOR
WEB DEL MES PASADO, DAVID
GRIFFITHS LE MUESTRA CMO
AADIR UN TABLN DE MENSAJES.
uando se piensa en Java, se piensa en applets.
Los dos van juntos como Don Quijote y Sancho Panza. Pero los applets slo son una parte de to da la historia. Java se ha creado para la red, y esto
significa toda la red en su conjunto, no slo el pe queo lugar donde residen los navegadores.
Cuando Java se ejecuta en un servidor, normalmente lo hace en forma de servlet. Seguramente, los habr
utilizado muchas veces en el Web sin darse cuenta.
Estn detrs de los libros de invitados, los motores
de bsqueda, los grficos animados, la creacin de
flujos de vdeo, etc. Lo ms importante de los servlets es que se ejecutan totalmente en el servidor.
No se bajan al navegador y, por lo tanto, ni siquiera
es necesario tener Java en el navegador para utilizarlos.
Por el contrario, se alojan en el servidor y producen
pginas HTML y grficos Web al vuelo. Dado que estn
escritos en Java, puede pasarse el mismo servlet des de una mquina servidora a otra sin tener que re compilarlo y, en consecuencia, los servlets poseen un
nmero ingente de usos potenciales en Internet.
Los servlets habitualmente se conectan a Internet
utilizando un servidor Web, pero cul? El primer servidor Web que les dio soporte fue el propio servidor
Web de Java de JavaSoft, pero actualmente tambin
lo hacen otros muchos ms: Apache JServ, IBM Internet Connection Server y OReilly WebSite Pro fessional, entre muchos otros. Los servlets tambin
pueden conectarse a servidores Web sin soporte nativo de Java, mediante conectores de terceros co mo Jrun, de Live Software.
El aprendizaje de la API estndar de los servlets es
un poco complicado, pero los principios bsicos de
funcionamiento de los servlets son muy sencillos. Para comprender el funcionamiento de los servlets, ampliaremos el servidor Web que creamos el mes pa sado, de forma que soporte nuestra propia marca
de servlet, y despus crearemos un tabln de anuncios sencillo.
El taller se ha diseado de forma que pueda ser mo dificado para adaptarlo a sus necesidades. Es ms, se
recomienda hacerlo. Recuerde que la mejor forma de
aprender a codificar es ponerse a retocar el progra ma de otro.

Construya sus propios foros


de mensajes basados en
Web con el tutorial Java de
este mes.

El mes pasado creamos un servidor Web. Era uno


muy sencillo: haba una clase denominada Web Service que reciba en la red las peticiones proce dentes de los navegadores. Cuando reciba una, la
pasaba a una clase denominada Request, que bus caba el correspondiente archivo y lo enviaba al na vegador.
WebService.class y Request.class siguen estando
presentes en el proyecto de este mes, aunque se
ha modificado ligeramente Request de forma que,
adems de manejar peticiones de archivos, tambin
pueda ejecutar servlets. Cmo puede saber si en viar un archivo o ejecutar un servlet? Puede dedu cirlo del URL que se solicita. Por ejemplo,
http://127.0.0.1 :8080/servlets/Fred (donde 127.0.0.1
es la direccin Internet del PC). La serie /servlets
justo despus de la direccin Internet y el nmero
de puerto indican a Request.class que ejecute el
servlet denominado Fred.class. Otros servidores ms
complejos le darn ms flexibilidad sobre el mo mento y el lugar en que se deben ejecutar serv lets, pero con esto ser suficiente para nuestros
fines.
Request.class espera que todos los servlets a los que
llame sean subclases de la clase Servlet.class que
se incluye en el proyecto. Por ejemplo, esperar que
el cdigo fuente empiece as:
public class SimpleServlet
extends Servlet {
.
.
}

Septiembre 1999 PC Plus

227

CURSOS
La clase Servlet es anloga a la clase java.applet. Applet de la biblioteca principal de clases Java: nos ofrece varias funciones tiles para facilitar la escritura de
servlets.
Una vez el servidor Web ha creado una nueva instancia de nuestra clase servlet, llama a un mtodo denominado init() y despus a otro denominado run(). No
tenemos que implementar ninguno de estos dos mtodos: en la clase Servlet hay versiones por omisin.
Si compilamos la clase tal cual, iniciamos el servidor
Web (mediante java WebService ./ 8080) y, a continuacin, vamos a la direccin http://127.0. 0.1:8080/
servlets/SimpleServlet con un navegador Web, veremos
una pgina Web que dice Servlet: running.
Pero nosotros queremos un servlet que haga ms que
esto, por lo que escribiremos nuestro propio mtodo

run(). Si a SimpleServlet.java aadimos lo siguiente:


public void run() {
write(<html><head><title>
SimpleServlet</title></head>
<body>);
write(Hello I am a
<b>simple servlet</b>);
write(</body></html>);
}

lo recompilamos y reiniciamos el servidor Web, ahora http:// 127.0. 0.1:8080/ servlets/SimpleServlet


devolver el contenido de la sentencia write(...).
Write es el mtodo ms importante del servlet: enva

EJECUCIN DEL TABLN DE MENSAJES


U

na vez haya configurado la base de datos Access como origen de datos ODBC denominado messages (consulte el panel Con tina en el SuperCD) de la pgina 229), deber iniciar el servidor Web as:

java WebService ./ 8080

Donde ./ indica al servidor Web que deseamos devolver archivos desde nuestro directorio actual y 8080 indica que deseamos hacerlo utilizando el puerto 8080. A continuacin, deber iniciar el navegador Web y apuntar a http://127.0.0.1:8080 para la pgina
frontal de la Web o http://127.0.0.1: 8080/mboard.htm para ir directamente a la pgina principal del tabln de anuncios.
Recuerde, 127.0.0.1 es simplemente una forma breve de decir mi mquina. Si alguien ms desea acceder al servidor a travs de una
red, deber sustituir esta direccin por su direccin Internet especfica, definida en las propiedades de la red.

Un servlet es un
programa Java que se
ejecuta en el servidor y
que puede responder a
las acciones del
usuario con pginas
creadas al vuelo.

Servlet que enva salida dinmica

Peticin

Peticin

Internet
Peticin

Peticin
PC que ejecuta WebService

228 PC Plus Septiembre 1999

Servlet

de vuelta al navegador Web todo lo que se le d.


Tambin tiene un mtodo hermano denominado writeln(), que es idntico a write() excepto que siempre aade un carcter de salto de lnea al final de
lo que se enve. Puede utilizar writeln() si desea que
el HTML sea ms legible.
Muchos servlets necesitarn hacer cosas en funcin
de lo que solicite el navegador. Un servlet de bsqueda deber buscar pginas que coincidan con una
frase dada, por ejemplo. Normalmente, esta informacin se pasar al servidor mediante un formulario en una pgina Web. Si mira el archivo simpleform. htm del proyecto, ver que contiene un
formulario con un nico campo denominado
my_name.
Cambie el mtodo run() del archivo SimpleServlet.java por:
public void run() {
...
write(<body>Hello +
getParameter(my_name));
...
}

Vuelva a compilar, inicie el servidor y vaya a


http://127.0.0.1:8080/simpleform.htm. Introduzca

su nombre en el campo y pulse Intro. Deber ver


una pgina que dice:
Hello Hermione Gingold

...o sea cual sea el nombre que haya introducido.


El mtodo getParameter() es el segundo mtodo ms
importante del servlet, porque nos permite ver todos
los parmetros que se han pasado al servlet, y adaptar nuestra salida segn proceda.
Adems de obtener los parmetros del formulario,
tambin podemos definir parmetros nuevos, mediante:
setParameter(param_name,
param_val)

de nuestro servlet. No aparecern en el navegador


del usuario. Pronto veremos por qu podemos querer crear un parmetro nuevo.
El ltimo mtodo del servlet que veremos es insert().
El mtodo write() es muy til, pero la escritura de
lnea tras lnea de mandatos write() puede ser muy
aburrida. Para solucionar este extremo puede lla mar al mtodo include() para insertar el contenido
de un archivo determinado, por ejemplo:
include (simpletext.inc)

CONTINA EN EL SUPERCD
omo complemento al Taller Java de este mes,
se encuentran en el SuperCDlos archivos del
proyecto descritos en el artculo, ms una secuencia ScreenCam que muestra cmo registrar messages.mdb como origen de datos. Debe realizar esta tarea antes de ejecutar el servlet, o no funcionar.
Tambin se resume el proceso en el archivo de texto registering datasource.txt, aunque le recomendamos que vea la secuencia ScreenCam, accesible desde el sistema de mens del SuperCD.
Aunque el proyecto est listo para ser ejecutado,
quizs desee corregirlo y volver a compilarlo. Para
ayudarle a hacerlo con los distintos sistemas de
desarrollo que existen, encontrar un archivo using
other compilers.txt que le indica cmo compilar los
archivos fuente con Visual Caf, SuperCede versin 2, Oracle Jdeveloper y Borland JBuilder.
Por ltimo, en el SuperCD, el artculo sigue con
una discusin ms detallada de cmo se ha diseado la clase Servlet que utilizan los archivos de demostracin de lectura recomendada si desea desarrollar las ideas aqu presentadas o las suyas
propias. La continuacin le mostrar:

Dos formas en las que un navegador Web puede


enviar parmetros al servlet
Cmo se almacenan los parmetros en una tabla
hash
Cmo se pueden decodificar los parmetros (no
llegan al servlet de la forma en que espera) utilizando el objeto StringTokenizer.

Antes de poder enviar y recibir mensajes, debe registrar messages.mdb como


origen de datos ODBC.

Septiembre 1999 PC Plus

229

CURSOS
al final del mtodo run, insertar texto (algo raro) en
la salida.
Una caracterstica particularmente til de include()
es que lee el contenido del archivo antes de enviarlo, y si encuentra un fragmento de cdigo con el
formato:
<<use name=parameter_name>>

lo sustituir por el valor del parmetro dado por parameter_name. Ve ahora por qu existe el mtodo setParameter()? Escriba lo siguiente en el mtodo run():
setParameter(my_upper_
name,
getParameter(my_name).
toUpperCase());

llama a una de estas operaciones despus de mirar


el valor de cmd.
Nuestra intencin es la de almacenar los mensajes en
una base de datos: concretamente, la base de datos
messages.mdb de Access que se incluye en los archivos
del proyecto. Esta base de datos debe configurarse como origen de datos ODBC denominado messages. Para obtener detalles sobre cmo hacerlo, consulte la
secuencia ScreenCam que se incluye en el SuperCD.
Debemos conectarnos a esta base de datos en el mtodo static al principio del archivo. Al colocar aqu
el cdigo de la conexin a la base de datos, slo tenemos que crear un enlace a la base de datos la primera
vez que se llame al servlet y permanecer conectada
una vez haya finalizado. Esto nos permitir ejecutar ms
rpidamente nuestro servlet.
Los principales mtodos del servlet vienen a continuacin del mtodo run().

include(simplenamepage.
inc);

El archivo simplenamepage.inc contiene el diseo de


una pgina, incluidas muchas referencias al parmetro my_name, incluida una a la versin en maysculas del nombre que hemos creados con la llamada al mtodo setParameter().
Si inicia el servidor Web y va a http://127.0.0.
1:8080/simpleform.htm, escribe su nombre y pulsa
[Intro], ver el efecto.
Seguramente, no habr encontrado dificultad hasta ahora. Podemos utilizar estos mandatos sencillos
para crear algo un poco ms impresionante: un tabln
de anuncios.
Como en toda la programacin orientada a objetos,
lo mejor es identificar las necesidades desde fuera:
decidir qu deber hacer la clase antes de saber cmo lo har.
Un tabln de anuncios nos debe permitir:
Listar los mensajes ya publicados
Visualizar un formulario para publicar un nuevo
mensaje
Leer detalladamente cualquier mensaje
Publicar un nuevo mensaje o una respuesta a un
mensaje existente
Con el fin de indicar al servlet qu tipo de opera cin deseamos hacer, vamos a tener un parmetro
denominado cmd que contiene (para listar los
mensajes), newmsg (visualizar un formulario para
un nuevo mensaje), showmsg (mostrar los detalles de un mensaje) o postmsg (publicar un nuevo
mensaje o respuesta). Cualquier tipo de hiperenlace
que llame a nuestro servlet deber establecer cmd
en el valor apropiado.
En el archivo MessageBoard.java, el mtodo run()
230 PC Plus Septiembre 1999

showMsg(msgNo) devuelve los detalles completos del


mensaje identificado por msgNo.
listMsgs() y listReplies(msgNo, startAt) trabajan juntos para listar un conjunto de cadenas de mensajes
o conversaciones. El mtodo listReplies() es recursivo; las respuestas pueden tener respuestas, que a su
vez pueden tener respuestas.
postMsg(parentMsg) publica un mensaje en respuesta
al mensaje nmero parentMsg. Si parentMsg es 0,
asumir que es un mensaje nuevo en lugar de una
respuesta a otro.
nextMsg() es un mtodo especial que obtiene el siguiente nmero de mensaje disponible. Intentar hacerlo mirando una variable interna denominada
nextMsg, pero si no es capaz de ello, consultar la
base de datos para encontrar el nmero ms alto utilizado hasta ahora, al que le sumar 1.
Despus de estos mtodos, vienen las utilidades sencillas que devuelven fragmentos estndar de HTML:
pageTop() aade una seccin superior estndar a una
pgina, utilizando el archivo pagetop.inc.
pageEnd() aade un fin de pgina estndar, utilizando el archivo pageend.inc.
showForm(formTitle) aade un formulario estndar
de mensaje, con una cabecera dada por formTitle.
formTitle tendr habitualmente un valor de Publicar un mensaje nuevo o Publicar respuesta.
Ahora ya depende de usted. Puede ampliar el tabln
de anuncios de forma que muestren enlaces anterior y siguiente cuando se est leyendo una cadena
de mensajes. Y qu tal permitir a los usuarios que
publiquen adjuntos? Y si se siente con confianza, intente conectar el tabln a un servidor de noticias NNTP
o a un sistema de correo electrnico.