View
228
Download
0
Category
Preview:
Citation preview
Servlets
10 de Mayo de 2006
Índice
• ¿Qué es un Servlet?• ¿Cuándo y por qué usar Servlets?• Servlet vs. CGI• Ventajas de los Servlets frente a los CGI• Estructura básica de un HttpServlet• Servlet simple que genera texto plano• Servlet simple que genera un HTML• Compilación, instalación e invocación• Ejemplo: ServletOpinion• Ciclo de vida de los Servets
¿Qué es un Servlet?
• Programas en Java que se ejecutan en un servidor HTTP (servidor Web)
• Actúan como capa intermedia entre:– Petición proviniente de un Navegador Web u
otro cliente HTTP– Bases de Datos o Aplicaciones en el servidor
HTTPServidor Web
Servlet
BDexterna
BD
Aplicación
Tareas encomendadas a un Servlet• Leer los datos enviados por un usuario
– Usualmente de formularios en páginas Web– Pueden venir de applets de Java o programas cliente
HTTP.
• Buscar cualquier otra información sobre la petición que venga incluida en esta– Detalles de las capacidades del navegador, cookies,
nombre del host del cliente, etc.
• Generar los resultados– Puede requerir consults a Base de Datos, invocar a otras
aplicaciones, computar directamente la respuesta, etc.
• Dar formato a los resultados en un documento– Incluir la información en una página HTML
• Establecer los parámetros de la respuesta HTTP– Decirle al navegador el tipo de documento que se va a
devolver, establecer las cookies, etc.
• Enviar el documento al cliente
¿Cuándo y por qué usar Servlets?
• Muchas peticiones desde navegador se satisfacen retornando documentos HTML estáticos, es decir, que están en ficheros
• En ciertos casos, es necesario generar las páginas HTML para cada petición:– Página Web basada en datos enviados por
el cliente• Motores de búsqueda, confirmación de pedidos
– Página Web derivada de datos que cambian con frecuencia• Informe del tiempo o noticias de última hora
– Página Web que usa información de bases de datos corporativas u otras fuentes del la parte del servidor• Comercio electrónico: precios y disponibilidades
Servlet vs. CGI
Servidor Web
Petición al CGI-2Petición al CGI-1
Petición al CGI-1
Proceso Hijo del CGI-1Proceso Hijo del CGI-2Proceso Hijo del CGI-1
Servidor Web basado en CGI
Petición al Servlet-2
Petición al Servlet-1
Petición al Servlet-1
Servidor Web
JVM
Servlet-1
Servlet-2
Thread
Servidor Web basado en Java Servlet
Ventajas de los Servlets frente a CGI• Eficiencia
– CGI corto: el proceso de arranque de cada proceso puede dominar el tiempo de ejecución
– N peticiones simultáneas: el código del CGI se carga en memoria N veces
– Al terminar el proceso, el CGI se cierra: difícil persistencia de datos (conexiones a BD, caché...)
• Conveniencia– Los Servlets tienen una infraestructura muy amplia
para la tratar automáticamente datos de formularios HTML, gestionar sesiones y otras utilidades de alto nivel.
• Potencia– Los Servlets pueden comunicar directamente con el
navegador Web– Pueden mantener datos entre peticiones, simplificando
el seguimiento de sesiones y operaciones de caché– Varios Servlets pueden compartir datos
Ventajas de los Servlets frente a CGI• Portabilidad
– Los Servlets están escritos en Java y siguen una API estándar.
– Pueden funcionar sin ningún cambio en diferentes servidores
• Seguridad– CGI adolecen de vulnerabilidades porque:
• Se ejecutan en el shell del SO• Pueden sufrir overflows por el lenguaje (C, C+
+, ...)– Los Servlets no sufren estos problemas
• Economía– Añadir soporte para Servlet a un servidor Web
ya disponible tiene muy poco coste extra– Existen ciertos servidores web y servidores de
servlet gratuitos para tráficos pequeños
Estructura de un HttpServletimport java.io.*;//Se importan los paquetes con las clases para Servlets y HttpServletsimport javax.servlet.*;import javax.servlet.http.*;
public class ServletTemplate extends HttpServlet{
//El método doGet responde a peticiones mediante el método GET public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // El objeto “request” se usa para leer los “HTTP headers” que llegan // (p.e. Cookies) y los datos de formularios HTML enviados por el usuario
// El objeto “response” se usa para especificar “HTTP status codes” y // “HTTP headers” de la respuesta (p.e. El tipo de contenido, cookies, etc.)
PrintWriter out = response.getWriter(); // El objeto “out” se usa para enviar contenido al navegador
}
//El método doPost responde a peticiones mediante el método POST public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
Servlet simple que genera texto planoimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;
public class HelloWorld extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello World"); }
}
Servlet simple que genera un HTMLimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;
public class SimpleHTML extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Le decimos al navegador que lo que vamos a devolver es un HTML response.setContentType("text/html");
PrintWriter out = response.getWriter(); // Construimos una página HTML legal out.println(“<HTML>"); out.println(“<HEAD><TITLE>Servlet simple que genera un HTML</TITLE></HEAD>"); out.println(“<BODY>"); out.println(“<H2>Servlet que genera un HTML</H2>"); out.println(“<P>Este Servlet devuelve el cógigo de una página HTML que el"); out.println(“ navegador interpreta y muestra como tal.</P>"); out.println(“</BODY>"); out.println(“</HTML>");
out.flush(); out.close(); }}
Instalación de Tomcat 5.5.17• Realizar download de tomcat.apache.org• Se descomprime en un directorio del
ordenador:– C:\Archivos de programa\Apache\Tomcat 5.5
• Variables del sistema: CATALINA_HOME– set CATALINA_HOME=C:\ Archivos de
programa\Apache\Tomcat 5.5
• Ejecución:– Arranque del servidor: %CATALINA_HOME%\
bin\startup– Url en el navegador:
http://localhost:8080/– Parada del servidor:
%CATALINA_HOME%\bin\shutdown
Compilación• Compilación
– Vamos a utilizar la librería de Tomcat 5– Indicar en el CLASSPATH dónde están las
clases para que el compilador las reconozca• Path del archivo:
%CATALINA_HOME%\common\lib\servlet-api.jar
– Compilar como cualquier otro código fuente Java
• Instalación– Se entiende por instalación de un Servlet a
ponerlo disponible en el servidor para ser invocado desde un navegador o cliente HTTP
– Se necesita un servidor de Servlets (por ejemplo, Apache Tomcat 5.0 que es gratuito)
– Anteriormente se utilizaba el Servletrunner que viene con la instalación del JSDK2.0
Compilación, instalación e invocación• Invocación de un Servlet
– Desde la barra de direcciones del navegador:
• Ejemplo:
• De esta forma se invoca el servlet mediante el método GET siempre
– Desde un formulario:• La dirección del servlet debe ir en el action
• El servlet se invoca al hacer Submit y lo hace mediante el método definido en el formulario
• Al servlet se le pasan los valores de los campos
http://hostname:port/context/Nombre_Servlet
http://localhost:8080/servlet/SimpleHTML
<FORM action=“http://hostname:port/context/Nombre_Servlet” method=“POST”>...</FORM>
Ejemplo: ServletOpinion
• Página HTML:– MiServlet.html
• Servlet– ServletOpinion.java -> ServletOpinion.class
• Configurar web.xml <servlet> <servlet-name>eje1</servlet-name> <servlet-class>eje1</servlet-class> </servlet>
<servlet-mapping> <servlet-name>eje1</servlet-name> <url-pattern>/eje1</url-pattern> </servlet-mapping>
• Arrancar Tomcat
Ciclo de vida de los Servets
HttpServletMétodo init()
•Se ejecuta una sola vez al inicializar el Servlet
•Inicializar variables y operaciones costosas en tiempo de ejecución
Método destroy()
•Lo llama el servidor al “apagarse”
•Cerrar procesos en curso, liberar memoria, cerrar ficheros
Métodos doGet() o doPost()
•Recoger peticiones del usuario y ejecutar operaciones
•Mandar respuesta al usuario (en forma de HTML)
Otros métodos de usuario
Objeto HttpServletReque
st
Objeto HttpServletRespo
nse
Recommended