4.1 Tutorial de servlets

Documentos relacionados
4.1 Tutorial de Servlets y JSPs

Sistemas de Información 12/13 Servlets y JSPs (Java Server Pages)

Introducción (1) En una aplicación web, especialmente en Internet, los cambios a la interfaz gráfica son muy frecuentes

Servlets. Unidad: 4 Laboratorio de Programación. Universidad Nacional de la Patagonia Austral Unidad Académica Río Gallegos

Clase Java que implementa un modelo de programación peticiónrespuesta. Puede usarse para procesar cualquier tipo de petición

Introducción a los servlets

Implementando nuestro primer servlet

NIVEL 16: ESTRUCTURAS N-ARIAS RECURSIVAS Aplicaciones Web, Html y Servlets. ISIS1206 Estructuras de Datos

ISJu: Técnicas de Programación Cartilla Teórica-Práctica Instalación del "Eclipse IDE for Java EE Developers" y el servidor "Apache Tomcat"

J2EE Java 2 Enterprise Edition

Requisitos. Universidad ORT Arquitectura de Software

Tutorial Web Dinámica con Servlets y JSP Sesion 3

3 PROGRAMACIÓN WEB CON SERVLETS

Java Servlets. Luis Fernando Llana Díaz. 17 de abril de Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid

PROGRAMACIÓN JEE CON SERVLETS

Programación con JDBC (Java DataBase Connectivity ), Servlets y JSP (Java Server Pages)

Un servlet es una clase java que implementa la Servlet interface. Un servlet corre dentro de un contexto denominado Servlet engine.

Unidad IV: Servlets. Comprender la estructura básica de los Servlets Crear servlets sencillos Presentar el ciclo de vida de un Servlet.

javax.servlet.genericservlet javax.servlet.http.httpservlet MiServlet

USANDO SERVLETS EN UN SERVIDOR WEB RESIN

Java 2 Enterprise Edition

Web Tier en JAVA. Nicolás Troncoso Carrère. Valparaíso, ILI 258 Departamento de Informática Universidad Técnica Federico Santa María

Figura 7-1 Enlace para instalar el servidor web Apache Jakarta Tomcat

Sistemas de Información 12/13 Ejercicios Tecnologías Web

Servidores Web (II) Contenidos

Ejemplos de Servlet y JSP Web Application Development

3.3 Caso de estudio: diseño e implementación de un servicio/cliente REST

Aplicaciones web con Tomcat y MySQL en Linux

Práctica 2: Extensión de un servidor con servlets

Sistemas de Información

JAVA: Servlets. Diseño de aplicaciones web.

Introducción a las aplicaciones WEB

3.3 Caso de estudio: diseño e

Contiene código HTML normal junto elementos especiales de JSP. Internamente, el servidor de aplicaciones las compilará a un servlet

2015 CÁTEDRA DE LENGUAJE DE PROGRAMACIÓN JAVA

INTRODUCCIÓN N A LAS APLICACIONES WEB Y TECNOLOGÍA A JAVA

CAPÍTULO 14. DESARROLLO

DESARROLLO WEB EN ENTORNO SERVIDOR

JSP Básico. Índice. 2 Traducción de los JSP a servlets Acciones Introducción a JSP... 2

JSP JDBC SALVADORES OLAIZOLA,

Aplicaciones Cliente - Servidor

Quickstart-Webapps-Spring

JAVA WEB SERVICES. Realizado por: Diana Alfaro Complementado por: Carlos Sánchez Página 1

Clase. geniería de la Computación. Departamento de Ciencias e Ing. Diego C. Martínez - DCIC-UNS

Curso de gráficos con Java y OpenFlashChart para aplicaciones web. Manual del alumno

Curso de desarrollo web en entorno de servidor

Práctica 4 PROGRAMACIÓN WEB CON SERVLETS Y JSP. 1. Introducción a JSP... 2

Curso Java Web (JSP's/Servlets)

Laboratorio de Aplicaciones Telemáticas (Curso 2009/2010)

HTTP, CGI, Applets y Servlets

EL CAMINO A LA CERTIFICACION CON SERVLETS Y JSP EL CAMINO A LA CERTIFICACION CON SERVLETS Y JSP SCWCD RAFAEL ALCOCER CALDERA.

Seguridad de la aplicación para servlets y JSP (página activas java)

Introducción n a Apache Tomcat 5.5

DESARROLLO DE APLICACIONES WEB Introducción a Struts Framework

10. Servlets con acceso a bases de datos

Conexión de Mysql con NetBeans

Curso de Ajax con Java. Manual del alumno

Java EE JavaServer Pages (JSP)

Tema 4: Tecnologías Web Java

Elementos de Scripting Scriptlets Expresiones Declaraciones Inhabilitar los Elementos de Scripting Acciones...

Taller de Sistemas de Información 2. Desarrollo Web

Pasarela de pagos de la Administración Pública Vasca V2. Integración con Sistemas BackEnd de Administraciones

JSP (I) Aplicaciones Distribuidas

CAPITULO IV 4. Utilización de Servlets en AVCIDE

PASO 1: Creamos un nuevo proyecto en NetBeans. Nos vamos a File y pulsamos sobre New Project

9. Servlets CAPÍTULO Clientes y Servidores

Mario Muñoz Organero & Norberto Fernández * Departamento de Ingeniería Telemática

SERVLETS MARIO OSVALDO BRESSANO

SERVLETS CÁTEDRA DE PROGRAMACIÓN AVANZADA. Ing. Mario Bressano & Luciano Diamand ENVÍO 04

Framework 1. Web en Java. (solo aplicaciones en mantenimiento)

Tomcat Instalación. Norman Sáez 15 de agosto de 2007

4.2 Tutorial de Tapestry

Manual ca011 CURSO JAVA, SERVER PAGES JSP Y SERVLETS

Tutorial JSP JavaServer Pages

Qué ofrece Autentia?

JavaBeans y JavaServer Pages: Guía rápida. Manuel Urueña

Escribir código HTML en los servlets es tedioso. que hay que utilizar las instrucciones print, println, etc. Es decir, HTML está dentro de java.

Tema 6: Arquitectura Web Multicapa

Configuración de Tomcat para usar SSL

Manual de JSP con MySQL

Laboratorio de Aplicaciones Telemáticas Ingeniería Técnica de Telecomunicación Especialidad en Telemática

DESARROLLO DE APLICACIONES WEB Introducción a Java Server Faces

ARQUITECTURAS CLIENTE/ SERVIDOR

III Congreso de Mathematica en España (3CM) webmathematica: Interactuando con Mathematica desde Internet

Ficha Técnica. Categoría. Contenido del Pack. Sinopsis. Programación. - 2 Manual Teórico - 1 Cuaderno de Ejercicios - 1 CDROM

4.4 Caso de Estudio: Diseño e Implementación de la Capa Web de MiniPortal

Especialista Universitario Java Enterprise. Struts. Sesión 4: Introducción a Struts Depto. Ciencia de la Computación e IA

Configuración servidor Tomcat

Transcripción:

4.1 Tutorial de servlets

Introducción (1) Un servlet es una clase Java que puede recibir peticiones (normalmente HTTP) y generar una salida (normalmente HTML, WML o XML) Los servlets que conforman una aplicación web se ejecutan en un servidor de aplicaciones web (contenedor) Cada servlet se puede asociar a una o más URLs Paquetes javax.servlet y javax.servlet.http

Introducción (y 2) Hasta la aparición de JSP, el uso principal de los servlets era generar la vista de una aplicación web Recibir petición HTTP asociada a una URL Leer parámetros Invocar operación sobre el modelo Generar salida HTML Motivos para aprender servlets Para usar JSP y Struts es preciso conocer parte del API de los servlets, dado que aunque JSP y Struts están en un nivel superior, no ocultan el API de los servlets Son útiles para implementar el controlador de una aplicación web Apache Struts proporciona un servlet genérico que constituye la parte principal del controlador

Visión global del framework de servlets (1) <<interface>> javax.servlet.servlet + init(config : ServletConfig) : void + destroy() : void + service(request : ServletRequest, response : ServletResponse) : void javax.servlet.genericservlet + init(config : ServletConfig) : void + destroy() : void + service(request : ServletRequest, response : ServletResponse) : void javax.servlet.http.httpservlet + service(request : ServletRequest, response : ServletResponse) : void # service(request : HttpServletRequest, response : HttpServletResponse) : void # doget(request : HttpServletRequest, response : HttpServletResponse) : void # dopost(request : HttpServletRequest, response : HttpServletResponse) : void

Visión global del framework de servlets (2) <<interface>> javax.servlet.servletrequest + getparameter(name : String ) : String + getparametervalues(name : String) : String[] <<interface>> javax.servlet.servletresponse + setcontenttype(type : String ) : void + getwriter () : java.io.printwriter <<interface>> javax.servlet.http.httpservletrequest <<interface>> javax.servlet.http.httpservletresponse

Visión global del framework de servlets (3) El diagrama UML anterior sólo ofrece una visión muy reducida del API de servlets, pero suficiente en este momento Cuando el servidor de aplicaciones web decide cargar un servlet en memoria (ej.: al arrancar, la primera vez que se accede a él) llama a la operación init de javax.servlet.servlet Cuando el servidor de aplicaciones web decide eliminar un servlet de memoria (ej.: lleva cierto tiempo sin usarse), llama a la operación destroy de javax.servlet.servlet

Visión global del framework de servlets (4) La operación pública service de javax.servlet.http.httpservlet llama a la operación protegida service Esta operación es una operación plantilla (Template Method), que llama a doget, dopost, doput, dodelete, etc., según la petición HTTP sea un GET, POST, PUT, DELETE, etc. Normalmente, el programador extiende de javax.servlet.http.httpservlet y redefine doget y/o dopost

Visión global del framework de servlets (5) En una máquina virtual Java, sólo existe una instancia de cada servlet que se programe, y en consecuencia puede recibir peticiones concurrentes doget, dopost, etc. deben ser thread-safe Normalmente no será necesario hacer nada especial, dado que la implementación de estas operaciones generalmente sólo hace uso de variables locales (pila) o de variables globales (static) de sólo lectura (típicamente caches) Si modifican alguna estructura global (un atributo propio o alguna variable global), necesitan sincronizar su acceso Sin embargo, en general, eso es mala idea, dado que una aplicación con estas características no será fácil que funcione en un entorno en cluster En estos casos, es mejor usar una base de datos para las estructuras globales que sean de lectura/escritura

Visión global del framework de servlets (y 6) javax.servlet.http.httpservletrequest getparameter Permite obtener el valor de un parámetro univaluado getparametervalues Permite obtener el valor de un parámetro multivaluado También se puede usar con parámetros univaluados IMPORTANTE: cuando el usuario no selecciona ningún valor (ej.: en una lista desplegable múltiple o una lista de checkboxes en HTML), el navegador no envía el parámetro, y en consecuencia, esta operación devuelve null javax.servlet.http.httpservletresponse setcontenttype debe llamarse antes de escribir en el PrintWriter que devuelve getwriter

Página principal del tutorial

Index.jsp <html>... <ul> <li><a href="hello1/hellouser?username=fernando+bellas"> HelloUser by GET (username = Fernando Bellas)</a></li> <li><a href="hello1/hellouserbypost.html">hellouser by POST</a></li> <li><a href="portal1/mainpage">portal-1 main page</a></li> </ul>... </html>

Portal1/HelloUserByPost.html <html>... <form method="post" action="hellouser"> <table width="100%" border="0" align="center" cellspacing="12"> <tr> <th align="right" width="50%">user name</th> <td align="left"> <input type="text" name="username" size="16 maxlength="16"> </td> </tr> <tr> <td width="50% ></td> <td align="left" width="50%"> <input type="submit" value="say me hello"> </td> </tr> </table> </form>... </html>

Demo HelloUser (1) Servlet and JSP Tutorial Main Page Clic en HelloUser by GET (username = Fernando Bellas)

Demo HelloUser (y 2) Servlet and JSP Tutorial Main Page Clic en HelloUser by POST

es.udc.fbellas.j2ee.servjsptutorial.hellouser1.hellouserservlet (1) package es.udc.fbellas.j2ee.servjsptutorial.hellouser1; import java.io.printwriter; import java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class HelloUserServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { /* Get value of parameter "username". */ String username = request.getparameter("username"); /* Generate response. */ response.setcontenttype("text/html; charset=iso-8859-1");

es.udc.fbellas.j2ee.servjsptutorial.hellouser1.hellouserservlet (y 2) PrintWriter out = response.getwriter(); out.println("<html><head><title>"); out.println("hellouser response"); out.println("</title></head>"); out.println("<body text=\"#000000\" bgcolor=\"#ffffff\">"); out.println("<h1>hello " + username + "! </h1>"); out.println("</body></html>"); out.close(); public void dopost(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { doget(request, response);

Empaquetamiento de una aplicación web (1) Una aplicación web se empaqueta en un fichero.war jar cvf aplicacionweb.war directorio Opciones similares al comando Unix tar El nombre de una aplicación web no tiene porque coincidir con el de su fichero.war El nombre se decide al instalar el fichero.war Ant incluye la tarea interna war Estructura de un fichero.war Directorio WEB-INF/classes Ficheros.class que conforman la aplicación web, agrupados en directorios según su estructura en paquetes Sin ficheros fuente! Directorio WEB-INF/lib Ficheros.jar de librerías que usa la aplicación Sin ficheros fuente!

Empaquetamiento de una aplicación web (2) Estructura de un fichero.war (cont) WEB-INF/web.xml Configuración estándar de la aplicación web Si la aplicación necesita otros ficheros de configuración (ej.: ficheros de configuración de Struts, ficheros de configuración propios, scripts de creación de tablas, etc.), se recomienda incluirlos debajo de WEB-INF (seguramente en subdirectorios) Directorio raíz y subdirectorios Vista de la aplicación (ej.: ficheros HTML, páginas JSP, imágenes, etc.) Visible a los navegadores Lo que hay debajo de WEB-INF sólo es visible a los servlets y páginas JSP de la aplicación Un fichero.war se puede instalar (deployment) en cualquier servidor de aplicaciones web conforme a J2EE

Empaquetamiento de una aplicación web (y 3) Un contenedor de aplicaciones web usa un cargador de clases distinto para cada war instalado => independencia entre aplicaciones web Distintas aplicaciones web pueden usar versiones distintas de una misma clase Dos aplicaciones web nunca podrán compartir una variable global Existe una instancia de un Singleton por cada aplicación que lo use Ej.: Considerar el atributo estático (variable global) parameters de ConfigurationParametersManager Si dos aplicaciones web usan esta clase, el contenedor cargará una clase por cada aplicación, y en consecuencia parameters tendrá un valor distinto en cada aplicación Es lo que deseamos, dado que en general, la configuración será distinta

jar tvf ServJSPTutorial.war (1) Portal2/MainPage.jsp Portal2/ShowLogin.jsp Portal2/ProcessLogin.jsp Portal2/ProcessLogout.jsp Hello2/HelloUserByPost.html Hello2/HelloUser.jsp Hello1/HelloUserByPost.html Index.jsp WEB-INF/classes/es/udc/fbellas/j2ee/servjsptutorial/portal1/ ShowLoginServlet.class WEB-INF/classes/es/udc/fbellas/j2ee/servjsptutorial/portal1/ MainPageServlet.class WEB-INF/classes/es/udc/fbellas/j2ee/servjsptutorial/portal1/ LoginManager.class WEB-INF/classes/es/udc/fbellas/j2ee/servjsptutorial/portal1/ ProcessLoginServlet.class WEB-INF/classes/es/udc/fbellas/j2ee/servjsptutorial/portal1/ ProcessLogoutServlet.class

jar tvf ServJSPTutorial.war (y 2) WEB-INF/classes/es/udc/fbellas/j2ee/servjsptutorial/portal2/ LoginManager.class WEB-INF/classes/es/udc/fbellas/j2ee/servjsptutorial/portal2/ IncorrectPasswordException.class WEB-INF/classes/es/udc/fbellas/j2ee/servjsptutorial/portal2/ LoginForm.class WEB-INF/classes/es/udc/fbellas/j2ee/servjsptutorial/hellouser1/ HelloUserServlet.class WEB-INF/web.xml

WEB-INF/web.xml (1) <?xml version="1.0" encoding="iso-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <distributable/> <!-- ===================== Servlets ============================= --> <servlet> <servlet-name>hellouser</servlet-name> <servlet-class>es.udc.fbellas.j2ee.servjsptutorial.hellouser1. HelloUserServlet</servlet-class> </servlet>... Resto de servlets del tutorial...

WEB-INF/web.xml (y 2) <!-- ==================== Servlet mapping ======================= --> <servlet-mapping> <servlet-name>hellouser</servlet-name> <url-pattern>/hello1/hellouser</url-pattern> </servlet-mapping>... Mappings para el resto de servlets del tutorial... <!-- ========================= Session =========================== --> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- ======================= Welcome page ======================== --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>

Comentarios (1) Desde la versión 2.4 de la especificación de servlets, los tags que se pueden usar dentro del fichero web.xml están especificados en un esquema (anteriormente lo estaban en un DTD) Espacios de nombres Concepto similar al de paquete en Java Permiten evitar conflictos de nombres cuando en un documento XML se usan tags de distintas aplicaciones XML Cada espacio de nombres está asociado a una URI, que debe ser única Se aconseja usar URLs No tienen porque tener una existencia real (y de hecho, no suelen tenerla)

Comentarios (2) En el fichero web.xml se usa <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> xmlns="http://java.sun.com/xml/ns/j2ee" permite especificar que el elemento web-app y los que éste contiene pertenecen al espacio de nombres definido por la URI http://java.sun.com/xml/ns/j2ee Similar a package xmlns:xsi="http://www.w3.org/2001/xmlschemainstance" permite especificar que el elemento web-app y los que éste contiene pueden usar los atributos y elementos del espacio de nombres asociado con la URI http://www.w3.org/2001/xmlschema-instance, prefijándolos con xsi: Similar a import Es la URI la que define el espacio de nombres y no el prefijo Distintas documentos XML pueden usar distintos prefijos para referirse a un mismo espacio de nombres

Comentarios (3) En el fichero web.xml se usa (cont) El atributo xsi:schemalocation permite especificar las ubicaciones de los esquemas asociados a un conjunto de espacios de nombres Contiene una lista de pares de valores separados por blancos (xsi:schemalocation="en1 ue1... enn uen") El primer miembro especifica un espacio de nombres (en) El segundo miembro especifica la ubicación del esquema (ue) que define los elementos y atributos de ese esquema El procesador del documento XML no está obligado a hacer uso de las ubicaciones especificadas (e.g. puede tener copias locales de los esquemas) Cualquier procesador tiene una copia del esquema correspondiente al espacio de nombres http://www.w3.org/2001/xmlschema-instance, y por eso no se especifica en xsi:schemalocation Cualquier contenedor de aplicaciones web J2EE posiblemente tendrá una copia del esquema correspondiente al espacio de nombres http://java.sun.com/xml/ns/j2ee

Comentarios (y 4) El anterior fichero web.xml sólo muestra algunos tags típicos Existe un gran número de tags (la mayoría opcionales) que permiten expresar muchas opciones de configuración Iremos viendo ejemplos de los tags más típicos a medida que nos hagan faltan distributable La aplicación puede funcionar en cluster Nuestras aplicaciones siempre deberían estar diseñadas e implementadas para que puedan funcionar en cluster Los servidores de aplicaciones comerciales suelen generar el fichero web.xml automáticamente El usuario utiliza un cómodo wizard para especificar la información de configuración

Tipos de URLs en HTML (1) Las URLs que muestran las imágenes del navegador empiezan por http://localhost:8080/servjsptutorial Son URLs absolutas localhost:8080: máquina y puerto en el que corre el servidor de aplicaciones (en este caso Tomcat) /ServJSPTutorial: nombre de la aplicación web En un servidor de aplicaciones pueden instalarse varias aplicaciones web Las URLs que se usan en los ficheros HTML o en las respuestas generadas del ejemplo son de tipo path relativo, y en consecuencia no incluyen http://localhost:8080/servjsptutorial Buena idea, permite instalar la aplicación en otro servidor bajo un nombre distinto

Tipos URLs en HTML (y 2) Si se desea escribir una URL de tipo path absoluto en un fichero HTML o una respuesta generada, ésta ha de empezar por /nombreaplicación <a href= /ServJSPTutorial/Hello1/HelloUser? username=fernando+bellas > HelloUser by GET username = Fernando Bellas</a> Es posible generar automáticamente la parte del nombre de la aplicación Permite instalar la aplicación con otro nombre, sin que haya que modificar ningún servlet request.getcontextpath() devuelve /nombreaplicación Volveremos a hablar sobre tipos de URLs en el siguiente ejemplo (Portal-1)

Demo Portal-1 (1) Servlet and JSP Tutorial Main Page Clic en Portal-1 main page

Demo Portal-1 (2)

Demo Portal-1 (y 3) Clic en Servlet and JSP tutorial main page Clic en Logout Servlet and JSP Tutorial Main Page Clic en Portal-1 main page Servlet and JSP Tutorial Main Page Clic en Portal-1 main page Portal-1 login form

es.udc.fbellas.j2ee.servjsptutorial.portal1 HttpServlet (from http) MainPageServlet ShowLoginServlet ProcessLoginServlet ProcessLogoutServlet <<use>> <<use>> <<use>> LoginManager - LoginManager() << static >> + login(request : HttpServletRequest, loginname : String) : void <<static>> + logout(request : HttpServletRequest) : void <<static>> + getloginname(request : HttpServletRequest) : String

Concepto de sesión (1) El API de servlets permite crear una sesión en el servidor por cada navegador que accede a una aplicación web Cada navegador dispone de su propio objeto javax.servlet.http.httpsession en el servidor Es posible enganchar objetos a una sesión y recuperarlos void setattribute(string, Object) Object getattribute(string) Por motivos de escalabilidad y de que en HTTP no hay nada especial que indique que un navegador ha dejado de usar la aplicación web, cada sesión dispone de un timeout (en minutos) Si transcurre el timeout sin que el navegador acceda a la aplicación, el servidor destruye la sesión Configurable en web.xml

Concepto de sesión (2) En el ejemplo Cada vez que un usuario hace un login, crearemos una sesión, le engancharemos su nombre de login, y lo redirigiremos a la página principal del portal Cada vez que el usuario accede a la página principal del portal, si ya ha hecho el login, se le saludará por su nombre (se recupera de la sesión) Cada vez que el usuario accede a la página principal del portal, si todavía no ha hecho el login, o su sesión ha caducado, se le redirigirá a la página de login Cuando un usuario hace un logout, le destruiremos la sesión y lo redirigiremos a la página principal del tutorial

Concepto de sesión (y 3) Qué ocurre cuando el servidor de aplicaciones web se ejecuta en un cluster (distributable)? El servidor garantiza que todas las peticiones que sean parte de una sesión serán procesadas por una máquina virtual Los objetos de la sesión tienen que ser serializables El servidor de aplicaciones puede decidir moverlos a otra máquina por motivos de escalabilidad y/o tolerancia a fallos En realidad, el concepto de sesión tiene más matices HTTP es un protocolo sin estado Cómo sabe el servidor de aplicaciones a qué sesión está asociada cada petición HTTP que recibe? Mecanismos: típicamente cookies o URL rewriting Los estudiaremos en el siguiente apartado

es.udc.fbellas.j2ee.servjsptutorial.portal1.mainpageservlet (1) public class MainPageServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { String loginname = LoginManager.getLoginName(request); if (loginname!= null) { // User has already logged in. generatemainpage(response, loginname); else { // User has not logged in yet. response.sendredirect("showlogin"); public void dopost(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { doget(request, response);

es.udc.fbellas.j2ee.servjsptutorial.portal1.mainpageservlet (y 2) private void generatemainpage(httpservletresponse response, String loginname) throws IOException { response.setcontenttype("text/html; charset=iso-8859-1"); PrintWriter out = response.getwriter(); out.println("<html><head><title>"); out.println("portal-1 main page"); out.println("</title></head>"); out.println("<body text=\"#000000\" bgcolor=\"#ffffff\" " + "link=\"#000ee0\" vlink=\"#551a8b\" alink=\"#000ee0\">"); out.println("<h1>hello " + loginname + "! </h1>"); out.println("<br><br><br>"); out.println("<a href=\"../index.jsp\">servlet and JSP tutorial " + "main page</a><br>"); out.println("<a href=\"processlogout\">logout</a><br>"); out.println("</body></html>"); out.close();

es.udc.fbellas.j2ee.servjsptutorial.portal1.showloginservlet (1) public class ShowLoginServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { /* Get values to show. */ Map errors = (Map) request.getattribute("errors"); String loginname = ""; String loginnameerrormessage = ""; if (errors!= null) { String errorheader = "<font color=\"red\"><b>"; String errorfooter = "</b></font>"; if (errors.containskey("loginname")) { loginname = request.getparameter("loginname"); loginnameerrormessage = errorheader + errors.get("loginname") + errorfooter;

es.udc.fbellas.j2ee.servjsptutorial.portal1.showloginservlet (2) /* Generate response. */ response.setcontenttype("text/html; charset=iso-8859-1"); PrintWriter out = response.getwriter(); /* Header and begin of body. */ out.println("<html><head><title>"); out.println("portal-1 login form"); out.println("</title></head>"); out.println("<body text=\"#000000\" bgcolor=\"#ffffff\">"); /* Begin of form. */ out.println("<form method=\"post\" action=\"processlogin\">"); /* Begin of table. */ out.println("<table width=\"100%\" border=\"0\" align=\"center\" " + "cellspacing=\"12\">");

es.udc.fbellas.j2ee.servjsptutorial.portal1.showloginservlet (3) /* Login name. */ out.println("<tr>"); out.println("<th align=\"right\" width=\"50%\"> Login name </th>"); out.println("<td align=\"left\">" + "<input type=\"text\" name=\"loginname\" " + " value=\"" + loginname + "\" size=\"16\" maxlength=\"16\">" + loginnameerrormessage + "</td>"); out.println("</tr>"); /* Print Login button. */ out.println("<tr>"); out.println("<td width=\"50%\"></td>"); out.println("<td align=\"left\" width=\"50%\"> " + "<input type=\"submit\" value=\"login\"></td>"); out.println("</tr>");

es.udc.fbellas.j2ee.servjsptutorial.portal1.showloginservlet (y 4) /* End of table. */ out.println("</table>"); /* End of body and html. */ out.println("</body></html>"); /* Close "out". */ out.close(); public void dopost(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { doget(request, response);

es.udc.fbellas.j2ee.servjsptutorial.portal1.processloginservlet (1) public class ProcessLoginServlet extends HttpServlet { public void dopost(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { String loginname = request.getparameter("loginname"); if ( (loginname == null) (loginname.trim().length() == 0) ) { Map errors = new HashMap(); errors.put("loginname", "Mandatory field"); request.setattribute("errors", errors); forwardtoshowlogin(request, response); else { LoginManager.login(request, loginname.trim()); response.sendredirect("mainpage");

es.udc.fbellas.j2ee.servjsptutorial.portal1.processloginservlet (y 2) public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { dopost(request, response); private void forwardtoshowlogin(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { RequestDispatcher requestdispatcher = request.getrequestdispatcher("/portal1/showlogin"); requestdispatcher.forward(request, response);

es.udc.fbellas.j2ee.servjsptutorial.portal1.processlogoutservlet public class ProcessLogoutServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { LoginManager.logout(request); response.sendredirect("../index.jsp"); public void dopost(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { doget(request, response);

es.udc.fbellas.j2ee.servjsptutorial.portal1.loginmanager (1) public final class LoginManager { private final static String LOGIN_NAME_SESSION_ATTRIBUTE = "loginname"; private LoginManager() { public final static void login(httpservletrequest request, String loginname) { HttpSession session = request.getsession(true); session.setattribute(login_name_session_attribute, loginname); public final static void logout(httpservletrequest request) { HttpSession session = request.getsession(false); if (session!= null) { session.invalidate();

es.udc.fbellas.j2ee.servjsptutorial.portal1.loginmanager (y 2) public final static String getloginname(httpservletrequest request) { HttpSession session = request.getsession(false); if (session == null) { return null; else { return (String) session.getattribute( LOGIN_NAME_SESSION_ATTRIBUTE);

Comentarios (1) El ejemplo, aparte de ilustrar el uso de sesiones, hace énfasis en el uso de sendredirect y forward sendredirect Le decimos al navegador que nos haga una nueva petición a otra URL forward Nos movemos a otra URL Ocurre dentro del servidor Se conserva todo lo que había en la request Útil para tratar errores en formularios Los servlets de procesamiento enganchan el atributo errors (un Map) en la request Los servlets que muestran formularios comprueban si la request incluye el atributo errors

Comentarios (2) Más sobre tipos de URLs Los tipos de URLs que hemos visto al principio de este apartado se refieren a las URLs en ficheros HTML, páginas JSP o respuestas generadas Qué tipos de URLs acepta sendredirect? Los tres tipos que conocemos hasta ahora Lógico, pues un sendredirect se usa para informar al navegador que nos haga una petición a otra URL Qué tipos de URLs acepta forward? De tipo path relativo (sin salir de la aplicación) De tipo path relativo a contexto Empiezan por / y no incluyen el nombre de la aplicación Ej.: /Portal1/MainPage Existe otra manera de hacer forwards distinta a la mostrada en el ejemplo, que sólo acepta URLs de tipo path relativo a contexto Servlet.getServletContext().getRequestDispatcher (String)

Comentarios (y 3) Cuándo usar forward y cuándo sendredirect? En principio, un forward siempre es más rápido (ocurre en el servidor) Un forward es preciso cuando queremos enganchar atributos a la request Ej.: Tratamiento de errores en formularios Para el resto de situaciones, es mejor usar un sendredirect, dado que forward no cambia la URL que muestra la caja de diálogo del navegador (el navegador no se entera de que se hace un forward), lo que será confuso si el usuario decide recargar la página (se invocará a la URL antigua que todavía muestra la caja de diálogo del navegador)