Upload
darwin-durand
View
634
Download
1
Tags:
Embed Size (px)
Citation preview
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!