Todos los logos y marcas utilizados en este documento, estn registrados y pertenecen a sus respectivos dueos. AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Servlet Workshop 1
Curso: "Java EE y Frameworks" 2013
Objetivo El objetivo de esta prctica es descubrir las funciones avanzadas de los Servlets utilizando NetBeans IDE. En especial la implementacin de filtros en los servlets y ciclos de vida mediante eventos controlados por mtodos especializados segn los contextos que se quieran controlar, de aplicacin, de sesin o de peticin HTTP. En el primer ejercicio vamos a construir, y ejecutar una sencilla aplicacin implementada por dos servlets que interactan mediante el envo de datos de formularios. En el Segundo ejercicio, vamos a agregar un filtro o dos a nuestra aplicacin Web y observaremos como el mtodo doFilter() de la clase de filtro es llamado por el contenedor de despliegue. En nuestra ltima prctica, vamos a construir un ciclo de vida al los sevlets para el control de eventos de la aplicacin y observaremos cmo estos son llamado segn su contexto.
Aparece una Nueva Venta New Proyect Seleccionar Projecto->Choose Project -> Seleccionamos Java Web-> Web Application.
Aparece una Nueva Venta New Web Application En el Nombre (Proyect Name) escribimos hola-mundo-servlet Clic en Siguiente (Next) El Servidor lo dejamos tal cual en Glassfish v3 Es importante seleccionar la versin de Java EE 5 (Al final del curso veremos Servlet 3.0 de Java EE6). Y clic en Finalizar (Finish) AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Servlet Workshop 4
Lugo en el panel de la izquierda de NetBeans, en la pestaa Projects aparece nuestro proyecto recin creado hola-mundo-servlet
Lugo cerramos el archivo creado automticamente index.jsp con la cruz (x) Sombre el nombre del proyecto hola-mundo-servlet botn derecho del mouse. Botn derecho: Clic en New -> Other AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Servlet Workshop 6
Curso: "Java EE y Frameworks" 2013
Aparece una nueva ventana New File Seleccionamos categora Web -> Servlet (en tipo de archivo) AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Servlet Workshop 7
Curso: "Java EE y Frameworks" 2013
Una nueva ventana aparece New Sevlet Ingresamos el nombre de la Clase Servlet SaludarServlet En Package colocamos saludar Next> AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Servlet Workshop 8
Curso: "Java EE y Frameworks" 2013
En la siguiente ventana nos permite configurar el archivo web.xml que es el Servlet Deployment o archivo de configuracin del archivo de despliegue. Finalmente hacemos un clic en Finish AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Servlet Workshop 9
Curso: "Java EE y Frameworks" 2013
Aparece nuestra clase Java Servlet SaludarServlet con una estructura de contenido por defecto. Dentro del mtodo processRequest cambiamos el contenido por el siguiente, reemplazndolo:
out.println("<h2>Hola, mi nombre es Zsamer. Cul es tu nombre?</h2>" + "<form action=\"ResponderServlet\" method=\"post\">" + "<input type=\"text\" name=\"nombre\" size=\"25\">" + "<p></p>" + "<input type=\"submit\" value=\"Submit\">" + "<input type=\"reset\" value=\"Reset\">" + "</form>"); out.println("</body>"); out.println("</html>"); } finally { AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Servlet Workshop 10
Curso: "Java EE y Frameworks" 2013
out.close(); } }
Luego de la misma forma en que creamos el servlet SaludarServlet, ahora creamos al servlet encargado de procesar el formulario y obteniendo el valor del nombre ingresado en el formulario. Sombre el nombre del proyecto hola-mundo-servlet botn derecho del mouse. Botn derecho: Clic en New -> Sevlet Ingresamos el nombre de la Clase Servlet ResponderServlet En Package colocamos saludar, el mismo del anterior. Finish
Dentro del mtodo processRequest cambiamos el contenido por el siguiente, reemplazndolo: protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try {
// obtenemos el parmetro de la peticin String nombre = request.getParameter("nombre");
Ejercisio 2: Creando y configurando un Servlet Filters (Filtros) En este paso, vamos a agregar un filtro al ejercicio anterior usando NetBeans. 1. Click-Derecho en el proyecto hola-mundo-servlet y seleccionar New->Other. 2. Escoger Web bajo Categoras (Categories) y seleccionar Filter bajo File Types. 3. ClicNext. (ver Figura-Abajo)
Clicen Finish para aceptar los valores por defecto de Filter Name y Filter Mappings de la configuracin del archivo de despliegue. Esto modificar automticamente el archivo de despliegue web.xml. (ver Figura abajo)
En la clase Filter MiPropioFilter, desde el nmero de lnea 87 hasta 125, buscar el mtodo doFilter() como se muestra el Cdigo ms abajo.
/** * * @param request The servlet request we are processing * @param response The servlet response we are creating * @param chain The filter chain we are processing * * @exception IOException if an input/output error occurs * @exception ServletException if a servlet error occurs */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (debug) log("MiPropioFilter:doFilter()");
doBeforeProcessing(request, response);
Throwable problem = null; try { chain.doFilter(request, response); } catch(Throwable t) { // If an exception is thrown somewhere down the filter chain, // we still want to execute our after processing, and then // rethrow the problem after that. problem = t; t.printStackTrace(); }
doAfterProcessing(request, response);
// If there was a problem, we want to rethrow it if it is // a known type, otherwise log it. if (problem != null) { if (problem instanceof ServletException) throw (ServletException)problem; if (problem instanceof IOException) throw (IOException)problem; sendProcessingError(problem, response); } }
Des-comentar el fragmento de cdigo tal como se muestra en el texto de abajo (lnea 44-59). Se destacan en negrita. private void doBeforeProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException { if (debug) log("MiPropioFilter:DoBeforeProcessing");
// Write code here to process the request and/or response before // the rest of the filter chain is invoked.
// For example, a logging filter might log items on the request object, // such as the parameters. // ------------- descomentar el siguiente fragmento de cdigo ----------------- for (Enumeration en = request.getParameterNames(); en.hasMoreElements(); ) { String name = (String)en.nextElement(); String values[] = request.getParameterValues(name); int n = values.length; StringBuffer buf = new StringBuffer(); buf.append(name); buf.append("="); for(int i=0; i < n; i++) { buf.append(values[i]); if (i < n-1) buf.append(","); } log(buf.toString()); } // -------------- final del descomentado fragmento de codigo ------------------
// Write code here to process the request and/or response after // the rest of the filter chain is invoked.
// For example, a logging filter might log the attributes on the // request object after the request has been processed. // ------------- descomentar el siguiente fragmento de cdigo ----------------- for (Enumeration en = request.getAttributeNames(); en.hasMoreElements(); ) { String name = (String)en.nextElement(); Object value = request.getAttribute(name); log("attribute: " + name + "=" + value.toString()); } // -------------- final del descomentado fragmento de codigo ------------------ // For example, a filter might append something to the response. /* PrintWriter respOut = new PrintWriter(response.getWriter()); respOut.println("<P><B>This has been appended by an intrusive filter.</B>"); */ }
Finalmente, Clic- Boton Derecho -> Fix Imports Guardamos Con esto importa las clases faltantes en el contexto.
Clic-Derecho en el proyecto hola-mundo-servlet y seleccionar Run. Se abre el Navegador con la ruta base y cambiamos la url a: http://localhost:8080/hola-mundo- servlet/SaludarServlet -> Enter. Tipe su nombre en el campo (input form) y Clicel botn Submit. Esto enviar una peticin (HTTP request)hacia la aplicacin, la cual pasar a travs de filtro.
Clicen el Tab de GlassFish Domain (Log) y observe que nombre=zsamer (o el que haya tipiado) son mostrado en el fichero de log de la plataforma de despliegue, en ste caso, servidor de aplicaciones GlassFish v3. (ver Figura de abajo)
1. Doble-Clicweb.xml bajo hola-mundo-servlet ->Configuration Files para abrir ste en el editor. 2. Clicen la pestaa Filters tab y observe las configuraciones del filtro. (ver Figura de abajo)
Clicpestaa XML par ver en formato de xml. Observe el filtro de configuracin mediante los elementos <filter> y <filter-mapping> en el archivo web.xml. (ver Figura de abajo)
Agregar otro filtro en la aplicacin hola-mundo-servlet
Aadir otro filtro a la aplicacin hola-mundo-servlet siguiendo los pasos mencionados en el punto anterior. Nombre del filtro como MiPropioFiltro2. Genere y ejecute la aplicacin y observe que los mensajes de registro del filtro se muestran en el archivo de log de GlassFish de ambos MiPropioFiltro1 y MiPropioFiltro2.
Ejercicio 3: Eventos del ciclo de vida de un Servlet Se pueden monitorizar y reaccionar a eventos en el ciclo de vida de un servlet definiendo objetos listener cuyos mtodos sern invocados cuando un evento life-cycle se suceda. Para utilizar estos objetos listener se debe definir y especificar la clase listener.
Agregar un Evento al ciclo de vida de la aplicacin hola-mundo-servlet-> ClicBotn derecho y seleccionar New->Other. Seleccionar Web bajo Categorias y seleccionar Web Application Listener bajo File Types. ClicNext. (Ver figura de abajo)
Par el nombre de clase (campo Class Name), escriba MiPropioEventListener. Para el campo Package, tipe mipackage. Bajo la seccin Interface to implement o Interface a implementar, seleccione lo siguiente. (ver Figura-abajo): o ContextListener o HTTP Session Listener o Request Listener (J2EE 1.4)
Modificar el Event Listener MiPropioEventListener.java, tal como se muestra en el cdigo de abajo. El fragmento de cdigo que necesita ser agregado est en azul y negrita. Bsicamente estamos agregando un sistema de log o bitcora de eventos para cada mtodo de manejador de eventos.
/** * Web application lifecycle listener. * @author Andrs Guzmn F */ public class MiPropioEventListener implements ServletContextListener, HttpSessionListener, ServletRequestListener {
ServletContext servletContext;
public void contextInitialized(ServletContextEvent sce) { //throw new UnsupportedOperationException("Not supported yet.");
servletContext = sce.getServletContext(); servletContext.log("contextInitialized() method is invoked"); }
public void contextDestroyed(ServletContextEvent sce) { //throw new UnsupportedOperationException("Not supported yet."); servletContext.log("contextDestroyed() method is invoked"); }
public void sessionCreated(HttpSessionEvent se) { //throw new UnsupportedOperationException("Not supported yet."); servletContext.log("sessionCreated() method is invoked"); }
public void sessionDestroyed(HttpSessionEvent se) { //throw new UnsupportedOperationException("Not supported yet."); servletContext.log("sessionDestroyed() method is invoked"); }
public void requestDestroyed(ServletRequestEvent sre) { //throw new UnsupportedOperationException("Not supported yet."); servletContext.log("requestDestroyed() method is invoked"); }
public void requestInitialized(ServletRequestEvent sre) { //throw new UnsupportedOperationException("Not supported yet."); servletContext.log("requestInitialized() method is invoked"); } }
Click-Derecho en proyecto hola-mundo-servlet y seleccionar Run. Clicen la pestaa GlassFish Log y observe los mensajes desplegados en el archivo de log de Glassfish. (ver Figura de abajo) Ntese que el controlador de evento contextIntialized() se invoca por primera vez , ste es llamado una vez desplegada la aplicacin. Observe tambin que ha ocurrido la primera peticin/respuesta HTTP (request/response) entre el navegador y la aplicacin, y el de cmo son llamados los controladores de eventos requestInitialized() y requestDestroyed() . (ver Figura de abajo)
En el navegador, ejecute la direccin URL del Servlet Saludar: http://localhost:8080/hola-mundo-servlet/SaludarServlet Escriba su nombre en el formulario y clic en botn Submit. Esto ejecutar, la segunda peticin HTTP request/response, entre en navegador y la aplicacin. Clic en la pestaa de GlassFish Log y observe los mensajes del log. (ver figura de abajo)
Modifique SaludarServlet.java bajo el proyecto actual hola-mundo-servlet ->Source Package->saludar, tal como se muestra en el cdigo de abajo. La nueva pieza de cdigo que se agregar estar destacada en negrita y de color azul. Esto gatillar la creacin de un objeto de sesin HttpSession (si no ha sido creada anteriormente), a su vez producir un llamado al controlador de evento sessionCreated(). protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter();
// Get a session HttpSession session = request.getSession();
try { out.println("<html>"); out.println("<head>"); out.println("<title>Hola Mundo SaludarServlet</title>"); out.println("</head>"); out.println("<body>");
out.println("<h2>Hola, mi nombre es Zsamer. Cul es tu nombre?</h2>" + "<form action=\"ResponderServlet\" method=\"post\">" + "<input type=\"text\" name=\"nombre\" size=\"25\">" + "<p></p>" + "<input type=\"submit\" value=\"Submit\">" + "<input type=\"reset\" value=\"Reset\">" + "</form>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } }
Clic Botn Derecho -> Fix Imports. De similar forma Modificamos el Servlet de respuesta ResponderServlet.java bajo hola-mundo- servlet ->Source Package->saludar, tal como se muestra en el cdigo de abajo. El nuevo cdigo agregado estar destacada en negrita y de color azul. Esto gatillar el cierre de la sesin del objeto de sesin HttpSession, a su vez producir un llamado al controlador de evento sessionDestroyed(). protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try {
// obtenemos el parmetro de la peticin String nombre = request.getParameter("nombre");
if ((nombre != null) && (nombre.length() > 0)) { out.println("<h2>Hola, " + nombre + "!</h2>"); } // Close the HttpSession request.getSession().invalidate(); } finally { out.close(); } }
Sobre el hola-mundo-servlet Clic botn derecho y seleccionar Run. En el navegador, ejecute la direccin URL del Servlet Saludar: http://localhost:8080/hola- mundo-servlet/SaludarServlet En output, Clic en la pestaa GlassFish Log y observe sol mensajes mostrados en el los de la plataforma de despliegue, en este caso, GlassFish. Ntese que el controlador de eventos sessionCreated() fue invocado. (ver Figura de abajo)
Escriba su nombre en el formulario y clic en botn Submit. Esto ejecutar, la segunda peticin HTTP request/response, entre en navegador y la aplicacin. Clic en la pestaa de GlassFish Log y observe los mensajes del log. Ntese que el controlador de eventos sessionDestroyed () fue invocado. (ver Figura de abajo) AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Servlet Workshop 32
Se emplea al comando undeploy para detener y eliminar la aplicacin del servidor, en otras palabras se refiere a eliminar su publicacin. o Seleccionar la pestaa Services, (Panel izquierdo de netbenas justo al lado de la pestaa Projects) o Expander Servers->GlassFish v3 Domain->Applications-> Applications y clic boton derecho en hola-mundo-servlet. o Seleccionar Undeploy.
Clic en la pestaa de GlassFish Log y observe los mensajes del log. Ntese que el controlador de eventos contextDestroyed () fue invocado. (ver Figura de abajo)
2. Seleccionar File->Open Project (Ctrl+Shift+O). Descargar proyecto ServletExamples.rar de la semana. o Windows: Descomprimir el archivo ServletExamples.rar bajo el directorio C:\curso\javaee\servlet, antes tener creado el directorio. o Solaris/Linux: Descomprimir el archivo ServletExamples.rar bajo el directorio $HOM/curso/javaee/servlet, antes tener creado el directorio. Seleccionar File->Open Project (Ctrl+Shift+O). La ventana de dilogo Open Project aparece. o Buscar proyecto descomprimido en el paso anterior en \curso\javaee\servlet Seleccionar ServletExamples Clic en Open Project. El Nuevo Proyecto es agregado bajo la pestaa Projects
Observe que el nodo del proyecto ServletExamples aparece en ventana de la pestaa Projects.
3. Construir y ejecutar el proyecto ServletExamples: o Clic-derecho en proyecto ServletExamples y seleccionar Run. o El navegador se abre, mostrando una pantalla. 4. Clic en Execute para ejecutar el Sevlet "Hello World". (Ver Figura abajo) 5. Clic en Source para ver el correspondiente cdigo fuente. (Ver Figura abajo)
6. Tambien ejecutar y ver el cdigo fuente de Request Info, Request Headers y Request Parameters. 7. Modificar parte de la aplicacin Hello World Modificar HelloWorldExample.java bajo ServletExamples->Source Packages-><default package> como se muestra en el codigo de abajo. El fragment de cdigo que sera agregado estar marcado en negrita y de color azul.
public class HelloWorldExample extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ResourceBundle rb = ResourceBundle.getBundle("LocalStrings",request.getLocale()); response.setContentType("text/html"); PrintWriter out = response.getWriter();
out.println("<html>"); out.println("<head>");
String title = rb.getString("helloworld.title");
out.println("<title>" + title + "</title>"); out.println("</head>"); out.println("<body bgcolor=\"white\">");
// note that all links are created to be relative. this // ensures that we can move the web application that this // servlet belongs to to a different place in the url // tree and not have any harmful side effects.
// XXX // making these absolute till we work out the // addition of a PathInfo issue
out.println("<a href=\"../helloworld.html\">"); out.println("<img src=\"../images/code.gif\" height=24 " + "width=24 align=right border=0 alt=\"view code\"></a>"); out.println("<a href=\"../index.html\">"); out.println("<img src=\"../images/return.gif\" height=24 " + "width=24 align=right border=0 alt=\"return\"></a>"); out.println("<h1>" + title + "</h1>"); out.println("mi propio mensaje de saludo: Hola Mundo, que tal!"); out.println("</body>"); out.println("</html>"); } } Clic-derecho en el proyecto ServletExamples y seleccionar Run Right click ServletExamples project node and select Run Clic Execute para ejecutar los cambios en el servlet "Hello World". Observe en el navegador los cambios:
En este ejercicio, hemos creado y agregado dos Clases Servlet, SaludarServlet y RespuestaServlet, para implementar una aplicacin Web que permite interactuar un usuario mediante un formulario y la aplicacin que se encarga de procesar la informacin ingresada por el usuario. Luego agregamos un Servlet filter, el cual se encarga de mostrar los parmetros de la peticin en la consola y log del servidor de aplicaciones o plataforma de despliegue. Finalmente, hemos agregado unos cuantos ciclos de vida a los servlets implementado controladores de eventos en una clase EventListener de Java EE, en diferentes mbitos, en el de contexto de la aplicacin, en las sesiones y en las peticiones o request. Enva tus consultas a los foros! Aqu es cuando debes sacarte todas las dudas haciendo consultas en los foros correspondientes AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Servlet Workshop 41