Vous êtes sur la page 1sur 14

Tutorial Java-web Servlet y JSP

En este tutorial aprenderemos como usar java para producir paginas webs. Esto es conocido como
"java del lado del servidor" y esta basado principalmente en las tecnologas conocidas como Servlet
y JSP Java Server Pages.

1. ImportanciaRequisito indispensable para un programador java empresarial: La mayor


parte del mercado de trabajo empresarial usa estas tecnologas. Los gobiernos, bancos y grandes
empresas en general basan sus arquitecturas de software en el API Servlet.
2. Tecnologa base del servicio de alojamiento web gratuito de Google: Hoy da el nico
hosting java gratuito (hasta donde yo s) es proporcionado por Google y se llama App Engine.
Veremos en detalle este servicio en otra serie de tutoriales.

Prerrequisitos
1. Protocolos http, lenguaje html, paradigma Cliente-servidor, tcp/ip, etc. Les recomiendo ver la
serie de tutoriales : Video tutoriales sobre programacin Web, HTML y CSS
2. Programacin en lenguaje java. Ver los tutoriales java de este mismo sitio.

Contenido
1.
2.
3.
4.
5.
6.
7.
8.

Que es un Contenedor de Servlets. Instalar Apache Tomcat


Primer Servlet, estructura de un sitio web segn estndar J2EE
Parmetros, mtodo GET y POST en Servlets
Uso de Eclipse IDE for Java EE Developers
Despliegue (Deployment) de la aplicacin Web
Introduccin a Java Server Pages JSP
Depurar nuestra aplicacin web. Debugging.
Depuracin sobre un el servidor remoto. Remote Debugging

Que es un Contenedor de Servlets. Instalacin


Apache Tomcat
Para utilizar Servlets y JSPs es necesaria la utilizacin de un "Contenedor de Servlets". Existen
muchos contenedores de Servlets como Apache Tomcat, Jboss, etc. Para este tutorial usaremos Tomcat
ya que los dems contenedores suelen estar basados en el mismsimo Tomcat.

Que
es un

Servlet? Un Servlet es un objeto java que pertenece a una clase que extiende
javax.servlet.http.HttpServlet. Esto no es del todo exacto ya que existen diferentes tipos de Servlets
pero con diferencia HttpServlet es el ms usado.

Que es un contenedor de Servlets?


Un contenedor de Servlet es un programa capaz de recibir peticiones de pginas web y redireccionar
estas peticiones a un objeto Servlet.

Como funcionan un contenedor de Servlets?


1. El Browser pide una pgina al servidor HTTP que es un contenedor de Servlets
2. El contenedor de Servlets delega la peticin a un Servlet en particular elegido de entre los
Servlets que contiene.
3. El Servlet, que es una objeto java, se encarga de generar el texto de la pgina web que se
entrega al contenedor.
4. El contenedor devuelve la pgina web al Browser que la solicit.

Download Apache Tomcat


El servidor Tomcat ha sido desarrollado por "Apache Software Foundation" http://apache.org/. Esta
comunidad tiene tal importancia que quizs sea la responsable del xito de java. Tiene muchos
proyectos interesantes pero sin duda el que ms significativo es y ser Tomcat.
Podemos descargarnos el contenedor desde http://tomcat.apache.org/

Entre las versiones para Windows existen una en forma de zip y otra con un instalador de servicio
Windows. Como quiero mantener este tutorial lo mas simple posible usar la versin zip as dejamos la
explicacin de que es un servicio Windows para otro tutorial ;) Descargamos el zip (32 o 64bit) y lo
descomprimimos en C:\.
En la instalacin, dentro del subdirectorio bin\ encontraremos startup.bat con el cual podemos
arrancar el servidor.

Hay que
tener en cuenta que Tomcat depende de java por lo cual buscar la variable de sistema JAVA_HOME
que le indique donde esta la instalacin de java. Ejemplo: JAVA_HOME=" C:\Program
Files\Java\jdk1.6.0_21"
Una vez arrancado el servidor podemos comprobar si funciona con cualquier Browser direccionado en
http://localhost:8080 y deberamos ver algo como

Ahora dentro del directorio webapps\ creamos un directorio first-servlet\ que ser el nombre de
nuestra aplicacin web y dentro creamos un archivo llamado welcome.html con el siguiente contenido:
<html>
<head>
<title>Hola Mundo</title>
</head>
<body>
<h1>Hola edu4java</h1>
<p>Bienvenidas a nuestra primera <br/> pgina Web. </p>
</body>
</html>

Volvemos al Browser y apuntamos a http://localhost:8080/first-servlet/welcome.html y deberamos


obtener:
Cabe
destacar
que el
nombre
del
proyecto
y de la
pgina
estn en
letra
minscula. Por convencin todo lo que aparezca en el URL debe estar en minscula.

Primer Servlet, estructura de un sitio web segn


estndar J2EE
Para realizar el despliegue de una aplicacin web en Tomcat basta con crear un directorio con el
nombre de la aplicacin dentro de webapps\. En el tutorial anterior creamos la aplicacin first-servlet e
incluimos una pagina esttica welcome.html.
Una aplicacin web segn las especificaciones de J2EE debe tener una estructura de directorios y un
archivo llamado web.xml tal como se ve en el siguiente esquema:

J2EE es un comit formado por empresas

del sector java empresarial que definen especificaciones (estndares) para que los productos de las
diferentes empresas sean compatibles.
Las paginas web estticas se colocan dentro del directorio de aplicacin (first-servlet\ en nuestro caso)
pero nunca dentro del directorio WEB-INF\ ya que este no puede ser accedido desde el Browser.
Dentro del directorio WEB-INF\classes\ se colocaran las clases java compiladas que componen la
aplicacin (incluidos los servlets). En el directorio WEB-INF\lib\ se pueden incluir libreras
(archivos .jar) que pueda necesitar la aplicacin.
Vamos a crear un Servlet llamado com.edu4java.servlets.FirstServlet con el siguiente cdigo fuente:
package com.edu4java.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

PrintWriter out = resp.getWriter();


out.println("<html>");
out.println("<body>");
out.println("hoy es " + new Date());
out.println("</body>");
out.println("</html>");
}
}

La clase FirstServlet extiende javax.servlet.http.HttpServlet y sobrescribe el mtodo


doGet(HttpServletRequest req, HttpServletResponse resp) que es llamado cuando el Servidor Http

recibe una peticin de tipo GET desde el Browser (para une explicacin de lo que es un mtodo GET y
POST ver el tutorial Servidor Web o Servidor HTTP).
En mtodo doGet recibe dos parmetros, el primero es un objeto de tipo HttpServletRequest que
contiene toda la informacin acerca de la peticin de la pgina web y el segundo es un objeto de tipo
HttpServletResponse que se utiliza para rellenar la respuesta que ser enviada al Browser.
En el cdigo fuente se puede ver como obtenemos un objeto java.io.PrintWriter del objeto
HttpServletResponse y lo usamos para enviar una pgina web con la fecha actual tomada del sistema
usando un objeto del tipo java.util.Date.
Para desplegar este Servlet en el servidor debemos copiar el archivo compilado FirstServlet.class el
directorio WEB-INF\Classes\ como se muestra a continuacin:

Por ltimo solo nos resta configurar el archivo web.xml para que Tomcat sepa cuando debe llamar al
Servlet FirstServlet. Vamos a configurarlo para que sea llamado cuando alguien pregunte por
http://localhost:8080/first-servlet/what-time-is-it
<web-app>
<servlet>
<servlet-name>timeservlet</servlet-name>
<servlet-class>com.edu4java.servlets.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>timeservlet</servlet-name>
<url-pattern>/what-time-is-it</url-pattern>
</servlet-mapping>
</web-app>

<web-app> es el primer elemento en web.xml. Dentro, el elemento <servlet> indica que se crear
un Servlet de la clase com.edu4java.servlets.FirstServlet bajo el nombre interno timeservlet. El
elemento <servlet-mapping> asociar el URL /what-time-is-it al Servlet con nombre interno

timeservlet.
Por ltimo nos resta reiniciar el servidor Tomcat: cerrar la ventana ms-dos del servidor, volver a
ejecutar startup.bat

y
direccionar un Browser a http://localhost:8080/first-servlet/what-time-is-it

Parmetros, mtodo GET y POST en Servlets


Los parmetros son la forma de que el cliente o usuario pueda enviar informacin al servidor Http. Por
ejemplo en una tpica pantalla de login necesitamos enviar el usuario y la clave al servidor para que la
valide.
Como
hace
el
cliente
o

Browser para enviar estos parmetros usando el mtodo GET o POST esta explicado en el tutorial
Servidor Web o Servidor HTTP. Lo que vamos a ver en este tutorial es como recuperar esta

informacin en el servidor usando el API Servlet.


Lo primero que vamos a hacer es crear en nuestro sitio una pgina login.html con el siguiente
contenido
<html>
<body>

<form action="login" method="get">


<table>
<tr>
<td>User</td>
<td><input name="user" /></td>
</tr>
<tr>
<td>password</td>
<td><input name="password" /></td>
</tr>
</table>
<input type="submit" />
</form>

</body>
</html>

Lo siguiente es crear un Servlet que reciba la peticin en /login que es la direccin indicada en el
atributo action de la etiqueta <form> de login.html
package com.edu4java.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import
import
import
import

javax.servlet.ServletException;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String user = req.getParameter("user");
String pass = req.getParameter("password");
if ("edu4java".equals(user) && "eli4java".equals(pass)) {
response(resp, "login ok");
} else {
response(resp, "invalid login");
}
}

private void response(HttpServletResponse resp, String msg)


throws IOException {
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<t1>" + msg + "</t1>");
out.println("</body>");
out.println("</html>");
}

Compilamos este Servlet e incluimos LoginServlet.class en el directorio /WEB-INF/classes.


Modificamos web.xml para enlazar /login con este Servlet.
<web-app>
<servlet>
<servlet-name>timeservlet</servlet-name>
<servlet-class>com.edu4java.servlets.FirstServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>login-servlet</servlet-name>
<servlet-class>com.edu4java.servlets.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>timeservlet</servlet-name>
<url-pattern>/what-time-is-it</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>login-servlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>

Reiniciamos el servidor, abrimos la pagina login.html, colocamos una x en usuario, una x en password
y oprimimos el boton submit.

Como respuesta recibimos

indicndonos que el login ha fallado. Si repetimos la operacin con edu4java como user y eli4java
como password obtenemos El problema aqu es que la password secreta queda visible en el URL
/login?user=edu4java&password=eli4java, quedar en el historial del Browser y cualquiera que
acceda al Browser despus de nosotros podr obtenerla fcilmente. Esto puede ser solucionado
cambiando el mtodo de envo del formulario a POST en login.html.
<html>

<body>

<form action="login" method="post">


<table>
<tr>
<td>User</td>
<td><input name="user" /></td>
</tr>
<tr>
<td>password</td>
<td><input name="password" /></td>
</tr>
</table>
<input type="submit" />
</form>

</body>
</html>

Pero al usar de nuevo login.html recibiremos el siguiente error.

Lo que sucede aqu es que no hemos implementado el mtodo doPost (solo implementamos doGet) por
lo que nuestro Servlet no esta capacitado para recibir peticiones POST. El siguiente cdigo muestra la
modificacin necesaria para que funcione.
package com.edu4java.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import
import
import
import

javax.servlet.ServletException;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {


@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String user = req.getParameter("user");

String pass = req.getParameter("password");


if ("edu4java".equals(user) && "eli4java".equals(pass)) {
response(resp, "login ok");
} else {
response(resp, "invalid login");
}
}

private void response(HttpServletResponse resp, String msg)


throws IOException {
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<t1>" + msg + "</t1>");
out.println("</body>");
out.println("</html>");
}

El nico cambio es que reemplac doGet por doPost. Despus de recompilar y desplegar el Servlet,
reiniciar el servidor y volver a utilizar login.html obtenemos

Donde podemos ver que han desaparecido los parmetros del URL.

Vous aimerez peut-être aussi