Sunteți pe pagina 1din 77

1

Tema 7. Java Servlets

7.1. Introduccin. Contenedores de servlets.


7.2. El API de Servlets.
7.3. Ciclo de vida de un servlet. Peticiones y threads.
7.4. La peticin
7.5. La respuesta
7.6. Sesiones
7.7. Aplicaciones web
7.8. ServletContext
7.9. Colaboracin entre servlets
2

Tema 7. Java Servlets

7.1. Introduccin. Contenedores de servlets.


7.2. El API de Servlets.
7.3. Ciclo de vida de un servlet. Peticiones y threads.
7.4. La peticin
7.5. La respuesta
7.6. Sesiones
7.7. Aplicaciones web
7.8. ServletContext
7.9. Colaboracin entre servlets
3

Introduccin

Un servlet es un objeto Java que puede procesar


peticiones y retornar respuestas.
Habitualmente, esas peticiones y respuestas siguen el
protocolo HTTP y permiten aadir funcionalidad
dinmica a los servidores web
Un servlet es un componente web basado en tecnologa
Java, gestionado por un contenedor, que genera
contenido dinmico.
4

Contenedores de servlets
Un contenedor de servlets es una parte de un servidor
web o de un servidor de aplicaciones que:
ofrece servicios de red sobre los cuales se envan peticiones y
respuestas.
decodifica peticiones
formatea respuestas
contiene y gestiona el ciclo de vida de los servlets
Todos los contenedores de servlets deben soportar como
mnimo HTTP/1.0 pero pueden soportar opcionalmente
protocolos adicionales como HTTPS.
Un contenedor de servlets puede fijar restricciones de
seguridad en el entorno en el que el servlet se ejecuta
(por ejemplo, se puede limitar la creacin de nuevos
threads).
5

Contenedores de servlets
6

Contenedores de servlets

La tecnologa de servlets para la generacin de pginas


dinmicas puede integrarse de diferentes maneras con un
servidor web o con una aplicacin stand-alone:
1. Contenedores de servlets independientes. (Java Server)
2. Contenedores de servlets plug-in. (Native Server)
3. Contenedores de servlets empotrables.
7

Tema 7. Java Servlets

7.1. Introduccin. Contenedores de servlets.


7.2. El API de Servlets.
7.3. Ciclo de vida de un servlet. Peticiones y threads.
7.4. La peticin
7.5. La respuesta
7.6. Sesiones
7.7. Aplicaciones web
7.8. ServletContext
7.9. Colaboracin entre servlets
8

API de Servlets

javax.servlet:
Servlets genricos
Interfaces importantes de este paquete:
Servlet
ServletContext
RequestDispatcher
javax.servlet.http:
Servlets que implementan el protocolo HTTP.
Clases e interfaces importantes de este paquete:
HttpServlet
HttpServletRequest,
HttpServletResponse,
HttpSession,
Cookie
9

Implementando un servlet genrico

public void service(ServletRequest req, ServletResponse res)


throws ServletException, java.io.IOException
10

Proceso de una peticin


11

Implementando un servlet HTTP

protected void doGet(HttpServletRequest req, HttpServletResponse resp)


throws ServletException, java.io.IOException
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException
12

Implementando un servlet HTTP


13

Hello World Servlet

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpS ervlet {
public void doGet( HttpS ervletRequest req,
HttpS ervletResponse res)
throws S ervletE xception, IOE xception {
res.setContentT ype("text/html");
P rintWriter out = res.getWriter();
out.println("<HT M L >");
out.println("<HE AD><T IT L E >Hello World</T IT L E ></HE AD>");
out.println("<BODY>");
out.println("<BIG>Hello World</BIG>");
out.println("</BODY></HT M L >");
}
}
<HT ML>
<HE AD>
<T IT L E >Introductions</T IT L E >
</HE AD>
<BODY>
<FORM M E T HOD=GE T ACT ION ="/servlet/Hello">
If you don't mind me asking, what is your name?
<IN P UT T YP E =T E XT N AM E ="name"><P >
<IN P UT T YP E =S UBM IT >
</FORM >
</BODY>
</HT M L >
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Hello extends HttpS ervlet {
public void doGet(HttpS ervletRequest req, HttpS ervletResponse res)
throws S ervletE xception, IOE xception {
res.setContentT ype("text/html");
P rintWriter out = res.getWriter();
S tring name = req.getP arameter("name");
out.println("<HT ML >");
out.println("<HE AD><T IT L E >Hello, " + name + "</T IT L E ></HE AD>");
out.println("<BODY>");
out.println("Hello, " + name);
out.println("</BODY></HT M L >");
}
public S tring getS ervletInfo() {
return "A servlet that knows the name of the person to whom it's" +
"saying hello";
}
}Gestionar el mtodo POST
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doGet(req, res);
}

Y desde el HTML:

<FORM METHOD=POST ACTION="/servlet/Hello">


import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Deblink extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String contentType = req.getContentType(); // get the incoming type
if (contentType == null) return; // nothing incoming, nothing to do
res.setContentType(contentType); // set outgoing type to be incoming type
PrintWriter out = res.getWriter();
BufferedReader in = req.getReader();
String line = null;
while ((line = in.readLine()) != null) {
line = replace(line, "<BLINK>", "");
line = replace(line, "</BLINK>", "");
out.println(line);
}
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doGet(req, res);
}
private String replace(String line, String oldString, String newString) {
int index = 0;
while ((index = line.indexOf(oldString, index)) >= 0) {
// Replace the old string with the new string (inefficiently)
line = line.substring(0, index) +
newString +
line.substring(index + oldString.length());
index += newString.length();
}
17

Tema 7. Java Servlets

7.1. Introduccin. Contenedores de servlets.


7.2. El API de Servlets.
7.3. Ciclo de vida de un servlet. Peticiones y threads.
7.4. La peticin
7.5. La respuesta
7.6. Sesiones
7.7. Aplicaciones web
7.8. ServletContext
7.9. Colaboracin entre servlets
18

Ciclo de vida de un servlet

1. Carga de la clase e instanciacin


2. Inicializacin:
init()

3. Servicio de
peticiones:
service()

4. Finalizacin:
destroy()
19

Servlet contador
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class S impleCounter extends HttpS ervlet {


int count = 0;
public void doGet(HttpS ervletRequest req,
HttpS ervletResponse res)
throws S ervletE xception, IOE xception {
res.setContentT ype("text/plain");
P rintWriter out = res.getWriter();
count++;
out.println("S ince loading, this servlet has been accessed " +
count + " times.");
}
}
Qu pasa si el contenedor de servlets decide
destruir el servlet por falta de memoria???
20

Servlet contador con init


public class InitCounter extends HttpS ervlet {

int count;

public void init(S ervletConfig config) throws S ervletE xception {


super.init(config);
S tring initial = config.getInitP arameter("initial");
try {
count = Integer.parseInt(initial);
}
catch (N umberFormatE xception e) {
count = 0;
}
}

public void doGet(HttpS ervletRequest req, HttpS ervletResponse res)


throws S ervletE xception, IOE xception {
res.setContentT ype("text/plain");
P rintWriter out = res.getWriter();
count++;
out.println("Since loading (and with a possible initialization");
out.println("parameter figured in), this servlet has been accessed");
out.println(count + " times.");
}
21

Servlet contador con init y destroy (I)


public void init(ServletConfig config) throws ServletException {
// Always call super.init(config) first (servlet mantra #1)
super.init(config);

// Try to load the initial count from our saved persistent state
try {
FileReader fileReader = new FileReader("InitDestroyCounter.initial");
BufferedReader bufferedReader = new BufferedReader(fileReader);
String initial = bufferedReader.readLine();
count = Integer.parseInt(initial);
return;
}
catch (FileNotFoundException ignored) { } // no saved state
catch (IOException ignored) { } // problem during read
catch (NumberFormatException ignored) { } // corrupt saved state

// No luck with the saved state, check for an init parameter


String initial = getInitParameter("initial");
try {
count = Integer.parseInt(initial);
return;
}
catch (NumberFormatException ignored) { } // null or non-integer value

// Default to an initial count of "0"


22

Servlet contador con init y destroy (II)


public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
count++;
out.println("Since the beginning, this servlet has been accessed " +
count + " times.");
}

public void destroy() {


saveState();
}

public void saveState() {


// Try to save the accumulated count
try {
FileWriter fileWriter = new FileWriter("InitDestroyCounter.initial");
String initial = Integer.toString(count);
fileWriter.write(initial, 0, initial.length());
fileWriter.close();
return;
}
catch (IOException e) { // problem during write
// Log the exception. See Chapter 5, "Sending HTML Information".
23

Clases servlet y objetos servlets y threads

El contenedor de servlets crea una nica instancia de


cada servlet por declaracin de servlet que aparezca en el
descriptor de despliegue.
Si el servlet se incluye dentro de una aplicacin marcada
como distribuible, el contenedor crea solo una instancia
por declaracin de servlet y por mquina virtual.
Dado que una misma clase puede aparecer en diferentes
declaraciones de servlet nunca deben utilizarse
variables estticas para almacenar informacin entre
peticiones.
24

Servicio de peticiones y threads

Un contenedor de servlets puede invocar al mtodo


service() (o doGet, doPost,...) de forma concurrente a
travs de varios threads.
Por tanto todos los servlets deben sincronizar
adecuadamente el acceso a objetos compartidos.
25

Servlet contador
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class S impleCounter extends HttpS ervlet {


int count = 0;
public void doGet(HttpS ervletRequest req,
HttpS ervletResponse res)
throws S ervletE xception, IOE xception {
res.setContentT ype("text/plain");
P rintWriter out = res.getWriter();
count++;
out.println("S ince loading, this servlet has been accessed " +
count + " times.");
}
}
Problemas???
26

Problemas de sincronizacin con el contador

count++ // Thread 1
count++ // Thread 2
out.println // Thread 1
out.println // Thread 2
27

Sincronizando el contador. Alternativas.


public synchronized void doGet(HttpServletRequest req,
HttpServletResponse res) 1

PrintWriter out = res.getWriter();


synchronized(this) {
count++; 2
out.println("Since loading, this servlet has been accessed " +
count + " times.");
}

PrintWriter out = res.getWriter();


int local_count;
synchronized(this) {
local_count = ++count; 3
}
out.println("Since loading, this servlet has been accessed " +
local_count + " times.");
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HolisticCounter extends HttpS ervlet {


static int classCount = 0; // shared by all instances
int count = 0; // separate for each servlet
static Hashtable instances = new Hashtable(); // also shared
public void doGet(HttpS ervletRequest req, HttpS ervletResponse res)
throws S ervletE xception, IOE xception {
res.setContentT ype("text/plain");
P rintWriter out = res.getWriter();
count++;
out.println("S ince loading, this servlet instance has been accessed " +
count + " times.");
// Keep track of the instance count by putting a reference to this
// instance in a Hashtable. Duplicate entries are ignored.
// T he size() method returns the number of unique instances stored.
instances.put(this, this);
out.println("T here are currently " +
instances.size() + " instances.");
classCount++;
out.println("Across all instances, this servlet class has been " +
"accessed " + classCount + " times.");
}
}
29

Tema 7. Java Servlets

7.1. Introduccin. Contenedores de servlets.


7.2. El API de Servlets.
7.3. Ciclo de vida de un servlet. Peticiones y threads.
7.4. La peticin
7.5. La respuesta
7.6. Sesiones
7.7. Aplicaciones web
7.8. ServletContext
7.9. Colaboracin entre servlets
30

ServletRequest (I)
Parmetros
Funciones que permiten acceder a los parmetros de una peticin. Los
parmetros se reciben siempre del cliente.

public java.lang.String getParameter(java.lang.String name)


Retorna el valor del parmetro cuyo nombre es name como un String, o
null si el parmetro no existe.
public java.util.Map getParameterMap()
Retorna una tabla de hash con los parmetros de la peticin.
public java.util.Enumeration getParameterNames()
Retorna una Enumeration de objetos String conteniendo los nombres de
los parmetros de la peticin.
public java.lang.String[] getParameterValues(java.lang.String name)
Retorna un array de String con los valores de un parmetro, o null si el
parmetro no existe.
31

ServletRequest (II)
Atributos
Los atributos permiten la comunicacin entre servlets que se pasen una
misma peticin (pipeline) o entre filtros y servlets.

public java.lang.Object getAttribute(java.lang.String name)


Retorna el valor del atributo name o null si no existe.
public java.util.Enumeration getAttributeNames()
Retorna una Enumeration de objetos String conteniendo los nombres de
los atributos de la peticin.
public void removeAttribute(java.lang.String name)
Elimina el atributo name de la peticin.
public void setAttribute(java.lang.String name, java.lang.Object o)
Fija el valor del atributo name al objeto o.
32

HTTPServletRequest (I)
Cabeceras
Funciones que permiten acceder a las cabeceras HTTP de la peticin.

public java.lang.String getHeader(java.lang.String name)


Retorna el valor de la primera cabecera de peticin con nombre name.
public java.util.Enumeration getHeaderNames()
Retorna los nombres de todas las cabeceras de peticin.
public java.util.Enumeration getHeaders(java.lang.String name)
Retorna todas las cabeceras de peticin con nombre name.
public int getIntHeader(java.lang.String name)
public long getDateHeader(java.lang.String name)
Retornan cabeceras de tipos especficos.
33

HTTPServletRequest (II)
Descomposicin de elementos en el camino de una peticin
RequestURI = ContextPath + ServletPath + PathInfo

public java.lang.String getRequestURI()


Retorna la parte del URL de la peticin que va desde el nombre de
servidor hasta el interrogante o hasta el final si ste no aparece.
public java.lang.String getContextPath()
Retorna el fragmento de URL que indica el contexto de la peticin.
public java.lang.String getServletPath()
Retorna el fragmento de URL que permite seleccionar el servlet.
public java.lang.String getPathInfo()
Retorna el resto del RequestURI (no ContextPath y no ServletPath).
34

Informacin de la peticin
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class RequestInfo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Request Information Example</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3>Request Information Example</h3>");
out.println("Method: " + request.getMethod());
out.println("Request URI: " + request.getRequestURI());
out.println("Protocol: " + request.getProtocol());
out.println("PathInfo: " + request.getPathInfo());
out.println("Remote Address: " + request.getRemoteAddr());
out.println("</body>");
out.println("</html>");
}
}
35

Parmetros de la peticin
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class RequestParamExample extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse


response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("GET Request. No Form Data Posted");
}

public void doPost(HttpServletRequest request, HttpServletResponse res)


throws IOException, ServletException
{
Enumeration e = request.getParameterNames();
PrintWriter out = res.getWriter ();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = request.getParameter(name);
out.println(name + " = " + value);
}
}
}
36

Cabeceras de la peticin
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class RequestHeaderExample extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse


response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = request.getHeader(name);
out.println(name + " = " + value);
}
}
}
37

Tema 7. Java Servlets

7.1. Introduccin. Contenedores de servlets.


7.2. El API de Servlets.
7.3. Ciclo de vida de un servlet. Peticiones y threads.
7.4. La peticin
7.5. La respuesta
7.6. Sesiones
7.7. Aplicaciones web
7.8. ServletContext
7.9. Colaboracin entre servlets
38

ServletResponse
Enviando informacin
El objeto respuesta dispone de mtodos para incluir en la respuesta datos
binarios y de texto.

public ServletOutputStream getOutputStream() throws IOException


Retorna un ServletOutputStream, adecuado para el envo de datos
binarios en la respuesta.
public java.io.PrintWriter getWriter() throws IOException
Retorna un PrintWriter que permite enviar informacin textual al
cliente.
39

HTTPServletResponse (I)
Fijando cabeceras
Un servlet puede fijar las cabeceras de la respuesta antes de enviar
ninguna otra informacin, utilizando los mtodos:

public void addHeader(java.lang.String name, java.lang.String value)


Aade value al conjunto de valores de la cabecera name.
public void setHeader(java.lang.String name, java.lang.String value)
Fija a value el valor de la cabecera name.
public void addDateHeader(java.lang.String name, long date)
public void addIntHeader(java.lang.String name, int value)
public void setDateHeader(java.lang.String name, long date)
public void setIntHeader(java.lang.String name, int value)
Lo mismo con tipos especficos.
40

HTTPServletResponse (II)
Retornando redirecciones y errores
Si se desea retornar una respuesta indicando que ha habido un error o
redirigir a otra pgina, podemos utilizar:

public void sendError(int sc) throws IOException


Enva una respuesta de error al cliente utilizando el cdigo de estado
especificado y limpiando el buffer.
public void sendError(int sc, java.lang.String msg) throws IOException
Enva una respuesta de error en forma de pgina HTML conteniendo el
texto que incluya la variable msg.
public void sendRedirect(java.lang.String location) throws IOException
Enva una respuesta de redireccin temporal al cliente utilizando
location como URL.
41

HTTPServletResponse (III)

Cierre del objeto respuesta


El objeto respuesta se cierra cuando se da una de las siguientes
condiciones:
Finaliza el mtodo service()
Se haba fijado el tamao mximo de la respuesta (va
setContextLegth()) y ya se ha escrito esa cantidad de datos.
Se llama a sendError()
Se llama a sendRedirect()
El objeto respuesta NO SE PUEDE UTILIZAR despus de que se haya
cerrado.
42

Tema 7. Java Servlets

7.1. Introduccin. Contenedores de servlets.


7.2. El API de Servlets.
7.3. Ciclo de vida de un servlet. Peticiones y threads.
7.4. La peticin
7.5. La respuesta
7.6. Sesiones
7.7. Aplicaciones web
7.8. ServletContext
7.9. Colaboracin entre servlets
43

Sesiones (I)

Los servlets nos proveen con un mecanismo automtico de


gestin de sesiones. Opciones:
Cookies. JSESSIONID
URL rewriting.
http://www.miserv.com/servletPepe;jsessionid=2324
Sesiones SSL.
Las sesiones existen a nivel de aplicacin web (ServletContext),
es decir, se comparten entre los diferentes servlets de una
aplicacin.
Las sesiones se encapsulan como instancias de la clase
HTTPSession.
44

Sesiones (II)

Obteniendo la sesin
Usamos la peticin (HTTPServletRequest) para acceder a la sesin

public HttpSession getSession()


Retorna la sesin asociada con la peticin. Si no existe, crea una.
public HttpSession getSession(boolean create)
Retorna la sesin asociada con la peticin. Si no existe, y create es
cierto, crea una.
45

Sesiones (III)

Atributos de sesin
Podemos asociar atributos a una sesin, para mantener el estado del
cliente entre dos peticiones.

public java.lang.Object getAttribute(java.lang.String name)


Retorna el valor del atributo de nombre name
public java.util.Enumeration getAttributeNames()
Retorna una enumeracin con los nombres de todos los atributos
public void setAttribute(java.lang.String name, java.lang.Object value)
Fija el valor del atributo de nombre name asignndole value.
public void removeAttribute(java.lang.String name)
Elimina el atributo de nombre name
46

Sesiones (IV)

Finalizacin de sesin
Una sesin finaliza cuando pasa un cierto tiempo sin recibirse peticiones
que se identifiquen como pertenecientes a esa sesin. Se puede fijar el
tiempo de inactividad para que la sesin finalice.

public void setMaxInactiveInterval(int interval)


Especifica el tiempo, en segundos, entre peticiones de un mismo cliente
antes de que el contenedor de servlets invalide la sesin.
Recibiendo Cookies
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class CookieExample extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse


response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();

// print out cookies

Cookie[] cookies = request.getCookies();


for (int i = 0; i < cookies.length; i++) {
Cookie c = cookies[i];
String name = c.getName();
String value = c.getValue();
out.println(name + " = " + value);
}
}
}
Enviando Cookies
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class CookieExample extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse


response)
throws IOException, ServletException
{
response.setContentType("text/html");

String name = request.getParameter("cookieName");


if (name != null && name.length() > 0) {
String value = request.getParameter("cookieValue");
Cookie c = new Cookie(name, value);
response.addCookie(c);
}
}
}
49

Accediendo a la sesin (I)


import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SessionExample extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse


response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();

HttpSession session = request.getSession(true);

// print session info

Date created = new Date(session.getCreationTime());


Date accessed = new Date(session.getLastAccessedTime());
out.println("ID " + session.getId());
out.println("Created: " + created);
out.println("Last Accessed: " + accessed);
50

Accediendo a la sesin (II)

// set session info if needed

String dataName = request.getParameter("dataName");


if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}

// print session contents

Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println(name + " = " + value);
}
}
}
51

Carrito de la compra

public class CashierServlet extends HttpServlet {


public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

// Get the user's session and shopping cart


HttpSession session = request.getSession();
ShoppingCart cart =
(ShoppingCart)session.
getAttribute("cart");
...
// Determine the total price of the user's books
double total = cart.getTotal();
...
}
}
52

Tema 7. Java Servlets

7.1. Introduccin. Contenedores de servlets.


7.2. El API de Servlets.
7.3. Ciclo de vida de un servlet. Peticiones y threads.
7.4. La peticin
7.5. La respuesta
7.6. Sesiones
7.7. Aplicaciones web
7.8. ServletContext
7.9. Colaboracin entre servlets
53

Aplicaciones web

Una aplicacin web es una coleccin de servlets,


pginas HTML, clases y otros recursos que comprenden
una aplicacin completa dentro de un servidor web.
Una aplicacin web se enraiza en un camino especfico
dentro de un servidor web. Ejemplo: La aplicacin web
de gestin de catlogo se puede encontrar bajo
http://www.miempresa.com/catalog.
54

Elementos de una aplicacin web

Servlets
Pginas JSP
Clases Java de utilidad
Documentos estticos (html, imgenes, sonidos, etc.)
Applets, beans y clases de la parte cliente de la
aplicacin
Informacin descriptiva que enlaza los elementos
anteriores.
55

Estructura de directorios

Una aplicacin web existe como una estructura jerrquica de


directorios
Por ejemplo, para un aplicacin enraizada en el servidor en
/catalog, el fichero index.html que se encuentre en la raiz de la
jerarquia de directorios de la aplicacin web ser retornado cuando
el usuario solicite /catalog/index.html.
Existe un directorio especial dentro de la jerarqua de la aplicacin
llamado WEB-INF. Este directorio no es visible desde el
exterior, pero si para los servlets de la aplicacin utilizando
getResource. Los contenidos del directorio WEB-INF son:
/WEB-INF/web.xml: El descriptor de despliegue. Explica al contenedor de
servlets lo que contiene la aplicacin.
/WEB-INF/classes/ Es el directorio donde se encuentran los .class de los
servlets y del resto de clases Java que utilice la aplicacin
/WEB-INF/lib/*.jar Es el rea predefinida para archivos Java Archive.
56

Estructura de directorios. Ejemplo

/index.html
/howto.jsp
/feedback.jsp
/images/banner.gif
/images/jumping.gif
/WEB-INF/web.xml
/WEB-INF/lib/jspbean.jar
/WEB-INF/classes/com/miempresa/servlets/MiServlet.class
/WEB-INF/classes/com/miempresa/util/MiClaseUtilidad.class

Las aplicaciones web se empaquetan en archivos .war


(Web Archive).
57

Descriptor de despliegue

Incluye informacin relativa a:


Datos generales de la aplicacin web (iconos, nombre,
descripcin)
Parmetros de inicializacin de la aplicacin web (cada
aplicacin los define y usa para lo que considera oportuno)
Configuracin de la gestin de sesiones (timeout)
Declaracin de servlets
Mapeos de servlets
Otros: Declaracin de taglibs, lista de archivos de bienvenida,
pginas de error, mapeos de tipos MIME, declaracin de clases
listener del ciclo de vida de la aplicacin, definicin de filtros,
mapeos de filtros, seguridad, acceso a objetos JNDI.
59

Servlets y mapeos de servlets


60

Mapeos de servlets. Matching

Tipos de matching:
/esto/es/un/camino/* -> matching de prefijos
/esto/es/un/camino/exacto -> matching exacto
*.zp -> matching de extensin
/ -> matching para definir un servlet por defecto
Algoritmo de mapeo:
1. Si existe un matching exacto entre el path solicitado y el del servlet, se envia
la peticin al servlet.
2. Se intenta encontrar de forma recursiva, el mayor prefijo que haga matching y
se envia la peticin al servlet.
3. Si el ultimo segmento de la URL contiene una extensin, se busca un servlet
que gestione esa extensin
4. Si se ha definido, se enva la peticin al servlet por defecto.
61

Tema 7. Java Servlets

7.1. Introduccin. Contenedores de servlets.


7.2. El API de Servlets.
7.3. Ciclo de vida de un servlet. Peticiones y threads.
7.4. La peticin
7.5. La respuesta
7.6. Sesiones
7.7. Aplicaciones web
7.8. ServletContext
7.9. Colaboracin entre servlets
62

ServletContext (I)
La interficie ServletContext define la vista que un servlet tiene de la
apliacin web en la que est contenido. Un servlet puede utilizar el
ServletContext para realizar logs, obtener referencias URL a recursos y
fijar y almacenar atributos a los que otros servlets de la misma aplicacin
pueden acceder. Existe una instancia de ServletContext por cada
aplicacin web.
Parmetros de inicializacin
Permiten acceder a los parmetros de inicializacin de la aplicacin web
especificados en el descriptor de despliegue

public java.lang.String getInitParameter(java.lang.String name)


Retorna el valor de inicializacin de name
public java.util.Enumeration getInitParameterNames()
Retorna una enumeracin con los nombres de los parmetros de
inicializacin
63

ServletContext (II)
Atributos de contexto
Permiten compartir informacin entre servlets que forman parte de la misma
aplicacin web. Si la aplicacin es distribuida, solo entre los que corren
en la misma mquina virtual

public java.lang.Object getAttribute(java.lang.String name)


Retona el objeto que se ha asociado con el nombre name.
public java.util.Enumeration getAttributeNames()
Retorna una enumeracin con los nombres de los atributos.
public void removeAttribute(java.lang.String name)
Elimina el atributo de nombre name.
public void setAttribute(java.lang.String name, java.lang.Object object)
Fija el valor del atributo de nombre name al objeto object.
64

ServletContext (III)
Recursos
La interfaz ServletContext ofrece acceso directo a la jerarqua de contenidos
estticos que son parte de la aplicacin web como HTML's, GIF's, etc.

public java.net.URL getResource(java.lang.String path)


throws MalformedURLException
Nos permite construir la URL de un recurso local a nuestro sistema de
ficheros.
public java.io.InputStream getResourceAsStream(java.lang.String path)
Retorna el recurso que se encuentra en el camino path como un
InputStream.
65

ServletContext (IV)
Log
La interfaz ServletContext nos ofrece la posibilidad de escribir informacin
en el fichero de log del servidor.

void log(java.lang.String msg)


Escribe el mensaje a un fichero de log del servlet, habitualmente en el log
de eventos. El nombre y tipo del fichero log es especfico para cada
contenedor de servlets.
void log(java.lang.String message, java.lang.Throwable throwable)
Escribe en un fichero log del servlet un menaje explicatorio y la traza de
la pila dada una excepcin
Listener
Filtros y mapeos de filtros
ServletContext
71

Tema 7. Java Servlets

7.1. Introduccin. Contenedores de servlets.


7.2. El API de Servlets.
7.3. Ciclo de vida de un servlet. Peticiones y threads.
7.4. La peticin
7.5. La respuesta
7.6. Sesiones
7.7. Aplicaciones web
7.8. ServletContext
7.9. Colaboracin entre servlets
72

RequestDispatcher

Despachando peticiones
Es posible que un servlet necesite la ayuda de otros servlets, JSP's o
HTML's para generar partes de la respuesta. O bien decida hacer parte
del trabajo y despus enviar la peticin a otro para que contine. Para
eso se usan los ResquestDispatcher.

public void forward(ServletRequest request, ServletResponse response)


throws ServletException, IOException
Enva una peticin de un servlet a otro recurso (servlet, fichero JSP o
fichero HTML) del servidor.
public void include(ServletRequest request, ServletResponse response)
throws ServletException, IOException
Incluye el contenido de un recurso (servlet, fichero JSP o fichero
HTML) en la respuesta
73

Obteniendo el request dispatcher de un servlet o


JSP de otra aplicacin web
public ServletContext getContext(java.lang.String uripath)

public class MiServlet extends HTTPServlet {


public void doGet(HTTPServletRequest req,HTTPServletResponse res) {
...
// Obtenemos el contexto del servlet actual
ServletContext sc = getServletContext()
// Le solicitamos que encuentre el contexto del servlet
// que queremos usar
ServletContext sc2 = sc.getContext(app2);
// Obtenemos el Request dispatcher a partir del nuevo contexto
RequestDispatcher rd = sc2.getRequestDispatcher(/servletUI);
rd.forward(req,resp);
}
}
74

Obteniendo el request dispatcher de un servlet o


JSP de nuestra misma aplicacin web

public RequestDispatcher
getRequestDispatcher(java.lang.String path)

Por ejemplo:

public class MiServlet extends HTTPServlet {


public void doGet(HTTPServletRequest req,HTTPServletResponse res) {
...
RequestDispatcher rd = req.getRequestDispatcher(servletUI);
rd.forward(req,resp);
}
}
75

RequestDispatcher (II)

Imaginemos un servlet que recibe un pedido, almacena su informacin, y a


continuacin quiere mostrar la pgina de que el pedido se ha almacenado
correctamente que sabemos que esta en
/pags-staticas/pedidoOK.html.

public void doGet (HTTPServletRequest req,HTTPServletResponse resp){


...
almacenarPedido();
RequestDispatcher rd = req.getRequestDispatcher(/pags-
staticas/pedidoOK.html);
rd.forward(req,resp);
...
(lo que vaya aqu nunca se ejecutar).
}
76

RequestDispatcher (III)

Imaginemos que nuestra pgina web se divide en dos secciones

MEN PRINCIPAL

public void doGet (HTTPServletRequest req,HTTPServletResponse resp){


... // HTML previo del cuadro
RequestDispatcher rd = req.getRequestDispatcher(/menu.jsp);
rd.include(req,resp);
... // HTML intermedio del cuadro
RequestDispatcher rd2 = req.getRequestDispatcher(/main.jsp);
rd2.include(req,resp);
... //HTML final del cuadro
}
77

Eventos en el ciclo de vida

S-ar putea să vă placă și