Servlets Servlets Son modulos que extienden las funcionalidades

  • Slides: 32
Download presentation
Servlets • Servlets Son modulos que extienden las funcionalidades de un servidor “java-enabled” •

Servlets • Servlets Son modulos que extienden las funcionalidades de un servidor “java-enabled” • Normalmente generan código HTML dinámicamente, el cual se manda al browser, quien lo muestra. • Por ejemplo, pueden mandar una query a una base de datos, la que puede estar basada en parámetros que mandó el browser al servidor. El resultado se manda en formato HTML

Ambientes de Desarrollo • Hay muchos ambientes de desarrollo que permiten escribir y testear

Ambientes de Desarrollo • Hay muchos ambientes de desarrollo que permiten escribir y testear los servlets cómodamente • Incluyen un editor y un servidor web • También incluyen los imports necesarios para poder compilar y correr los servlets • Algunos de ellos son Eclipse (need to download plugins) y Netbeans (which also has full j 2 ee support

Anatomía de un Servlet • Un Servlet se escribe extendiendo la clase Http. Servlet

Anatomía de un Servlet • Un Servlet se escribe extendiendo la clase Http. Servlet la que tiene los siguientes métodos declarados pero vacíos • init() Es invocado por el servidor cuando el servlet se usa por primera vez (cuándo sucede esto depende del servidor) • do. Get(Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException es invocado cada vez que un servlet es contactado po un requerimiento GET (por default) • do. Post(Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException es invocado cada vez que un servlet es contactado po un requerimiento POST

import java. io. *; import javax. servlet. http. *; public class My. Servlet extends

import java. io. *; import javax. servlet. http. *; public class My. Servlet extends Http. Servlet { public void init() { //Sobreescribir para que haga lo queramos } public void do. Get ( Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { //Sobreescribir para que haga lo queramos } public void do. Post( Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { //Sobreescribir para que haga lo queramos } }

El parámetro Http. Servlet. Request • Http. Servlet. Request es la clase del primer

El parámetro Http. Servlet. Request • Http. Servlet. Request es la clase del primer parametro que reciben los métodos do. Get y do. Post. Provee acceso a: – Información acerca del cliente (por ejemplo, los parámetros que envió, la versión del protocolo que está usando, la IP del cliente, etc. – Además da acceso a un, Servlet. Input. Stream que puede ser usado por el servidor para recibir información adicional (por ejemplo un archivo que el cliente quiere “uplodear” cuando se ha usado el método POST o PUT.

El parámetro Http. Servlet. Response • Http. Servlet. Response es la clase del segundo

El parámetro Http. Servlet. Response • Http. Servlet. Response es la clase del segundo argumento que reciben do. Get y do. Post. • Provee métodos para : – Decirle al browser cuál es el tipo MIME de la respuesta que se le va a dar al cliente – Obtener un objeto Servlet. Output. Stream y un Print. Writer través del cual podemos mandar código HTML dinámicamente al cliente. – Mandar otras informaciones importantes (cookies, redireccionamineto, refresco, etc…)

Example 1 import java. io. *; javax. servlet. http. *; java. util. Date; public

Example 1 import java. io. *; javax. servlet. http. *; java. util. Date; public class Simple. Servlet extends Http. Servlet { public void do. Get ( Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { // set content type response. set. Content. Type("text/html"); // open print writer to browser Print. Writer out = response. get. Writer(); //send data out. println("<HTML>") out. println("<H 1> Mi Primer Servlet </H 1>"); out. println("<BR> <H 2>Fecha y hora: "+(new Date())+"<H 2>"); out. println("</HTML>"); out. close(); } }

Example 1 import java. io. *; javax. servlet. http. *; java. util. Date; Importar

Example 1 import java. io. *; javax. servlet. http. *; java. util. Date; Importar las clases necesarias Para usar la clase Date public class Simple. Servlet extends Http. Servlet { public void do. Get ( Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { // set content type response. set. Content. Type("text/html"); // open print writer to browser Print. Writer out = response. get. Writer(); //send data out. println("<HTML>") out. println("<H 1> Mi Primer Servlet </H 1>"); out. println("<BR> <H 2>Fecha y hora: "+(new Date())+"<H 2>"); out. println("</HTML>"); out. close(); } }

Example 1 import java. io. *; javax. servlet. http. *; java. util. Date; Todo

Example 1 import java. io. *; javax. servlet. http. *; java. util. Date; Todo servlet extiende Http. Servlet public class Simple. Servlet extends Http. Servlet { public void do. Get ( Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { // set content type response. set. Content. Type("text/html"); Sobreescribir método do. Get // open print writer to browser Print. Writer out = response. get. Writer(); //send data out. println("<HTML>") out. println("<H 1> Mi Primer Servlet </H 1>"); out. println("<BR> <H 2>Fecha y hora: "+(new Date())+"<H 2>"); out. println("</HTML>"); out. close(); } }

Example 1 import java. io. *; javax. servlet. http. *; java. util. Date; public

Example 1 import java. io. *; javax. servlet. http. *; java. util. Date; public class Simple. Servlet extends Http. Servlet { public void do. Get ( Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { // set content type Decirle al browser el tipo de response. set. Content. Type("text/html"); Contenido que va a recibir // open print writer to browser Como respuesta Print. Writer out = response. get. Writer(); Obtiene una “linea directa” para escribirle al browser //send data contenido HTML out. println("<HTML>") out. println("<H 1> Mi Primer Servlet </H 1>"); out. println("<BR> <H 2>Fecha y hora: "+(new Date())+"<H 2>"); out. println("</HTML>"); out. close(); } }

Example 1 import java. io. *; javax. servlet. http. *; java. util. Date; public

Example 1 import java. io. *; javax. servlet. http. *; java. util. Date; public class Simple. Servlet extends Http. Servlet { public void do. Get ( Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { // set content type response. set. Content. Type("text/html"); // open print writer to browser Print. Writer out = response. get. Writer(); //send data Mandar out. println("<HTML>") (imprimir) out. println("<H 1> Mi Primer Servlet </H 1>"); info al out. println("<BR> <H 2>Fecha y hora: "+(new Date())+"<H 2>"); browser out. println("</HTML>"); out. close(); Obtiene la fecha del sistema } } Cerrar conexión (recién aquí se manda todo)

Corriendo el primer ejemplo • Escribir un servlet con Netbeans es muy sencillo •

Corriendo el primer ejemplo • Escribir un servlet con Netbeans es muy sencillo • Tambien testearlo se puede hacer automáticamente – Abrir netbeans – Crear un proyecto web (lo cual creará una serie de directorios y archivos) – Crear el servlet (new servlet) – Copiar el código de Simple. Servlet. java – Correr el archivo

Ejemplo 2 • Implementar un contador web • Cuenta cuantas veces se contacta al

Ejemplo 2 • Implementar un contador web • Cuenta cuantas veces se contacta al servlet (con GET) • Tambien le mostrará al cliente su número IP

import java. io. *; import javax. servlet. http. *; public class Count extends Http.

import java. io. *; import javax. servlet. http. *; public class Count extends Http. Servlet { int count = 0; // a counter starts in 0 public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { count++; Print. Writer out = res. get. Writer(); res. set. Content. Type("text/html"); } } out. println("<H 1> A web page counter </H 1>"); out. println("<HR>"); out. println("This servlet was accessed "+count+" time(s)"); out. println("<HR>"); out. println("Your computer is "+req. get. Remote. Host()); out. println("<HR>"); out. close();

import java. io. *; import javax. servlet. http. *; public class Count extends Http.

import java. io. *; import javax. servlet. http. *; public class Count extends Http. Servlet { int count = 0; // a counter starts in 0 public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { count++; Print. Writer out = res. get. Writer(); res. set. Content. Type("text/html"); } } out. println("<H 1> A web page counter </H 1>"); out. println("<HR>"); out. println("This servlet was accessed "+count+" time(s)"); out. println("<HR>"); out. println("Your computer is "+req. get. Remote. Host()); out. println("<HR>"); out. close();

import java. io. *; import javax. servlet. http. *; public class Count extends Http.

import java. io. *; import javax. servlet. http. *; public class Count extends Http. Servlet { int count = 0; // a counter starts in 0 public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { count++; Incrementa el contador cada vez que se ejecuta do. Get Print. Writer out = res. get. Writer(); res. set. Content. Type("text/html"); } } out. println("<H 1> A web page counter </H 1>"); out. println("<HR>"); out. println("This servlet was accessed "+count+" time(s)"); out. println("<HR>"); out. println("Your computer is "+req. get. Remote. Host()); out. println("<HR>"); out. close();

import java. io. *; import javax. servlet. http. *; public class Count extends Http.

import java. io. *; import javax. servlet. http. *; public class Count extends Http. Servlet { int count = 0; // a counter starts in 0 public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { count++; Print. Writer out = res. get. Writer(); res. set. Content. Type("text/html"); } } Totalmente necesario out. println("<H 1> A web page counter </H 1>"); out. println("<HR>"); out. println("This servlet was accessed "+count+" time(s)"); out. println("<HR>"); out. println("Your computer is "+req. get. Remote. Host()); out. println("<HR>"); out. close();

import java. io. *; import javax. servlet. http. *; public class Count extends Http.

import java. io. *; import javax. servlet. http. *; public class Count extends Http. Servlet { int count = 0; // a counter starts in 0 public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { count++; Print. Writer out = res. get. Writer(); res. set. Content. Type("text/html"); Print data to browser } } out. println("<H 1> A web page counter </H 1>"); out. println("<HR>"); out. println("This servlet was accessed "+count+" time(s)"); out. println("<HR>"); out. println("Your computer is "+req. get. Remote. Host()); out. println("<HR>"); out. close();

Qué pasa si el servidor se cae y se reinicia el sistema ? •

Qué pasa si el servidor se cae y se reinicia el sistema ? • Contador volverá a 0 • Para recordar el valor que tenía esta variable incluso si se cae el sistema la iremos escribiendo en un archivo cada vez que cambia su valor. • Al principio el servlet lee el valor inicial de la variable desde un archivo (si existía), si no, vamos a empezar con el valor = 0

public class Count extends Http. Servlet { int count = 0; // a counter

public class Count extends Http. Servlet { int count = 0; // a counter for the object public void init() { try { Buffered. Reader in = new Buffered. Reader( new. File. Reader(„count. txt“)); String l = in. read. Line(); count = Integer. parse. Int(l); } catch (File. Not. Found. Exception e) { //no need to do anything here } } } public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { count++; Print. Writer out. File = new Print. Writer( new Filereader(„count. txt“)); out. File. println(count); out. File. close(); Print. Writer out. Browser = res. get. Writer(); res. set. Content. Type("text/html"); out. Browser. println("<H 1> A web page counter </H 1>"); out. Browser. println("<HR>"); . . }

public class Count extends Http. Servlet { int count = 0; // a counter

public class Count extends Http. Servlet { int count = 0; // a counter for the object public void init() { try { Buffered. Reader in = new Buffered. Reader( new. File. Reader(„count. txt“)); String l = in. read. Line(); count = Integer. parse. Int(l); } catch (File. Not. Found. Exception e) { //no need to do anything here } } Tratar de abrir el archivo } public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { count++; Print. Writer out. File = new Print. Writer( new Filereader(„count. txt“)); out. File. println(count); out. File. close(); Print. Writer out. Browser = res. get. Writer(); res. set. Content. Type("text/html"); out. Browser. println("<H 1> A web page counter </H 1>"); out. Browser. println("<HR>"); . . }

public class Count extends Http. Servlet { int count = 0; // a counter

public class Count extends Http. Servlet { int count = 0; // a counter for the object public void init() { try { Buffered. Reader in = new Buffered. Reader( new. File. Reader(„count. txt“)); String l = in. read. Line(); Leer una linea count = Integer. parse. Int(l); Convrtir lo leido a valor entero } catch (File. Not. Found. Exception e) { //no need to do anything here } } } public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { count++; Print. Writer out. File = new Print. Writer( new Filereader(„count. txt“)); out. File. println(count); out. File. close(); Print. Writer out. Browser = res. get. Writer(); res. set. Content. Type("text/html"); out. Browser. println("<H 1> A web page counter </H 1>"); out. Browser. println("<HR>"); . . }

public class Count extends Http. Servlet { int count = 0; // a counter

public class Count extends Http. Servlet { int count = 0; // a counter for the object public void init() { try { Buffered. Reader in = new Buffered. Reader( new. File. Reader(„count. txt“)); String l = in. read. Line(); count = Integer. parse. Int(l); } catch (File. Not. Found. Exception e) { //no need to do anything here } } } public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { count++; Print. Writer out. File = new Print. Writer( new Filereader(„count. txt“)); out. File. println(count); out. File. close(); Print. Writer out. Browser = res. get. Writer(); res. set. Content. Type("text/html"); out. Browser. println("<H 1> A web page counter </H 1>"); out. Browser. println("<HR>"); . . }

public class Count extends Http. Servlet { int count = 0; // a counter

public class Count extends Http. Servlet { int count = 0; // a counter for the object public void init() { try { Buffered. Reader in = new Buffered. Reader( new. File. Reader(„count. txt“)); String l = in. read. Line(); count = Integer. parse. Int(l); } catch (File. Not. Found. Exception e) { //no need to do anything here } } public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { } } Despues de incrementar, count++; Print. Writer out. File = new Print. Writer( abrir el archivo new Filereader(„count. txt“)); (sobreescribirlo) out. File. println(count); Escribir el nuevo número out. File. close(); Cerrar archivo Print. Writer out. Browser = res. get. Writer(); res. set. Content. Type("text/html"); out. Browser. println("<H 1> A web page counter </H 1>"); out. Browser. println("<HR>"); . .

public class Count extends Http. Servlet { int count = 0; // a counter

public class Count extends Http. Servlet { int count = 0; // a counter for the object public void init() { try { Buffered. Reader in = new Buffered. Reader( new. File. Reader(„count. txt“)); String l = in. read. Line(); count = Integer. parse. Int(l); } catch (File. Not. Found. Exception e) { //no need to do anything here } } public void do. Get ( Http. Servlet. Request req, Http. Servlet. Response res) throws Servlet. Exception, IOException { count++; Print. Writer out. File = new Print. Writer( new Filereader(„count. txt“)); out. File. println(count); out. File. close(); Print. Writer out. Browser = res. get. Writer(); El resto res. set. Content. Type("text/html"); es igual out. Browser. println("<H 1> A web page counter </H 1>"); out. Browser. println("<HR>"); . . } }

Ejemplo 3 • Escriba un servlet que genere un número aleatorio entre 1 y

Ejemplo 3 • Escriba un servlet que genere un número aleatorio entre 1 y 100 cada vez que es contactado y lo muestra al cliente junto con la IP del computador del cliente • Además muestra el número más grande generado hasta ahora y la IP del computador para el cual lo generó • La dirección del computador del cliente puede ser obtenida • String s = request. get. Remote. Host(); – returns the IP number (like 133. 8. 109. 158 • String s = request. get. Remote. Address(); – returns the name if it can be retrieved (like www. waseda. jp) • Un número aleatorio entre 1 y 100 se genera con la siguiente instrucción en Java • int numero = (int)(1 + Math. random()*100);

import java. io. *; import javax. servlet. http. *; public class New. Servlet extends

import java. io. *; import javax. servlet. http. *; public class New. Servlet extends Http. Servlet { int max. Number = 0; String max. IP = ""; public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException, Servlet. Exception { } } int aleatorio = (int)(1 + Math. random()*100); String ip = request. get. Remote. Addr(); if (aleatorio > max. Number) { max. Number = aleatorio; max. IP = ip; } response. set. Content. Type("text/html"); Print. Writer out = response. get. Writer(); out. println("<h 1> Bienvenido </h 1> "); out. println("<h 2> Su dirección IP es "+ ip+ " "); out. println("Su número es "+aleatorio+" "); out. println("El numero mayor generado es "+max. Number); out. println(" Fue generado para "+max. IP); out. close();

import java. io. *; import javax. servlet. http. *; public class New. Servlet extends

import java. io. *; import javax. servlet. http. *; public class New. Servlet extends Http. Servlet { int max. Number = 0; String max. IP = ""; Inicializacion variables para guardar La IP y el valor del máximo public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException, Servlet. Exception { } } int aleatorio = (int)(1 + Math. random()*100); String ip = request. get. Remote. Addr(); if (aleatorio > max. Number) { max. Number = aleatorio; max. IP = ip; } response. set. Content. Type("text/html"); Print. Writer out = response. get. Writer(); out. println("<h 1> Bienvenido </h 1> "); out. println("<h 2> Su dirección IP es "+ ip+ " "); out. println("Su número es "+aleatorio+" "); out. println("El numero mayor generado es "+max. Number); out. println(" Fue generado para "+max. IP); out. close();

import java. io. *; import javax. servlet. http. *; public class New. Servlet extends

import java. io. *; import javax. servlet. http. *; public class New. Servlet extends Http. Servlet { int max. Number = 0; String max. IP = ""; public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException, Servlet. Exception { Generación número aleatorio int aleatorio = (int)(1 + Math. random()*100); String ip = request. get. Remote. Addr(); Obtencion ip del cliente } } if (aleatorio > max. Number) { max. Number = aleatorio; max. IP = ip; } response. set. Content. Type("text/html"); Print. Writer out = response. get. Writer(); out. println("<h 1> Bienvenido </h 1> "); out. println("<h 2> Su dirección IP es "+ ip+ " "); out. println("Su número es "+aleatorio+" "); out. println("El numero mayor generado es "+max. Number); out. println(" Fue generado para "+max. IP); out. close();

import java. io. *; import javax. servlet. http. *; public class New. Servlet extends

import java. io. *; import javax. servlet. http. *; public class New. Servlet extends Http. Servlet { int max. Number = 0; String max. IP = ""; public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException, Servlet. Exception { int aleatorio = (int)(1 + Math. random()*100); String ip = request. get. Remote. Addr(); } } Actualización de los datos if (aleatorio > max. Number) { del máximo generado max. Number = aleatorio; max. IP = ip; } response. set. Content. Type("text/html"); Print. Writer out = response. get. Writer(); out. println("<h 1> Bienvenido </h 1> "); out. println("<h 2> Su dirección IP es "+ ip+ " "); out. println("Su número es "+aleatorio+" "); out. println("El numero mayor generado es "+max. Number); out. println(" Fue generado para "+max. IP); out. close();

import java. io. *; import javax. servlet. http. *; public class New. Servlet extends

import java. io. *; import javax. servlet. http. *; public class New. Servlet extends Http. Servlet { int max. Number = 0; String max. IP = ""; public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException, Servlet. Exception { Enviar info al cliente } } int aleatorio = (int)(1 + Math. random()*100); String ip = request. get. Remote. Addr(); if (aleatorio > max. Number) { max. Number = aleatorio; max. IP = ip; } response. set. Content. Type("text/html"); Print. Writer out = response. get. Writer(); out. println("<h 1> Bienvenido </h 1> "); out. println("<h 2> Su dirección IP es "+ ip+ " "); out. println("Su número es "+aleatorio+" "); out. println("El numero mayor generado es "+max. Number); out. println(" Fue generado para "+max. IP); out. close();