Sei sulla pagina 1di 17

Aplicaciones Web: CGIs y Servlets

Objetivo

Entender el funcionamiento bsico de las aplicaciones web que se ejecutan del lado del
servidor
Desarrollar una aplicacin web bsica usando la tecnologa de CGI y usando Servlets
Comprender los principales retos que se presentan al desarrollar aplicaciones web
usando CGI y Servlets

Enunciado
La empresa Los Alpes requiere una aplicacin web sencilla que permita registrar los datos
interesados en sus productos. Por un lado, la aplicacin web debe permitir a los usuarios ingresar
un nombre y un correo electrnico. Los datos de cada usuario se debern guardar en un archivo
de texto.
Por otro lado, los empleados de la empresa podrn consultar los usuarios que se han registrado.
Cualquier empleado podr ingresar el nmero de usuarios que desea consultar (un nmero n).
En respuesta, la aplicacin deber mostrar solo los datos de esa cantidad usuarios (los datos de
los primeros n usuarios). En caso que el empleado ingrese un nmero mayor al nmero de
usuarios registrados (es decir, n es mayor al nmero de registros en el archivo) la aplicacin
deber mostrar los datos de todos los usuarios.
La empresa Los Alpes quiere evaluar la facilidad de desarrollo de (1) la aplicacin usando
tecnologa CGI (Common Gateway Interface) con el lenguaje de programacin C y corriendo
sobre el servidor Apache httpd, con respecto a (2) la aplicacin desarrollada con la tecnologa de
Servlets en el lenguaje de programacin Java (por ejemplo, corriendo en el servidor de
aplicaciones Glassfish).

Pasos para crear una aplicacin CGI en lenguaje C:

Introduccin a la tecnologa CGI


CGI (Common Gateway Interface) en un estndar que permite a un servidor web ejecutar un
programa externo. El programa externo (un script o un programa ejecutable) puede obtener los
datos de la peticin enviada por un navegador y generar una respuesta que es enviada de
regreso a ese navegador.

Creacin de una aplicacin CGI en C


Para crear la aplicacin CGI en C, vamos a apoyarnos en la librera cgic. Esta librera nos
permitir obtener los datos y procesar los encabezados de las peticiones HTTP del cliente y
generar fcilmente la respuesta.
1. Descargue la librera cgic del sitio web: http://www.boutell.com/cgic/
2. Cree un archivo simple-cgi.c y bralo con el editor de texto de su preferencia.
3. En C para importar las libreras necesarias para la ejecucin del programa se usa la
sentencia #include, importe las libreras stdio.h, string.h, stdlib.h y cgic.h como se indica
a continuacin.
#include
#include
#include
#include

<stdio.h>
<string.h>
<stdlib.h>
cgic.h

NOTA: Note que la librera cgic.h se importa de manera diferente, esto se hace para indicar al
compilador que la librera, en este caso cgic, se encuentra en el mismo directorio que el script
que lo va a usar.
3. Todas las aplicaciones en C deben tener un mtodo main(), para nuestro caso y por
hacer uso de la librera cgic, usaremos el mtodo cgiMain() como punto de entrada de
nuestro programa, dejando a cgic.c la responsabilidad de implementar el main()
4. Para cada peticin que ejecute el programa, el llamado de los mtodos se debe hacer en
el siguiente orden:

int cgiMain()

peticin

Petici

void
handlePostSubmit()
void
printFooter()

void
printHeader()

peticin

return 0

void
handleGetSubmit()

5. En C para usar un mtodo, este debe ser declarado antes de su utilizacin. Declare los
mtodos inmediatamente despus de la importacin de libreras.
void
void
void
void

HandlePostSubmit();
HandleGetSubmit();
printHeader();
printFooter();

6. Defina la constante DATAFILE, que indica la ruta donde se va a encontrar el archivo


donde se guardan y se leen los registros del programa.
#define DATAFILE "../data/data.txt"

7. Implemente el mtodo cgiMain() como se muestra a continuacin. El cdigo, para


verificar si un botn de envo (submit) de formulario fue activado por el usuario, usa el
mtodo cgiFormSubmitClicked() que recibe como parmetro el nombre del botn que
se puso en el HTML.
int cgiMain() {
/* Enva el encabezado */
printHeader();
/* El usuario hizo submit con "postrequest"? */
if ((cgiFormSubmitClicked("postrequest") == cgiFormSuccess))
{
HandlePostSubmit();
}
/* o hizo submit con "getrequest"? */
else if ((cgiFormSubmitClicked("getrequest") == cgiFormSuccess))
{
HandleGetSubmit();
}
/* Enva el pi de pgina */
printFooter();
/* Termina el programa */
return 0;
}

7. Implemente el mtodo printHeader(). Este mtodo define el tipo de contenido (en


encabezado Content-Type) que el programa retorna al navegador usando el mtodo
cgiHeaderContentType() de la librera CGIC. Este mtodo recibe como parmetro el
tipo de contenido, para nuestro caso text/html.

8. Para imprimir cada lnea de la respuesta, usaremos el mtodo fprintf(), usando como
parmetros cgiOut (el stream de comunicacin con el navegador/cliente) y los datos (por
ejemplo un string) que se van a enviar de regreso.
void printHeader()
{
/* Enva el tipo de contenido de la respuesta */
cgiHeaderContentType("text/html");
fprintf(cgiOut, "<HTML><HEAD>\n");
fprintf(cgiOut, "<TITLE>Simple CGI</TITLE></HEAD>\n");
fprintf(cgiOut, "<BODY><H1>Simple CGI</H1>\n");
}

9. Implemente el mtodo printFooter() que usaremos nicamente para cerrar las


etiquetas (tags) <body> y <html> de la respuesta.
void printFooter()
{
fprintf(cgiOut, "</body></html>\n");
}

10. En el mtodo handlePostSubmit() vamos a extraer la informacin del nombre y e-mail


del usuario, que se ingresaron en el formulario. Para esto primero debemos declarar dos
arreglos (name y e-mail) de tipo char de tamao 81 y usaremos el mtodo
cgiFormStringNoNewlines() que recibe como parmetro el nombre del campo definido
en el HTML, el array de tipo char donde guardaremos el resultado y el tamao del mismo.
void handlePostSubmit()
{
/* Declara las cadenas para nombre y correo */
char name[81];
char email[81];
/* Obtiene los datos de la peticin HTTP */
cgiFormStringNoNewlines("name", name, 81);
cgiFormStringNoNewlines("email", email, 81);

11. Despus, el mtodo handlePostSubmit(), el cdigo debe crear la cadena que va a ser
guardada en el archivo. Para esto debe declarar un nuevo arreglo de tipo char, donde el
tamao debe ser la suma del tamao del arreglo name, el tamao del arreglo email y
unos caracteres extra que incluyen la separacin de nombre y e-mail y el salto de lnea.
Las funciones strcpy() y strcat() sirven para crear copiar y concatenar los arreglos.
/* Declara una cadena para almacenar los dos datos */
char data[sizeof(name) + sizeof(email) + 6];
/* Copia en data los datos del nombre y el correo electrnico */
strcpy(data, name);
strcat(data, " - ");
strcat(data, email);
strcat(data, "\n");

13. Por ltimo, el mtodo handlePostSubmit(), abre el archivo de datos para concatenar
los datos del usuario. Usamos fopen para cargar el archivo DATAFILE y pasamos la
opcin a para indicar que lo que escribamos sobre el no sobreescribe lo que ya estaba
guardado. La funcin fputs la usamos para escribir el arregla data sobre el archivo.
/* Abre el archivo con la opcin a (append) */
FILE *f = fopen(DATAFILE, "a");
/* No fue posible abrir el archivo? */
if (f == NULL)
{
fprintf(cgiOut, "<p>Ocurri un error, no podemos guardar sus
datos</p>");
}
/* Fue posible abrir archivo? */
else
{
/* Guarda los datos en el archivo */
fputs(data, f);
/* Envia los datos en la respuesta al navegador */
fprintf(cgiOut, "<h1> %s </h1>\n", data);
/* Cierra el archivo */
fclose(f);
}
}

14. El mtodo handleGetSubmit() ser usado para recibir un entero n por parte del usuario
e imprimir los primeros n registros guardados en el archivo de datos. Declare un entero
para guardar el nmero ingresado por el usuario y use el mtodo cgiFormInteger, de la
librera CGIC, que recibe como parmetros el nombre del campo definido en el HTML, la
variable donde se va aguardar el valor y el valor por defecto que debe retornar en caso
de fallo. Adems defina un arreglo de tipo char con tamao 168 (tamao mximo que
puede ser guardado en el mtodo handlePostSubmit())
void handleGetSubmit()
{
/* Declara un valor entero */
int max_num;
/* Obtiene el valor ingresado por el usuario */
cgiFormInteger("max_num", &max_num,0);
char line[168];

15. El mtodo handleGetSubmit() debe leer el archivo de datos, lea tantas lneas como el
usuario haya solicitado del archivo de datos y use la funcin fprintf para escribir cada
lnea en la respuesta. Para leer cada lnea del archivo use la funcin fgets que recibe
como parmetro un arreglo donde va guardar el resultado, el tamao mximo que puede
tener la lnea (en este caso 168) y el archivo ledo. En caso de no poder leer el archivo
debe indicarlo al usuario en la respuesta
FILE *f = fopen(DATAFILE, "r");
if (f == NULL)
{
fprintf(cgiOut, "<TITLE>Fall</TITLE>\n");
fprintf(cgiOut, "<p><EM>No fue posible abrir el archivo de
datos</EM></p>\n");
}
else
{
fprintf(cgiOut, "<h1>Los datos almacenados</h1>");
int i = 0;
while (fgets(line, 168, f) && i<max_num)
{
fprintf(cgiOut, "<h2>%s</h2>\n\n", line);
i++;
}
}
fclose(f);
}

Creacin de la pgina de entrada para la aplicacin


Cree un archivo index.html, use su editor de texto preferido para llenarlo con el siguiente
contenido:
<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<!DOCTYPE html>
<h1 align=center>Hola</h1>
<hr>
<form method='POST' action="/cgi-bin/simple-cgi.cgi">
<p>Como es tu nombre?</p>
<input type='text' name='name' maxlength='80' value=''>
<p>como es tu correo?</p>
<input size=40 type='text' name='email' maxlength='80' value=''>
<input type='submit' name="postrequest" value='submit'>
</form>
<hr>
<form method="GET" action="/cgi-bin/simple-cgi.cgi">
<p>Consulta
<input type="number" min="1" name="max_num" value="1">
<input type='submit' name="getrequest" value='submit'>
</form>
</body>
</html>

El archivo contiene dos secciones, en la primera contiene 2 campos de texto en un formulario de


nombre postrequest que se envan por POST para el nombre y el correo y llaman a la
aplicacin CGI que creamos anteriormente. El segundo formulario de nombre getrequest
recibe un entero mayor que 0 que se enva por el mtodo GET para mostrar el nmero de
registros deseados. Note que el formulario invoca al recurso /cgi-bin/simple-cgi.cgi.
Para que la aplicacin funcione, el programa simple.cgi creado anteriormente debe estar
configurado apropiadamente en el servidor web.
Note tambin que los campos de nombre y e-mail estn restringidos a 80 caracteres, en
concordancia con los mtodos del programa CGI que ya creamos.

Pasos para Apache y Visual Studio en Windows


Configuracin de Apache para soportar aplicaciones CGI
Para configurar el servidor Apache para que acepte las aplicaciones CGI se debe realizar la
siguiente configuracin:
1. Ubique la carpeta conf del servidor Apache. Si realiz la instalacin estndar de Apache
en Windows, el directorio ser:
C:\Program Files\Apache Software Foundation\Apache2.2\conf
2. Edite el archivo httpd.conf (Asegurese de tener permisos para modificar este directorio).
3. Asegrese que tener activados los mdulos de CGI y de Alias. Al revisar el archivo de
configuracin, las siguientes lneas no deben estar comentadas (las lneas comentadas
estn precedidas por el simbolo #)
LoadModule cgi_module
modules/mod_cgi.so
LoadModule alias_module modules/mod_alias.so
4. Configure el directorio en donde se ejecutarn los programas CGI. Asegrese que las
lneas que configuran el directorio cgi-bin no estn comentadas o agregue las lneas al
archivo de configuracin.
ScriptAlias /cgi-bin/
"C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"
Con esta configuracin, el directorio "C://Apache2.2/cgi-bin/" queda configurado para albergar
programas CGI. Todo script o programa que se copie a esta carpeta podr ser ejecutado a travs
del servidor web. Para crear nuestra aplicacin usando CGI, los archivos ejecutables sern
copiados a esta carpeta. Para el taller, es importante verificar que todos los usuarios del sistema
puedan modificar y ejecutar archivos en esta carpeta.

Pasos para la compilacin de la aplicacin en Windows


1. Descargue la librera cgic del sitio web: http://www.boutell.com/cgic/
2. En Visual Studio cree un nuevo proyecto de Visual C++ de tipo Aplicacin de consola
Win32.
3. El proyecto se crea con 3 carpetas de estructura, a nosotros no interesa la carpeta
Archivos de cdigo fuente. De la carpeta descargada de cgic, copie los archivos
cgic.h y cgic.c en Archivos de cdigo fuente.
4. En Visual Studio, a la derecha de la interfaz de usuario, se puede observar la seccin
Explorador de Soluciones. Haga clic derecho sobre el proyecto y seleccione la opcin
compilar solucin.
5. Como salida de consola se muestra la ruta del archivo con extensin .exe de su
aplicacin.
6. Copie y pegue el archivo resultado en la carpeta C:\Program Files\Apache Software
Foundation\Apache2.2\cgi-bin\ y cambie la extensin del archivo para que quede .cgi.
7. Copie y pegue el archivo index.html que cre en la carpeta C:\Program Files \Apache
Software Foundation\Apache2.2\htdocs
8. Ingrese al navegador web e ingrese la ubicacin localhost.
9. Ver los formularios definidos en index.html y al hacer submit en los botones se
ejecutar la aplicacin compilada.
NOTA: Cada vez que modifique la aplicacin, deber compilar la aplicacin y copiar el archivo
.exe en la carpeta especificada y debe cambiar la extensin como se indica anteriormente.

Pasos para Apache y Visual Studio en Linux


A continuacin se presentan los pasos para configurar y compilar la aplicacin usando Ubuntu
Linux. Estos pasos pueden ser usados en sistemas de desarrollo en web como Koding.com y
Cloud9. Igualmente, estos pasos pueden servir como base si se desea compilar la aplicacin en
otras versiones de Linux o Unix, como CentOS o Mac OSX.

Configuracin de Apache para soportar aplicaciones CGI


Normalmente las mquinas Linux ya vienen configuradas con soporte CGI. Usualmente la
carpeta web /cgi-bin est asociada a la carpeta /usr/lib/cgi-bin
1. La configuracin de apache en Ubuntu se hace por medio de las carpetas:
/etc/apache2/
/etc/apache2/conf-enabled/
/etc/apache2/conf-avalaible/
2. Asegrese de que el archivo serve-cgi-bin.conf se encuentre en la carpeta
/etc/apache2/conf-enabled/. Si no est all, debe copiarlo o crear un enlace
dinmico al archivo ubicado en /etc/apache2/conf-avalaible/
cd /etc/apache2/conf-enabled
ln s ../conf-avalaible/serve-cgi-bin.conf .
3. El archivo serve-cgi-bin.conf define una regla de redireccin para la ruta /cgi-bin/ a la
carpeta /usr/lib/cgi-bin/, es en esta carpeta donde debemos poner el archivo simple-cgi.c
que generamos en Creacin de una aplicacin en c y los archivos cgic.c y cgic.h de
la librera CGIC que descargamos en el mismo momento.

Pasos para la compilacin de la aplicacin en Linux


4. Descargue la librera CGIC del siguiente link: http://www.boutell.com/cgic/
sudo wget http://www.boutell.com/cgic/cgic206.tar.gz
5. Descomprima el archivo
tar -xzvf cgic206.tar.gz
6. Copie los archivos cgi.c y cgi.h a la carpeta /usr/lib/cgi-bin/
cd cgic206
cp cgi.c /usr/lib/cgi-bin/.
cp cgi.h /usr/lib/cgi-bin/.

7. Copie el archivo simple-cgi.c en la carpeta /usr/lib/cgi-bin/


cp simple-cgi.c /usr/lib/cgi-bin/
8. Para la compilacin instale el compilador GCC
sudo apt-get install gcc
9. Compile los archivos en una aplicacin ejecutable
sudo gcc cgic.c simple-cgi.c -o simple-cgi.cgi
10. El comando anterior genera un archivo simple-cgi.cgi. Sin embargo, para poderlo
ejecutar es necesario asignar los permisos de ejecucin a ese archivo
sudo chmod 777 simple-cgi.cgi
11. En la carpeta /usr/lib/ cree un directorio data donde se guardarn los datos
ingresados por los usuarios
sudo mkdir data
12. En la carpeta data cree un archivo data.txt con los permisos necesarios para
que el programa CGI pueda modificar el archivo
sudo touch data.txt
sudo chmod 777 data.txt
13. En la carpeta /home/<nombreUsuario>/Web remplace el archivo index.html con el que
se cre en la seccin Creacin de la pgina de entrada para la aplicacin.
14. Si est trabajando en su mquina local, ingrese con un navegador web al URL
http://localhost/~<nombreUsuario>. Si usa un servicio como Koding, ingrese con
un navegador web a http://<nombreUsuario>.koding.io y pruebe que todo
funcione correctamente.
NOTA: Cada vez que haga un cambio sobre la aplicacin (archivo simple-cgi.c) deber volver a
compilar como se indica en el numeral 5).

Pasos para crear una aplicacin con Servlets:


Introduccin Servlets
La tecnologa de Servlets es una extensin a la plataforma Java para creacin de aplicaciones
web. En contraste con la tecnologa CGI diseada para ejecutar un proceso externo, los servlets
corren en servidores de aplicaciones y se ejecutan como un hilo dentro del servidor. Un Servlet
es una clase que incluye mtodos capaces de procesar una peticin web y producir una
respuesta.
Cada servlet es una clase que extiende HttpServlet y puede definir mtodos para procesar los
diferentes mtodos HTTP. Por ejemplo, existen mtodos diferentes para procesar las peticiones
GET (usando el mtodo doGet()) y las peticiones POST (el mtodo doPost()).

Creacin de una aplicacin en Netbeans


1.
2.
3.
4.

En Netbeas, haga clic en el men Archivo>Nuevo Proyecto


Despus seleccione la carpeta Java Web> Web Application
En el nombre del proyecto escriba ServletApp y haga click en siguiente.
En la instalacin de Netbeans puede configurar un servidor Tomcat o GlassFish 4, para
este caso usaremos GlassFish 4, fjese que en el ContextPath est el nombre del proyecto
y haga click en Finalizar.
5. Se crear toda la estructura del proyecto.

Creacin de la aplicacin con Servlets


1. Expanda la carpeta Web Pages y haga click derecho sobre la carpeta WEB-INF
2. Haga click en Nuevo>Otro, en la carpeta web seleccione el tipo de archivo Standard
Deployment Descriptor (web.xml) y haga click en siguiente y despues en finalizar.
3. Expanda la carpeta Source Packages y cree un paquete llamandolo servlets.
4. Haga click derecho sobre sobre el paquete servlets y pongase sobre nuevo> servlet,
creelo con el nombre de MainServlet. El servlet que se crea viene con unos mtodos por
defecto.
5. Elimine el mtodo processRequest.
6. En el mtodo doGet vamos a procesar la informacin que enva el usuario para mostrar
un nmero n de registros guardados en un archivo de texto.
a. Primero vamos a indicar en la respuesta el tipo documento que vamos a enviar,
en este caso text/html.
b. Despus vamos a cargar la instancia de la clase DataProcessor que es un
singleton y es la encargada de leer y escribir en el archivo de datos.
c. El siguiente paso es escribir la respuesta, para esto vamos a extraer el PrintWriter
del objeto response.
d. Del objeto request vamos a extraer el campo max_num.

e. Al Data Processor le vamos a pedir los primeros registros, segn el campo


max_num. El mtodo readData retorna un ArrayList con todos los registros del
archivo.
f. retornamos todos los registro en la respuesta y terminamos el documento html.
Modifique el contenido del mtodo doGet con lo siguiente:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
DataProcessor processor = DataProcessor.getDataProcessorIsntance();
try (PrintWriter out = response.getWriter()) {
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet App</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Registros ingresados</h1>");
int number = Integer.parseInt(request.getParameter("max_num"));
ArrayList registros = processor.readData(number);
if(registros.isEmpty()){
out.println("<p>No hay registros</p>");
}
else {
for (int count=0; count< registros.size(); count++){
out.println("<p>"+registros.get(count)+"</p>");
}
}
out.println("</body>");
out.println("</html>");
}
}

8. El mtodo doPost se encarga de procesar las peticiones POST y vamos a recibir del
formulario un campo name y un campo email. Cuando recibamos un par de datos
vamos a guardarlos en un archivo de texto con el formato name - email. Al usuario
vamos a mostrarle los datos que fueron guardados.
a. Primero al objeto response vamos a asignarle el tipo de documento que vamos
a retornar, para este caso ser text/html.
b. Despus vamos a cargar la instancia de la clase DataProcessor que es un
singleton y es la encargada de leer y escribir en el archivo de datos.

c. El siguiente paso es escribir la respuesta, para esto vamos a crear un objeto


PrintWriter a partir del objeto response.
d. Extraemos del objeto request los campos name y email y los pasamos al
objeto DataProcessor por medio del mtodo writeData.
e. Por ltimo escribimos el documento html, donde mostramos los datos ingresados
por el usuario.
Modifique el mtodo doPost con el siguiente contenido
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
DataProcessor processor = DataProcessor.getDataProcessorIsntance();
try (PrintWriter out = response.getWriter()) {
String name = request.getParameter("name");
String email = request.getParameter("email");
processor.writeData(name, email);
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Hello</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1 align=center>Hola "+name+"</h1>");
out.println("<h2 align=center>Tu email es: "+email+"</h2>");
out.println("</body>");
out.println("</html>");
}
}

9. Cree un paquete nuevo dentro de Source Packages con el nombre classes, En el cree
la clase DataProcessor como un singleton.
a. En el contructor inicialice el archivo data.txt en la ubicacin que desee que los
datos queden guardados.
b. Cree el mtodo writeData que recibe como parametros los Strings name y
email y guardan en cada lnea la cadena name - email.
c. Cree el mtodo readData que recibe como parmetro un entero number y que
retorna un ArrayList con las primeras number entradas.
10. Abra el archivo web.xml que creamos anteriormente, en la parte superior seleccione la
pestaa Servlets y haga click en Agregar Servlet. Escriba el nombre del servlet y en la
clase busque el servlet creado, como patron URL escriba /MainServlet.

11. Vuelva a la pestaa Source y ver que se agregaron unas lneas como las siguientes:
<servlet>
<servlet-name>MainServlet</servlet-name>
<servlet-class>servlets.MainServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern>/MainServlet</url-pattern>
</servlet-mapping>
Lo que hace el mtodo reservado doPost es procesar las peticiones POST cuando se acceda al
servlet, aqu vamos a guardar los datos ingresados por el usuario en el ArrayList definido
anteriormente. En el mtodo doGet vamos a procesar las peticiones GET, lo que vamos a hacer
en este mtodo es leer los primeros n Strings con n un entero ingresado por el usuario.

Creacin de la pgina de entrada


1. Abra el archivo index.html en la carpeta Web Pages.
2. Vamos a crear un formulario para que el usuario ingrese el nombre y el correo, este
formulario debe enviarse por el mtodo POST y ser procesado por MainServlet.
3. Vamos a crear un formulario para que el usuario ingrese un entero mayor que 0, este
formulario lo enviamos por GET y ser procesado por MainServlet.
4. A continuacin el contenido del archivo:

<!DOCTYPE html>
<html>
<head>
<title>Registro</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<!DOCTYPE html>
<h1 align=center>Hola</h1>
<hr>
<form method='POST' action='MainServlet'>
<p>Como es tu nombre?</p>
<input type='text' name='name' value=''>
<p>como es tu correo?</p>
<input type='text' name='email' value=''>
<input type='submit' value='submit'>
</form>
<hr>
<form method="GET" action='MainServlet'>
<p>Consulta
<input type="number" min="1" name="max_num" value="1">
<input type='submit' value='submit'>
</form>
</body>
</html>

Para iniciar la aplicacin haga clic derecho sobre el proyecto web, despus haga clic en Run
para compilar y ejecutar sobre el servidor configurado. Por defecto la aplicacin corre sobre el
puerto 8080, ingrese a http://localhost:8080/ServletApp/ para ejecutar la aplicacin.

Potrebbero piacerti anche