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 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 j2ee support
Anatomía de un Servlet
• Un Servlet se escribe extendiendo la clase HttpServlet 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)
• doGet(HttpServletRequest req, HttpServletResponse
res) throws ServletException, IOException
es invocado cada vez que un servlet es contactado po un
requerimiento GET (por default)
• doPost(HttpServletRequest req, HttpServletResponse
res) throws ServletException, IOException
es invocado cada vez que un servlet es contactado po un
requerimiento POST
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class MyServlet extends HttpServlet
{
public void init() {
//Sobreescribir para que haga lo que queramos
}
public void doGet ( HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//Sobreescribir para que haga lo que queramos
}
public void doPost( HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//Sobreescribir para que haga lo que queramos
}
}
El parámetro HttpServletRequest
• HttpServletRequest es la clase del primer
parametro que reciben los métodos doGet y
doPost. 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, ServletInputStream 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
HttpServletResponse
• HttpServletResponse es la clase del segundo
argumento que reciben doGet y doPost.
• 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 ServletOutputStream y un
PrintWriter través del cual podemos mandar código
HTML dinámicamente al cliente.
– Mandar otras informaciones importantes (cookies,
redireccionamineto, refresco, etc…)
Example 1
import
import
import
import
java.io.*;
javax.servlet.*;
javax.servlet.http.*;
java.util.Date;
public class SimpleServlet extends HttpServlet
{
public void doGet ( HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException
{
// set content type
response.setContentType("text/html");
// open print writer to browser
PrintWriter out = response.getWriter();
//send data
out.println("<HTML>")
out.println("<H1> Mi Primer Servlet </H1>");
out.println("<BR> <H2>Fecha y hora: "+(new Date())+"<H2>");
out.println("</HTML>");
out.close();
}
}
Example 1
import
import
import
import
java.io.*;
javax.servlet.*;
javax.servlet.http.*;
java.util.Date;
Importar las clases necesarias
Para usar la clase Date
public class SimpleServlet extends HttpServlet
{
public void doGet ( HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException
{
// set content type
response.setContentType("text/html");
// open print writer to browser
PrintWriter out = response.getWriter();
//send data
out.println("<HTML>")
out.println("<H1> Mi Primer Servlet </H1>");
out.println("<BR> <H2>Fecha y hora: "+(new Date())+"<H2>");
out.println("</HTML>");
out.close();
}
}
Example 1
import
import
import
import
java.io.*;
javax.servlet.*;
javax.servlet.http.*;
java.util.Date;
Todo servlet extiende HttpServlet
public class SimpleServlet extends HttpServlet
{
public void doGet ( HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException
{
// set content type
response.setContentType("text/html"); Sobreescribir método doGet
// open print writer to browser
PrintWriter out = response.getWriter();
//send data
out.println("<HTML>")
out.println("<H1> Mi Primer Servlet </H1>");
out.println("<BR> <H2>Fecha y hora: "+(new Date())+"<H2>");
out.println("</HTML>");
out.close();
}
}
Example 1
import
import
import
import
java.io.*;
javax.servlet.*;
javax.servlet.http.*;
java.util.Date;
public class SimpleServlet extends HttpServlet
{
public void doGet ( HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException
{
// set content type
Decirle al browser el tipo de
response.setContentType("text/html");
Contenido que va a recibir
// open print writer to browser
Como respuesta
Obtiene una “linea directa”
PrintWriter out = response.getWriter();
para escribirle al browser
//send data
contenido HTML
out.println("<HTML>")
out.println("<H1> Mi Primer Servlet </H1>");
out.println("<BR> <H2>Fecha y hora: "+(new Date())+"<H2>");
out.println("</HTML>");
out.close();
}
}
Example 1
import
import
import
import
java.io.*;
javax.servlet.*;
javax.servlet.http.*;
java.util.Date;
public class SimpleServlet extends HttpServlet
{
public void doGet ( HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException
{
// set content type
response.setContentType("text/html");
// open print writer to browser
PrintWriter out = response.getWriter();
//send data
Mandar
out.println("<HTML>")
(imprimir)
out.println("<H1> Mi Primer Servlet </H1>");
info al
out.println("<BR> <H2>Fecha y hora: "+(new Date())+"<H2>");
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
• 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 SimpleServlet.java
– Correr el archivo
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.*;
import javax.servlet.http.*;
public class Count extends HttpServlet {
int count = 0;
// a counter starts in 0
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
count++;
PrintWriter out = res.getWriter();
res.setContentType("text/html");
}
}
out.println("<H1> A web page counter </H1>");
out.println("<HR>");
out.println("This servlet was accessed "+count+" time(s)");
out.println("<HR>");
out.println("Your computer is "+req.getRemoteHost());
out.println("<HR>");
out.close();
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Count extends HttpServlet {
int count = 0;
// a counter starts in 0
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
count++;
PrintWriter out = res.getWriter();
res.setContentType("text/html");
}
}
out.println("<H1> A web page counter </H1>");
out.println("<HR>");
out.println("This servlet was accessed "+count+" time(s)");
out.println("<HR>");
out.println("Your computer is "+req.getRemoteHost());
out.println("<HR>");
out.close();
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Count extends HttpServlet {
int count = 0;
// a counter starts in 0
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
count++;
Incrementa el contador cada vez que se ejecuta doGet
PrintWriter out = res.getWriter();
res.setContentType("text/html");
}
}
out.println("<H1> A web page counter </H1>");
out.println("<HR>");
out.println("This servlet was accessed "+count+" time(s)");
out.println("<HR>");
out.println("Your computer is "+req.getRemoteHost());
out.println("<HR>");
out.close();
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Count extends HttpServlet {
int count = 0;
// a counter starts in 0
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
count++;
PrintWriter out = res.getWriter();
res.setContentType("text/html");
}
}
Totalmente necesario
out.println("<H1> A web page counter </H1>");
out.println("<HR>");
out.println("This servlet was accessed "+count+" time(s)");
out.println("<HR>");
out.println("Your computer is "+req.getRemoteHost());
out.println("<HR>");
out.close();
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Count extends HttpServlet {
int count = 0;
// a counter starts in 0
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
count++;
PrintWriter out = res.getWriter();
res.setContentType("text/html");
Print
data
to
browser
}
}
out.println("<H1> A web page counter </H1>");
out.println("<HR>");
out.println("This servlet was accessed "+count+" time(s)");
out.println("<HR>");
out.println("Your computer is "+req.getRemoteHost());
out.println("<HR>");
out.close();
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 HttpServlet {
int count = 0;
// a counter for the object
public void init() {
try {
BufferedReader in = new BufferedReader(
newFileReader(„count.txt“));
String l = in.readLine();
count = Integer.parseInt(l);
} catch (FileNotFoundException e) {
//no need to do anything here
}
}
}
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
count++;
PrintWriter outFile = new PrintWriter(
new Filereader(„count.txt“));
outFile.println(count);
outFile.close();
PrintWriter outBrowser = res.getWriter();
res.setContentType("text/html");
outBrowser.println("<H1> A web page counter </H1>");
outBrowser.println("<HR>");
.....
.....
}
public class Count extends HttpServlet {
int count = 0;
// a counter for the object
public void init() {
try {
BufferedReader in = new BufferedReader(
newFileReader(„count.txt“));
String l = in.readLine();
count = Integer.parseInt(l);
} catch (FileNotFoundException e) {
//no need to do anything here
}
}
Tratar de abrir el archivo
}
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
count++;
PrintWriter outFile = new PrintWriter(
new Filereader(„count.txt“));
outFile.println(count);
outFile.close();
PrintWriter outBrowser = res.getWriter();
res.setContentType("text/html");
outBrowser.println("<H1> A web page counter </H1>");
outBrowser.println("<HR>");
.....
.....
}
public class Count extends HttpServlet {
int count = 0;
// a counter for the object
public void init() {
try {
BufferedReader in = new BufferedReader(
newFileReader(„count.txt“));
String l = in.readLine();
Leer una linea
count = Integer.parseInt(l);
Convrtir lo leido a valor entero
} catch (FileNotFoundException e) {
//no need to do anything here
}
}
}
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
count++;
PrintWriter outFile = new PrintWriter(
new Filereader(„count.txt“));
outFile.println(count);
outFile.close();
PrintWriter outBrowser = res.getWriter();
res.setContentType("text/html");
outBrowser.println("<H1> A web page counter </H1>");
outBrowser.println("<HR>");
.....
.....
}
public class Count extends HttpServlet {
int count = 0;
// a counter for the object
public void init() {
try {
BufferedReader in = new BufferedReader(
newFileReader(„count.txt“));
String l = in.readLine();
count = Integer.parseInt(l);
} catch (FileNotFoundException e) {
//no need to do anything here
}
}
}
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
count++;
PrintWriter outFile = new PrintWriter(
new Filereader(„count.txt“));
outFile.println(count);
outFile.close();
PrintWriter outBrowser = res.getWriter();
res.setContentType("text/html");
outBrowser.println("<H1> A web page counter </H1>");
outBrowser.println("<HR>");
.....
.....
}
public class Count extends HttpServlet {
int count = 0;
// a counter for the object
public void init() {
try {
BufferedReader in = new BufferedReader(
newFileReader(„count.txt“));
String l = in.readLine();
count = Integer.parseInt(l);
} catch (FileNotFoundException e) {
//no need to do anything here
}
}
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
}
}
Despues de incrementar,
count++;
abrir el archivo
PrintWriter outFile = new PrintWriter(
new Filereader(„count.txt“));
(sobreescribirlo)
outFile.println(count);
Escribir el nuevo número
outFile.close();
Cerrar archivo
PrintWriter outBrowser = res.getWriter();
res.setContentType("text/html");
outBrowser.println("<H1> A web page counter </H1>");
outBrowser.println("<HR>");
.....
.....
public class Count extends HttpServlet {
int count = 0;
// a counter for the object
public void init() {
try {
BufferedReader in = new BufferedReader(
newFileReader(„count.txt“));
String l = in.readLine();
count = Integer.parseInt(l);
} catch (FileNotFoundException e) {
//no need to do anything here
}
}
public void doGet ( HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException {
count++;
PrintWriter outFile = new PrintWriter(
new Filereader(„count.txt“));
outFile.println(count);
outFile.close();
PrintWriter outBrowser = res.getWriter();
El resto
res.setContentType("text/html");
es igual
outBrowser.println("<H1> A web page counter </H1>");
outBrowser.println("<HR>");
.....
.....
}
}
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.getRemoteHost();
– returns the IP number (like 133.8.109.158
• String s = request.getRemoteAddress();
– 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.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
int maxNumber = 0;
String maxIP = "";
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
IOException, ServletException {
}
}
int aleatorio = (int)(1 + Math.random()*100);
String ip = request.getRemoteAddr();
if (aleatorio > maxNumber) {
maxNumber = aleatorio;
maxIP = ip;
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1> Bienvenido </h1><br>");
out.println("<h2> Su dirección IP es "+ ip+ "<br>");
out.println("Su número es "+aleatorio+"<br><br>");
out.println("El numero mayor generado es "+maxNumber);
out.println("<br>Fue generado para "+maxIP);
out.close();
import java.io.*; import javax.servlet.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
int maxNumber = 0;
String maxIP = "";
Inicializacion variables para guardar
La IP y el valor del máximo
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
IOException, ServletException {
}
}
int aleatorio = (int)(1 + Math.random()*100);
String ip = request.getRemoteAddr();
if (aleatorio > maxNumber) {
maxNumber = aleatorio;
maxIP = ip;
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1> Bienvenido </h1><br>");
out.println("<h2> Su dirección IP es "+ ip+ "<br>");
out.println("Su número es "+aleatorio+"<br><br>");
out.println("El numero mayor generado es "+maxNumber);
out.println("<br>Fue generado para "+maxIP);
out.close();
import java.io.*; import javax.servlet.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
int maxNumber = 0;
String maxIP = "";
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
IOException, ServletException {
Generación número aleatorio
int aleatorio = (int)(1 + Math.random()*100);
String ip = request.getRemoteAddr();
Obtencion ip del cliente
}
}
if (aleatorio > maxNumber) {
maxNumber = aleatorio;
maxIP = ip;
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1> Bienvenido </h1><br>");
out.println("<h2> Su dirección IP es "+ ip+ "<br>");
out.println("Su número es "+aleatorio+"<br><br>");
out.println("El numero mayor generado es "+maxNumber);
out.println("<br>Fue generado para "+maxIP);
out.close();
import java.io.*; import javax.servlet.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
int maxNumber = 0;
String maxIP = "";
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
IOException, ServletException {
int aleatorio = (int)(1 + Math.random()*100);
String ip = request.getRemoteAddr();
}
}
Actualización de los datos
if (aleatorio > maxNumber) {
del máximo generado
maxNumber = aleatorio;
maxIP = ip;
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1> Bienvenido </h1><br>");
out.println("<h2> Su dirección IP es "+ ip+ "<br>");
out.println("Su número es "+aleatorio+"<br><br>");
out.println("El numero mayor generado es "+maxNumber);
out.println("<br>Fue generado para "+maxIP);
out.close();
import java.io.*; import javax.servlet.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
int maxNumber = 0;
String maxIP = "";
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
IOException, ServletException {
Enviar
info
al
cliente
}
}
int aleatorio = (int)(1 + Math.random()*100);
String ip = request.getRemoteAddr();
if (aleatorio > maxNumber) {
maxNumber = aleatorio;
maxIP = ip;
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1> Bienvenido </h1><br>");
out.println("<h2> Su dirección IP es "+ ip+ "<br>");
out.println("Su número es "+aleatorio+"<br><br>");
out.println("El numero mayor generado es "+maxNumber);
out.println("<br>Fue generado para "+maxIP);
out.close();
Descargar

Clase19(Servlets1)