servlet basics

Post on 25-May-2015

617 Views

Category:

Education

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

ServletServlet(Fundamentos)(Fundamentos)

))

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

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

4

Servlet Servlet La gran figura de J2EELa gran figura de J2EE

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 .

6

¿Dónde estan los Servlets y JSP?

Web Tier EJB Tier

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

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>"); } ...}

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

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

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

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

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

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>

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

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

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

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

19

Modelo Modelo Servlet Request &Servlet Request &

ResponseResponse

20

Modelo Servlet Request y Response

Servlet

Response

Request

BrowserHTTP

WebWebServerServer

Servlet Container

Response

Request

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

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

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

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

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>"); }}

26

Interfaces y ClassesInterfaces y Classesde Servletde Servlet

27

Servlet Interfaces & ClassesServlet

GenericServlet

HttpServlet

ServletRequest

HttpServletRequest

ServletResponse

HttpServletResponse

HttpSession

28

Ciclo de vida Ciclo de vida del Servlet del Servlet

29

Ciclo de vida del Servlet

Http request

Http response

Load Invoke No

Yes

Client Server

Is Servlet Loaded?

Servlet Container

RunServlet

30

Ciclo de vida desde la perspectiva de métodos

Ready

doGet( ) doPost( )

service( )

destroy( )init( )

Request parameters

Init parameters

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

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

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."); } ...}

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

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>

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; } ...}

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

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

39

Service() Method

Request

Service( )

Response

ServerGenericServlet

subclass

Key: Implemented by subclass

Subclass ofGenericServlet class

40

Métodos doGet() y doPost()

Request

Service( )

S

Response

Server HttpServlet subclass

Key: Implemented by subclass

doGet( )

d

doPost( )

d

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

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>"); }}

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

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

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

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>"); }}

47

Scope ObjectsScope Objects

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

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

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

51

Web Context(ServletContext)

(

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

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

54

ServletContext: Web Application Scope

application

Client 1

Client 2

server

ServletContext

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

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."); }}

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

58

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

H

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

59

SessionSession(HttpSession)(HttpSession)

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

61

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

Request (HttpServletRequest)

R

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

63

Servlet RequestServlet Request(HttpServletRequest)(HttpServletRequest)

((

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

65

Requests

Request Servlet 1

Servlet 2

Servlet 3Response

Web Server

data, client, server, header servlet itself

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

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>

68

Un formulario usando GET

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>"); }}

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>

71

un formulario usando POST

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

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

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

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

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"

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

78

HTTPServletRequestHTTPServletRequest

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

80

HTTP Request URL Contiene las siguientes partes

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

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

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

83

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

S

String getQueryString()

S

String getPathInfo()

S

String getPathTranslated()

S

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

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

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.

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!

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

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)); } ... }}

90

Request Headers - Ejemplo

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.

92

Cookie Method (in HTTPServletRequest)

H

Cookie[] getCookies()

C

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

93

Servlet ResponseServlet Response(HttpServletResponse)(HttpServletResponse)

((

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

95

Responses

Request Servlet 1

Servlet 2

Servlet 3Response

Web Server

Response Structure:status code , headers and body.

96

Response Structure

Status Code

Response Headers

Response Body

97

Status Code inStatus Code inHttp ResponseHttp Response

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

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

100

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

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

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

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

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

105

Header inHeader inHttp ResponseHttp Response

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.

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

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

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.

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

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.

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

113

Body inBody inHttp ResponseHttp Response

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)

115

Manejando ErroresManejando Errores

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

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>

118

¡Gracias!

top related