servlet basics

118
1 Servlet Servlet (Fundamentos) (Fundamentos) ) )

Upload: darwin-durand

Post on 25-May-2015

615 views

Category:

Education


1 download

TRANSCRIPT

Page 1: SERVLET BASICS

1

ServletServlet(Fundamentos)(Fundamentos)

))

Page 2: SERVLET BASICS

2

Tópicos Servlet – la gran figura de J2EE Servlet - modelo request & response Servlet – ciclo de vida Servlet – alcance de los objetos Servlet request Servlet response: Status, Header, Body Tratamiento de errores

Page 3: SERVLET BASICS

3

Tópicos avanzados:

Session Tracking Servlet Filters Eventos del ciclo de vida del servlet Including, forwarding to, y redirect a otros

recursos de la web Tratamiento de la concurrencia Invoker Servlet

Page 4: SERVLET BASICS

4

Servlet Servlet La gran figura de J2EELa gran figura de J2EE

Page 5: SERVLET BASICS

5

Arquitectura J2EE 1.2Java Servlet A Java program thatextends the functionality of a Webserver, generating dynamic contentand interacting with Web clientsusing a request-responseparadigm .

An extensible Web technology that uses template data,custom elements, scripting languages, and server-sideJava objects to return dynamic content to a client .Typically the template data is HTML or XML elements.The client is often a Web browser .

An extensible Web technology that uses template data,custom elements, scripting languages, and server-sideJava objects to return dynamic content to a client .Typically the template data is HTML or XML elements.The client is often a Web browser .

Page 6: SERVLET BASICS

6

¿Dónde estan los Servlets y JSP?

Web Tier EJB Tier

Page 7: SERVLET BASICS

7

¿Qué es un Servlet? Objetos Java™ objects que estan basados

en un marco de trabajo y APIs los cuales extienden la funcionalidad de un servidor HTTP.

Mapeado a un URL y manejado por el contenedor con una arquitectura simple

Disponible y ejecutable en la gran mayoria de servidores web y servidores de aplicaciones

Independiente de la plataforma y servidor

Page 8: SERVLET BASICS

8

Primer código Servlet

Public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response){ response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<title>Hello World!</title>"); } ...}

Page 9: SERVLET BASICS

9

Servlet

Servlet

Escrito en C, C++, Visual Basic y Perl

Dificil de mantener, no es escalable, no es administrable

Problemas de seguridad

Ineficiente uso de recursos

Especifico a la plataforma y aplicación

Escrito en Java Poderoso y eficiente Promueve la

escalabilidad, reusabilidad (basado en componentes)

c

Construido bajo la seguridad del lenguaje java

Independiente de la plataforma y portable

CGI

Page 10: SERVLET BASICS

10

Servlet vs. CGI

CGIBased

Webserver

CGIBased

Webserver

Request CGI1Child for CGI1

CGIBased

Webserver

Servlet Based Webserver

JVM

Request CGI1Child for CGI1

Request Servlet1

CGIBased

Webserver

Servlet Based Webserver

JVMServlet1

Request CGI1Child for CGI1

Request CGI2

Request Servlet1

CGIBased

WebserverChild for CGI2

Servlet Based Webserver

JVMServlet1

Request CGI1Child for CGI1

Request CGI2

Request Servlet1

Request Servlet2

CGIBased

WebserverChild for CGI2

Servlet Based Webserver

JVMServlet1

Servlet2

Request CGI1Child for CGI1

Request CGI2

Request CGI1

Request Servlet1

Request Servlet2

CGIBased

WebserverChild for CGI2

Child for CGI1

Servlet Based Webserver

JVMServlet1

Servlet2

Request CGI1Child for CGI1

Request CGI2

Request CGI1

Request Servlet1

Request Servlet2

Request Servlet1

CGIBased

WebserverChild for CGI2

Child for CGI1

Servlet Based Webserver

JVMServlet1

Servlet2

Request CGI1Child for CGI1

Page 11: SERVLET BASICS

11

Ventajas de los Servlet No tiene las limitaciones de los CGI Muchas herramientas y servidores Web en el

mercado soportan Servlet Acceso a la familia entera de APIs Java Confiable, mejor performance y escalabilidad Independiente de la plataforma y servidor Seguro Muchos servidores permitir un refresco automatico

de servlets por accion administrativa

Page 12: SERVLET BASICS

12

¿Qué es la tecnología JSP? Permite la separación de lógica de

negocio y la presentación− La presentacion es generalmente en la

forma de HTML o XML/XSLT− La logica de negocios es implementada

como Java Beans o custom tags− Mejor mantenimiento, reusabilidad

Extensible via custom tags Construido en base a la tecnologia de

servlets

Page 13: SERVLET BASICS

13

¿Qué es una pagina JSP? Un documento basado en texto

capaza de retornar contenido dinamico a un browser

Contiene tanto contenido estatico como dinamico

− Contenido estatico: HTML, XML− Contenido dinamico: código de

programación, y JavaBeans, custom tags

Page 14: SERVLET BASICS

14

Código de ejemplo JSP<html> Hello World!<br><jsp:useBean id="clock" class=“calendar.JspCalendar” /> Today is<ul><li>Day of month: <%= clock.getDayOfMonth() %><li>Year: <%= clock.getYear() %></ul>

</html>

Page 15: SERVLET BASICS

15

JSP

JSP

• Codigo HTML en java

• Cualquier forma de Data

• No es facil para el autor construir una pagina Web

• Código Java en HTML• Texto estructurado• Muy facil de construir

la pagina web para el autor

• El codigo es compilado en un servlet

Servlets

Page 16: SERVLET BASICS

16

Beneficios JSP Contenido y logica para mostrar el contenido

estan separados Simplifica el desarrollo con JSP, JavaBeans y

custom tags Soporta la reutilizacion de software a traves

de componentes Se recompila automaticamente cuando los

cambios son hechos en el codigo JSP Facililidad de uso para el autor de paginas

web Independiente de la plataforma

Page 17: SERVLET BASICS

17

¿Cuando usar Servlet vs JSP?

Extender la funcionalidad de un servidor Web para soportar un nuevo formato de archivo

Generar objetos que no contienen HTML como son los graficos (pie charts)

Evitar retornar HTML directamente desde tus servlets el mayor tiempo posible

Page 18: SERVLET BASICS

18

¿Debería yo usar Servlet or JSP? En la practica, servlet y JSP son usados

juntos− via la arquitectura MVC (Model, View,

Controller)− Servlet maneja el Controller − JSP maneja el View

Page 19: SERVLET BASICS

19

Modelo Modelo Servlet Request &Servlet Request &

ResponseResponse

Page 20: SERVLET BASICS

20

Modelo Servlet Request y Response

Servlet

Response

Request

BrowserHTTP

WebWebServerServer

Servlet Container

Response

Request

Page 21: SERVLET BASICS

21

¿Que es lo que hace el Servlet? Recibe request del cliente(mayormente en la

forma de HTTP request)

f

Extrae cierta informacion del request Genera contenido o procesa logica de

negocio (accesando a base de datos, invocando EJBs, etc)

i

Crea y envía response al cliente (mayormente en la forma de HTTP) o hace forward del request a otro servlet o pagina JSP

Page 22: SERVLET BASICS

22

Requests y Responses ¿Que es un request?

− Informacion que es envia del cliente al servidor Quien hizo el request Que data es enviada Que HTTP Headers son enviados

¿Que es un response? − Informacion enviada al cliente desde el server

Text(html, plain) o data binaria(image) HTTP headers, cookies, etc

Page 23: SERVLET BASICS

23

HTTP

HTTP request contiene− header− Un metodo

Get: Data de entrada que es pasada como parte de un URL

Post: Data de entrada es pasada dentro del mensaje body

Put Header

− Información del request

Page 24: SERVLET BASICS

24

HTTP GET y POST Son los request del cliente más comunes

− HTTP GET & HTTP POST GET requests:

− La informacion ingresada por el usuario es añadida a el URL en un query string

− Puede enviar solo una cantidad de data (limitado) .../servlet/ViewCourse?FirstName=Jose&LastName=Diaz

POST requests:− La informacion es enviada como data(no añadido a un

URL)

U

− Puede enviar cualquier cantidad de informacion

Page 25: SERVLET BASICS

25

Primer Servletimport javax.servlet.*;import javax.servlet.http.*;import java.io.*;Public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<title>First Servlet</title>"); out.println("<big>Hello Code Camp!</big>"); }}

Page 26: SERVLET BASICS

26

Interfaces y ClassesInterfaces y Classesde Servletde Servlet

Page 27: SERVLET BASICS

27

Servlet Interfaces & ClassesServlet

GenericServlet

HttpServlet

ServletRequest

HttpServletRequest

ServletResponse

HttpServletResponse

HttpSession

Page 28: SERVLET BASICS

28

Ciclo de vida Ciclo de vida del Servlet del Servlet

Page 29: SERVLET BASICS

29

Ciclo de vida del Servlet

Http request

Http response

Load Invoke No

Yes

Client Server

Is Servlet Loaded?

Servlet Container

RunServlet

Page 30: SERVLET BASICS

30

Ciclo de vida desde la perspectiva de métodos

Ready

doGet( ) doPost( )

service( )

destroy( )init( )

Request parameters

Init parameters

Page 31: SERVLET BASICS

31

Métodos del Servlet Invocado por el contenedor

− El contenedor controla el ciclo de vida del servlet Definido en

− javax.servlet.GenericServlet class o init()

i

destroy()

d

service() – este es un metodo abstract− javax.servlet.http.HttpServlet class

doGet(), doPost(), doXxx()

d

service() - implementación

Page 32: SERVLET BASICS

32

Métodos del Servlet init()

i

− Invocado una vez cuando el servlet es instanciado por primera vez

− Es idea para configurar algo en este metodo Configurando a una conección a base de datos

destroy()

d

− Invocado antes que la instancia servlets sea removida

− Ideal para liberar recursos Cerrar una conección a base de datos

Page 33: SERVLET BASICS

33

Ejemplo: init() de CatalogServlet.javapublic class CatalogServlet extends HttpServlet { private BookDB bookDB; // Perform any one-time operation for the servlet, // like getting database connection object.

// Note: In this example, database connection object is assumed // to be created via other means (via life cycle event mechanism)

/

// and saved in ServletContext object. This is to share a same // database connection object among multiple servlets. public void init() throws ServletException { bookDB = (BookDB)getServletContext(). getAttribute("bookDB"); if (bookDB == null) throw new UnavailableException("Couldn't get database."); } ...}

Page 34: SERVLET BASICS

34

Ejemplo: init() obteniendo parametros de configuraciónpublic void init(ServletConfig config) throws

ServletException { super.init(config); String driver = getInitParameter("driver"); String fURL = getInitParameter("url"); try { openDBConnection(driver, fURL); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e){ e.printStackTrace(); }}

Page 35: SERVLET BASICS

35

Configurando parámetros de inicialización en web.xml <web-app> <servlet> <servlet-name>chart</servlet-name> <servlet-class>ChartServlet</servlet-class> <init-param> <param-name>driver</param-name> <param-value> COM.cloudscape.core.RmiJdbcDriver </param-value> </init-param> <init-param> <param-name>url</param-name> <param-value> jdbc:cloudscape:rmi:CloudscapeDB </param-value> </init-param> </servlet></web-app>

Page 36: SERVLET BASICS

36

Ejemplo: destroy()

E

public class CatalogServlet extends HttpServlet { private BookDB bookDB; public void init() throws ServletException { bookDB = (BookDB)getServletContext(). getAttribute("bookDB"); if (bookDB == null) throw new UnavailableException("Couldn't get database."); } public void destroy() { bookDB = null; } ...}

Page 37: SERVLET BASICS

37

Métodos del Servlet service() javax.servlet.GenericServlet class

− Método abstracto service() in javax.servlet.http.HttpServlet class

− Metodo concreto(implementación)

M

− Delega a doGet(), doPost(), etc− No sobreescribir este metodo

doGet(), doPost(), doXxx() en javax.servlet.http.HttpServlet

− Maneja HTTP GET, POST, etc. requests− Sobreescribe estos metodos en tu servlet para darle

un comportamiento particular

Page 38: SERVLET BASICS

38

service() & doGet()/doPost()

d

El método service() toma requests y responses genericos:

− service(ServletRequest request, ServletResponse response)

S

doGet() o doPost() toman HTTP requests y responses:

− doGet(HttpServletRequest request, HttpServletResponse response)

H

− doPost(HttpServletRequest request, HttpServletResponse response)

H

Page 39: SERVLET BASICS

39

Service() Method

Request

Service( )

Response

ServerGenericServlet

subclass

Key: Implemented by subclass

Subclass ofGenericServlet class

Page 40: SERVLET BASICS

40

Métodos doGet() y doPost()

Request

Service( )

S

Response

Server HttpServlet subclass

Key: Implemented by subclass

doGet( )

d

doPost( )

d

Page 41: SERVLET BASICS

41

Tareas que tu haces en doGet() & doPost()

d

Extraes informacion enviada del cliente(parametro HTTP) desde el HTTP request

Set (Save) y get (read) atributos en/desde objetos segun el scope (request, session)

Ejecutar logica de negocios o acceso a base de datos Opcionalmente hacer forward del request a otro recurso

Web u otros componentes Web (Servlet o JSP)

W

Completar mensajes HTTP response y enviar este a el cliente

Page 42: SERVLET BASICS

42

Ejemplo: Simple doGet()

E

import javax.servlet.*;import javax.servlet.http.*;import java.io.*;Public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException { // Just send back a simple HTTP response response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<title>First Servlet</title>"); out.println("<big>Hello J2EE Programmers! </big>"); }}

Page 43: SERVLET BASICS

43

Ejemplo: doGet()

E

Sofisticadopublic void doGet (HttpServletRequest request, HttpServletResponse response)

H

throws ServletException, IOException { // Read session-scope attribute “message” HttpSession session = request.getSession(true); ResourceBundle messages = (ResourceBundle)session.getAttribute("messages"); // Set headers and buffer size before accessing the Writer response.setContentType("text/html"); response.setBufferSize(8192); PrintWriter out = response.getWriter(); // Then write the response (Populate the header part of the response)

/

out.println("<html>" + "<head><title>" + messages.getString("TitleBookDescription") + "</title></head>"); // Get the dispatcher; it gets the banner to the user RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/banner"); if (dispatcher != null)

i

dispatcher.include(request, response);

Page 44: SERVLET BASICS

44

Ejemplo: doGet()

E

Sofisticado // Get the identifier of the book to display (Get HTTP parameter)

/

String bookId = request.getParameter("bookId"); if (bookId != null) { // and the information about the book (Perform business logic)

/

try { BookDetails bd = bookDB.getBookDetails(bookId); Currency c = (Currency)session.getAttribute("currency"); if (c == null) { c = new Currency(); c.setLocale(request.getLocale()); session.setAttribute("currency", c); } c.setAmount(bd.getPrice()); // Print out the information obtained out.println("..."); } catch (BookNotFoundException ex) { response.resetBuffer(); throw new ServletException(ex); } } out.println("</body></html>"); out.close(); }

Page 45: SERVLET BASICS

45

Pasos para completar HTTP Response Llenar Response headers Establecer algunas propiedades del

response− Buffer size

Obtener un objeto output stream desde el response

Escribir el contenido a dicho output stream

Page 46: SERVLET BASICS

46

Ejemplo: Simple Response Public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException { // Fill response headers response.setContentType("text/html"); // Set buffer size response.setBufferSize(8192); // Get an output stream object from the response PrintWriter out = response.getWriter(); // Write body content to output stream out.println("<title>First Servlet</title>"); out.println("<big>Hello J2EE Programmers! </big>"); }}

Page 47: SERVLET BASICS

47

Scope ObjectsScope Objects

Page 48: SERVLET BASICS

48

Scope Objects Permite compartir información a traves de

componentes web via atributos mantenidos en estos Scope objects

− Atributos son pares de la forma nombre/objeto Atributos mantenidos en estos Scope objets son

accesado a traves de− getAttribute() & setAttribute()

g

4 Scope objects son definidos− Contexto web, session, request, page

Page 49: SERVLET BASICS

49

Cuatro Scope Objects: Accesibilidad Contexto Web(ServletContext)

C

− Accesible desde componentes Web que estan dentro de un contexto

Session− Accesible desde componentes web que manejan un request

que pertenece a la session Request

− Accesible desde componentes web que manejan el request Page

− Accesible desde paginas JSP que han creado el objeto

Page 50: SERVLET BASICS

50

Cuatro Scope Objects: Class Web context

− javax.servlet.ServletContext Session

− javax.servlet.http.HttpSession Request

− Subtipo de javax.servlet.ServletRequest: javax.servlet.http.HttpServletRequest

Page− javax.servlet.jsp.PageContext

Page 51: SERVLET BASICS

51

Web Context(ServletContext)

(

Page 52: SERVLET BASICS

52

¿Para que es un ServletContext ? Usado por servlets para

− Establecer (Set) y obtener (get) objetos de scope context (o application) y obtener el valor de sus atributos

− Obtener un request dispatcher Para hacer forward o incluir un componente web

− Accesar a parametros de inicializacion del contexto web establecidos en el web.xml

− Accesar a recursos Web asociados con el contexto Web− Log− Accesar a otra informacion miscelanea

Page 53: SERVLET BASICS

53

Scope de ServletContext El scope o alcance es

− Compartido por todos los servlets y paginas JSP dentro de una “aplicación web"

Esto es el porque de ser llamado “scope application”− Una “aplicación web" es una colección de servlets y

contenido instalado bajo un subconjunto especifico de URL namespaces y posiblemente instalado via un *.war

Todos los servlets en la aplicación web BookStore comparten el mismo objeto ServletContext

− Hay un objeto ServletContext por “aplicación web" y por Java virtual machine

Page 54: SERVLET BASICS

54

ServletContext: Web Application Scope

application

Client 1

Client 2

server

ServletContext

Page 55: SERVLET BASICS

55

¿Como accesar al objeto ServletContext? Dentro de tu codigo usando

getServletContext()

g

Dentro del codigo de un filtro de servlet, llamando a, getServletContext()

El ServletContext es contenido en el objeto ServletConfig, el cual es provisto por el web server a un servlet cuando este es inicializado

− init (ServletConfig servletConfig) en la interface Servlet

Page 56: SERVLET BASICS

56

Ejemplo: Obteniendo Attribute Value de ServletContextpublic class CatalogServlet extends HttpServlet { private BookDB bookDB; public void init() throws ServletException { // Get context-wide attribute value from // ServletContext object bookDB = (BookDB)getServletContext(). getAttribute("bookDB"); if (bookDB == null) throw new UnavailableException("Couldn't get database."); }}

Page 57: SERVLET BASICS

57

Ejemplo: Obteniendo y usando el objeto RequestDispatcher public void doGet (HttpServletRequest request, HttpServletResponse response)

H

throws ServletException, IOException { HttpSession session = request.getSession(true); ResourceBundle messages = (ResourceBundle)session.getAttribute("messages"); // set headers and buffer size before accessing the Writer response.setContentType("text/html"); response.setBufferSize(8192); PrintWriter out = response.getWriter(); // then write the response out.println("<html>" + "<head><title>" + messages.getString("TitleBookDescription") + "</title></head>"); // Get the dispatcher; it gets the banner to the user RequestDispatcher dispatcher = session.getServletContext().getRequestDispatcher("/banner"); if (dispatcher != null)

i

dispatcher.include(request, response); ...

Page 58: SERVLET BASICS

58

Ejemplo: Loggingpublic void doGet (HttpServletRequest request, HttpServletResponse response)

H

throws ServletException, IOException { ... getServletContext().log(“Life is good!”); ... getServletContext().log(“Life is bad!”, someException);

Page 59: SERVLET BASICS

59

SessionSession(HttpSession)(HttpSession)

Page 60: SERVLET BASICS

60

¿Porqué HttpSession? Necesidad de un medio para mantener

información del cliente a traves de una serie de request desde el mismo usuario (u originado desde el mismo browser) en un periodo de tiempo

− Ejemplo: Online shopping cart HttpSession mantiene el estado del

cliente− Usado por Servlets para establecer y obtener

los valores de atributos del session scope

Page 61: SERVLET BASICS

61

¿Como obtener HttpSession? via el metodo getSession() del objeto

Request (HttpServletRequest)

R

Page 62: SERVLET BASICS

62

Ejemplo: HttpSessionpublic class CashierServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response)

H

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();

Page 63: SERVLET BASICS

63

Servlet RequestServlet Request(HttpServletRequest)(HttpServletRequest)

((

Page 64: SERVLET BASICS

64

¿Qué es Servlet Request? Contiene información pasada del cliente a el servlet Todos los servlet requests implementan la interface ServletRequest el

cual define metodos para accesar a− Parametros enviados por el Cliente− Atributos nombre/objeto− Localidades− Cliente y servidor− Input stream− Información del protocolo− Content type− Si el request ha sido hecho de una conexión segura (HTTPS)

S

Page 65: SERVLET BASICS

65

Requests

Request Servlet 1

Servlet 2

Servlet 3Response

Web Server

data, client, server, header servlet itself

Page 66: SERVLET BASICS

66

Obteniendo parametros enviados por el cliente Un request puede venir con cualquier numero de

parametros enviados por el cliente Los parametros son enviados de dos formas:

− GET: como un query string, añadido a un URL− POST: como data POST codificada, no aparece en el

URL getParameter("paraName")

− Retorna el valor de paraName − Retorna null si el parametro no esta presente− Trabaja indenticamente para request GET y POST

Page 67: SERVLET BASICS

67

Un ejemplo de Formulario usando GET<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD> <TITLE>Collecting Three Parameters</TITLE></HEAD><BODY BGCOLOR="#FDF5E6"><H1 ALIGN="CENTER">Please Enter Your Information</H1><FORM ACTION="/sample/servlet/ThreeParams"> First Name: <INPUT TYPE="TEXT" NAME="param1"><BR> Last Name: <INPUT TYPE="TEXT" NAME="param2"><BR> Class Name: <INPUT TYPE="TEXT" NAME="param3"><BR> <CENTER> <INPUT TYPE="SUBMIT"> </CENTER></FORM></BODY></HTML>

Page 68: SERVLET BASICS

68

Un formulario usando GET

Page 69: SERVLET BASICS

69

El servlet: Getimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;/** Simple servlet that reads three parameters from the html form */public class ThreeParams extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)

H

throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Your Information"; out.println("<HTML>" + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n" + "<UL>\n" + " <LI><B>First Name in Response</B>: " + request.getParameter("param1") + "\n" + " <LI><B>Last Name in Response</B>: " + request.getParameter("param2") + "\n" + " <LI><B>NickName in Response</B>: " + request.getParameter("param3") + "\n" + "</UL>\n" + "</BODY></HTML>"); }}

Page 70: SERVLET BASICS

70

Un formulario usando POST<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD> <TITLE>A Sample FORM using POST</TITLE></HEAD><BODY BGCOLOR="#FDF5E6"><H1 ALIGN="CENTER">A Sample FORM using POST</H1><FORM ACTION="/sample/servlet/ShowParameters" METHOD="POST"> Item Number: <INPUT TYPE="TEXT" NAME="itemNum"><BR> Quantity: <INPUT TYPE="TEXT" NAME="quantity"><BR> Price Each: <INPUT TYPE="TEXT" NAME="price" VALUE="$"><BR> First Name: <INPUT TYPE="TEXT" NAME="firstName"><BR> <TEXTAREA NAME="address" ROWS=3 COLS=40></TEXTAREA><BR> Credit Card Number: <INPUT TYPE="PASSWORD" NAME="cardNum"><BR> <CENTER> <INPUT TYPE="SUBMIT" VALUE="Submit Order"> </CENTER></FORM></BODY></HTML>

Page 71: SERVLET BASICS

71

un formulario usando POST

Page 72: SERVLET BASICS

72

Servlet: POSTimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class ShowParameters extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)

H

throws ServletException, IOException { ... } public void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

doGet(request, response); }}

Page 73: SERVLET BASICS

73

Quien establece atributos Object/value Request attributes pueden ser establecidos en dos formas

− El contenedor de servlets por si mismo establece atributos para hacer disponible esta información acerca de un request

Ejemplo: atributo javax.servlet.request.X509Certificate para HTTPS

− Establecido por codigo asi void setAttribute(java.lang.String name,

java.lang.Object o)

j

Embebido en un request antes de ser llamado un RequestDispatcher

Page 74: SERVLET BASICS

74

Obteniendo información Localpublic void doGet (HttpServletRequest request, HttpServletResponse response)

H

throws ServletException, IOException { HttpSession session = request.getSession(); ResourceBundle messages =

(ResourceBundle)session.getAttribute("messages"); if (messages == null) { Locale locale=request.getLocale(); messages = ResourceBundle.getBundle( "messages.BookstoreMessages", locale); session.setAttribute("messages", messages); }

Page 75: SERVLET BASICS

75

Obteniendo información del Cliente El Servlet puede obtener información

del cliente− String request.getRemoteAddr()

Obtiene IP Address− String request.getRemoteHost()

S

Obtiene nombre del cliente

Page 76: SERVLET BASICS

76

Obteniendo información del server El Servlet puede obtener información

del servidor:− String request.getServerName()

S

e.g. "www.sun.com"− int request.getServerPort()

i

e.g. Port number "8080"

Page 77: SERVLET BASICS

77

Obteniendo información Misc. Input stream

− ServletInputStream getInputStream()

S

− java.io.BufferedReader getReader()

j

Protocol− java.lang.String getProtocol()

j

Content type− java.lang.String getContentType()

j

Es seguro o no(if it is HTTPS or not)

E

− boolean isSecure()

b

Page 78: SERVLET BASICS

78

HTTPServletRequestHTTPServletRequest

Page 79: SERVLET BASICS

79

¿Qué es HTTP Servlet Request? Contiene data pasada del cliente HTTP a el servlet HTTP Creado por contenedor de servlets y pasado al servlet como

parametros de los metodos doGet() o doPost() HttpServletRequest es una extension de ServletRequest y

provee metodos adicionales para accesar a− HTTP request URL

Context, servlet, path, query information− Misc. HTTP Request header information− Authentication type & User security information− Cookies− Session

Page 80: SERVLET BASICS

80

HTTP Request URL Contiene las siguientes partes

− http://[host]:[port]/[request path]?[query string]

Page 81: SERVLET BASICS

81

HTTP Request URL: [request path] http://[host]:[port]/[request path]?[query string] [request path] es hecho de

− Context: /<contexto de la aplicación web>− Servlet name: /<component alias>− Path information: el resto

Ejemplos− http://localhost:8080/hello1/greeting− http://localhost:8080/hello1/greeting.jsp− http://daydreamer/catalog/lawn/index.html

Page 82: SERVLET BASICS

82

HTTP Request URL: [query string] http://[host]:[port]/[request path]?[query string] [query string] son compuestos por un conjunto de parametros y valores

que el usuario ingreso Dos maneras de crear query strings

− Un query string pued aparecer explicitamente en una pagina web <a href="/bookstore1/catalog?Add=101">Add To Cart</a> String bookId = request.getParameter("Add");

− Un query string es añadido a un URL cuando un formulario es submiteado usando el metodo GET HTTP

http://localhost/hello1/greeting?username=Monica+Clinton String userName=request.getParameter(“username”)

S

Page 83: SERVLET BASICS

83

Context, Path, Query, Parameter Methods String getContextPath()

S

String getQueryString()

S

String getPathInfo()

S

String getPathTranslated()

S

Page 84: SERVLET BASICS

84

HTTP Request Headers HTTP requests incluyen headers los

cuales proveen información extra acerca del request

Ejemplo de HTTP 1.1 Request:GET /search? keywords= servlets+ jsp HTTP/ 1.1Accept: image/ gif, image/ jpg, */*Accept-Encoding: gzipConnection: Keep- AliveCookie: userID= id456578Host: www.sun.comReferer: http:/www.sun.com/codecamp.htmlUser-Agent: Mozilla/ 4.7 [en] (Win98; U)

U

Page 85: SERVLET BASICS

85

HTTP Request Headers Accept

− Indica los tipos MIME que el browser puede manejar

Accept-Encoding− Indica encoding(e. g., gzip or compress) que el

browser puede manejar Authorization

− Identificación del usuario para paginas protegidas− En lugar de HTTP authorization, usa HTML forms

para enviar username/password y almacenar la informacion en un objeto session

Page 86: SERVLET BASICS

86

HTTP Request Headers Connection

− En HTTP 1.1, la conexión persistentes es por defecto

− Servlets deben de configurar Content-Length con setContentLength (usar ByteArrayOutputStream para determinar longitud de salida) para soportar conexiones persistentes

Cookie− Usar getCookies, no getHeader

Host− Indica host dado en URL original.− Esto es requerido en HTTP 1.1.

Page 87: SERVLET BASICS

87

HTTP Request Headers If-Modified-Since

− Indica que cliente desea la pagina solo si esta ha sido modificada desde la ultima fecha especificada.

− No manejar esta situacion directamente; implementar en su lugar getLastModified.

Referer− URL de paginas web referidas.− Util para seguimiento de trafico

User-Agent− String identifa el browser que esta haciendo el

request.− Usar con extrema precaución!

Page 88: SERVLET BASICS

88

HTTP Header Methods String getHeader(java.lang.String name)

S

− Valor del request header como String java.util.Enumeration getHeaders(java.lang.String

name)

n

− Valores del request header especificado java.util.Enumeration getHeaderNames()

j

− Nombres de los request headers int getIntHeader(java.lang.String name)

i

− valor del request header especificado como int

Page 89: SERVLET BASICS

89

Mostrando Request Headers//Shows all the request headers sent on this particular request.public class ShowRequestHeaders extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)

H

throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Servlet Example: Showing Request Headers"; out.println("<HTML>" + ... "<B>Request Method: </B>" + request.getMethod() + "<BR>\n" + "<B>Request URI: </B>" + request.getRequestURI() + "<BR>\n" + "<B>Request Protocol: </B>" + request.getProtocol() + "<BR><BR>\n" + ... "<TH>Header Name<TH>Header Value"); Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = (String)headerNames.nextElement(); out.println("<TR><TD>" + headerName); out.println(" <TD>" + request.getHeader(headerName)); } ... }}

Page 90: SERVLET BASICS

90

Request Headers - Ejemplo

Page 91: SERVLET BASICS

91

Authentication & User Security Information

String getRemoteUser()

S

− Nombre del usuario si el servlet ha sido protegido por password, null en caso contrario

String getAuthType()

S

− Nombre del esquema de autenticación usado para proteger el servlet

boolean isUserInRole(java.lang.String role)

b

− ¿Esta el usuario incluido en role especificado? String getRemoteUser()

S

− Login del usuario que esta haciendo el request, si el usuario ha sido autenticado, null en caso contrario.

Page 92: SERVLET BASICS

92

Cookie Method (in HTTPServletRequest)

H

Cookie[] getCookies()

C

− Un array conteniendo todos los objetos Cookie que el ciente envia con el request

Page 93: SERVLET BASICS

93

Servlet ResponseServlet Response(HttpServletResponse)(HttpServletResponse)

((

Page 94: SERVLET BASICS

94

¿Qué es Servlet Response? Contiene data pasada del servlet a el cliente Todos los servlet responses implementan la

interface ServletResponse − Recupera un output stream− Indica content type− Indica el buffer output− Set información de localización

HttpServletResponse extends ServletResponse− HTTP response status code− Cookies

Page 95: SERVLET BASICS

95

Responses

Request Servlet 1

Servlet 2

Servlet 3Response

Web Server

Response Structure:status code , headers and body.

Page 96: SERVLET BASICS

96

Response Structure

Status Code

Response Headers

Response Body

Page 97: SERVLET BASICS

97

Status Code inStatus Code inHttp ResponseHttp Response

Page 98: SERVLET BASICS

98

HTTP Response Status Codes ¿Porqué nosotros necesitamos HTTP

response status code?− Para hacer Forward a otra pagina− Indicar si el recurso esta faltando− Instruir al browser para usar copiado de

informacion por cache

Page 99: SERVLET BASICS

99

Metodos para establecer HTTP Response Status Codes public void setStatus(int statusCode)

p

− Status codes son definidos en HttpServletResponse− Status codes son numero organizados en cinco categorías

100-199 Informational 200-299 Successful 300-399 Redirection 400-499 Incomplete 500-599 Server Error

− El codigo por defecto es 200 (OK)

E

Page 100: SERVLET BASICS

100

Ejemplo de HTTP Response StatusHTTP/ 1.1 200 OKContent-Type: text/ html<! DOCTYPE ...><HTML...</ HTML>

Page 101: SERVLET BASICS

101

Status Codes comunes 200 (SC_OK)

2

− Success− Default para servlets

204 (SC_No_CONTENT)

2

− Success pero sin body response− El Browser deberia mantener mostrando el

contenido previo 301 (SC_MOVED_PERMANENTLY)

3

− El documento fue movido permanentemente (indicado en Location header)

(

− El browser ira a una nueva ubicacion automaticamente

Page 102: SERVLET BASICS

102

Status Codes Comunes 302 (SC_MOVED_TEMPORARILY)

3

− El mensaje es "Found"− El documento es movido temporalmente o caso

contrario (indicado en Location header)

c

− Browsers van a una nueva ubicacion automaticamente

− Servlets deberian usar sendRedirect, no setStatus, cuando establecen este header

401 (SC_UNAUTHORIZED)

4

− El browser trato de acceder a una pagina protegida sin la autorizacion correspondiente

404 (SC_NOT_FOUND)

4

− Pagina no encontrada

Page 103: SERVLET BASICS

103

Metodos para enviar Error Error status codes (400-599) pueden

ser usados en los metodos sendError public void sendError(int sc)

p

− El servidor puede dar el especial tratamiento del error

public void sendError(int code, String message)

m

− Wrapea el mensaje dentro de un pequeño documento HTML

Page 104: SERVLET BASICS

104

setStatus() & sendError()

s

try { returnAFile(fileName, out)

r

} catch (FileNotFoundException e)

{ response.setStatus(response.SC_NOT_FOUND); out.println("Response body"); } has same effect as try { returnAFile(fileName, out)

r

} catch (FileNotFoundException e)

{ response.sendError(response.SC_NOT_FOUND); }

Page 105: SERVLET BASICS

105

Header inHeader inHttp ResponseHttp Response

Page 106: SERVLET BASICS

106

¿Porqué HTTP Response Headers? Dar forwarding location Especificar cookies Proveer la fecha de modificacion de la pagina Instruir al browser para recargar la pagina

despues de un periodo de tiempo Dar el tamaño del archivo de manera que la

conexión persistente HTTP pueda ser usada Diseñar el tipo de documento que esta siendo

generado Etc.

Page 107: SERVLET BASICS

107

Metodos para establecer Arbitrariamente Response Headers public void setHeader( String headerName, String

headerValue) − Establece un header.

public void setDateHeader( String name, long millisecs)

p

− Convierte milisegundos desde 1970 a un date string enformato GMT

public void setIntHeader( String name, int headerValue) − Prevee la necesidad de convertir int a String antes de

llamar a setHeader addHeader, addDateHeader, addIntHeader

− Añade nuevas ocurrencias de header en lugar de reemplazarlos

Page 108: SERVLET BASICS

108

Metodos para establecer Response Headers comunes setContentType

− Establece el contenido- tipo de header. Servlets casi siempre usan este.

setContentLength− Establece la longitud del content header. Usado

para conexiones persistentes HTTP. addCookie

− Añade un valor a el Set- Cookie header. sendRedirect

− Estable el Location header y cambia status code

Page 109: SERVLET BASICS

109

HTTP 1.1 Response Headers comunes Location

− Especifica una nueva location del documento− Usar sendRedirect en lugar de establecer este

directamente Refresh

− Especifica un delay antes de que el browser automaticamente recargue la pagina

Set-Cookie− Los cookies que el browser debe recordar. No

establecer este header automaticamente.− Usar addCookie en su lugar.

Page 110: SERVLET BASICS

110

continua Cache-Control (1.1) y Pragma (1.0)

C

− Un no-cache valor previene al browser de poner la pagina en cache. Envia ambos headers o chequea la version de HTTP.

Content- Encoding− La manera en que el documento es codificado.

El Browser revierte esta codificacion antes de manejar el documento

Content- Length− El numero de bytes en el response. Usado para

conexiones persistentes HTTP

Page 111: SERVLET BASICS

111

Continua Content- Type

− El MIME type del documento que esta siendo retornado.

− Usa setContentType para establecer este header.

Ultima modificación− La ultima vez que el documento fue cambiado− No establecer este header explicitamente.− Proveer un metodo getLastModified en su lugar.

Page 112: SERVLET BASICS

112

Ejemplo de codigo - Refresh

public class DateRefresh extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); res.setHeader("Refresh", "5"); out.println(new Date().toString()); }}

Page 113: SERVLET BASICS

113

Body inBody inHttp ResponseHttp Response

Page 114: SERVLET BASICS

114

Escribiendo un Response Body Un servlet casi siempre retorna un

response body Response body puede ser un PrintWriter

o un ServletOutputStream PrintWriter

− Usando response.getWriter() − Para salida basada en caracteres

ServletOutputStream− Usando response.getOutputStream()

r

− Para data binaria (imagenes)

Page 115: SERVLET BASICS

115

Manejando ErroresManejando Errores

Page 116: SERVLET BASICS

116

Manejando Errores El contenedor web genera una pagina de

error por defecto Tu puedes proporcionar tu propia pagina

de error Pasos para manejar errores

− Crea paginas de error html apropiados para condiciones de error

− Modificar el web.xml

Page 117: SERVLET BASICS

117

Ejemplo: Establecer paginas de error en web.xml<error-page> <exception-type> exception.BookNotFoundException </exception-type> <location>/errorpage1.html</location></error-page><error-page> <exception-type> exception.BooksNotFoundException </exception-type> <location>/errorpage2.html</location></error-page><error-page> <exception-type>exception.OrderException</exception-type> <location>/errorpage3.html</location></error-page>

Page 118: SERVLET BASICS

118

¡Gracias!