Sistemas de Información 12/13 Servlets y JSPs (Java Server Pages) Departamento Informática e Ingeniería de Sistemas Universidad de Zaragoza Raquel Trillo Lado ([email protected]) " Guión Introducción Servlets Introducción Clases e interfaces del API Ejemplos Java Server Pages (JSPs) Introducción Ejemplos Empaquetamiento de una aplicación Web Bibliografía Sistemas de Información Raquel Trillo Lado Introducción Aplicación Web: Es una aplicación que se ejecuta en un servidor Web y a la que el usuario accede desde un cliente de propósito general (por ejemplo: un navegador web en un pc, teléfono móvil, …): Contenido estático y dinámico Servidor/Contenedor de aplicaciones Web: Cliente Web (Navegador) Sistemas de Información HTTP Contenido estático: html, pdf, jpg, png, etc.. Contenido dinámico generado cuando se recibe una petición: -Diferentes tecnologías: Servlets, ASP, PHP Raquel Trillo Lado Servlets: Introducción Servlet: Un ejecutable escrito en lenguaje Java que normalmente se ejecuta en respuesta a una petición http: Puede recibir peticiones HTTP Procesa datos y genera una respuesta acorde con los parámetros generando una página HTML en tiempo de ejecución (página HTML dinámica) Sistemas de Información Raquel Trillo Lado Servlets: Introducción Antes de los Servlets: CGI Scripts (Common Gateway Interface): • Requieren crear un proceso por petición (más recursos y tiempo ejecución) • Dependientes de la plataforma Servlets: • Se ejecutan en diferentes hilos (threads) del proceso servidor • Independientes de la plataforma Sistemas de Información Raquel Trillo Lado Servlets: Introducción Cada Servlet puede estar asociado a una o más URLs: El contenedor de aplicaciones asocia URLs a Servlets Paquetes javax.servlet y javax.servlet.http: Sistemas de Información Raquel Trillo Lado Servlets: Clases e interfaces del API Servlets: Clases e interfaces del API El método init se ejecuta cuando el servidor de aplicaciones Web decide cargar el Servlet en memoria: Cuando se arranca el servidor La primera vez que se requiere que se ejecute el Servlet Cuando se accede a algún componente de la aplicación Web El método destroy se ejecuta cuando el servidor de aplicaciones Web decide eliminar el Servlet de memoria: Cuando se para el servidor Cuando se para la aplicación web Cuando lleva cierto tiempo sin usarse Sistemas de Información Raquel Trillo Lado Servlets: Clases e interfaces del API El método service se ejecuta cuando se requiere el servicio proporcionado por el Servlet: Cuando se recibe una petición asociada a las URLs ligadas al Servlet. Los parámetros de la petición están codificados en el objeto ServletRequest La salida a enviar al cliente se codifica en el objeto ServletResponse Servlets: Clases e interfaces del API El método público service se implementa llamando a la operación protegida service la cual es una operación plantilla que llama al método doGet o doPost según la petición http sea de tipo GET o de tipo POST E n g e n e r a l s e e x t i e n d e l a c l a s e javax.servlet.http.HttpServlet y se redefinen los métodos doGet y/o doPost Sistemas de Información Raquel Trillo Lado Servlets: Clases e interfaces del API E l m é t o d o p ú b l i c o d e H t t p S e r v l e t R e q u e s t getParameter permite obtener el valor de un parámetro que tiene asociado un único valor E l m é t o d o p ú b l i c o d e H t t p S e r v l e t R e q u e s t getParameterValues permite obtener el valor de un parámetro multivaluado (aunque también se puede usar con parámetros monovaluados) E l m é t o d o p ú b l i c o d e H t t p S e r v l e t R e s p o n s e setContentType permite establecer el tipo de contenido de la respuesta y debe llamarse antes de comenzar a escribir en el objeto PrintWriter proporcionado por el método getWriter Sistemas de Información Raquel Trillo Lado Servlets: Ejemplos C r e a c i ó n d e u n s e r v l e t q u e p r o c e s e l o s d a t o s proporcionados por el cliente en el siguiente formulario y le comunique si la operación se ha realizado de forma correcta o ha habido algún error: Sistemas de Información Raquel Trillo Lado Servlets: Ejemplos Ejercicio: Crear la página html que cree el formulario mostrado en la transparencia anterior. Además asociarle al formulario la siguiente acción: http://localhost:8080/ MiPrimeraAplicacion/InsertUser Sistemas de Información Raquel Trillo Lado Servlets: Ejemplos … import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; …. public class InsertUserServlet extends HttpServlet{ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String loginName = request.getParameter(”login"); String password = request.getParameter(“pw"); String repassword = request.getParameter(”repw"); String name = request.getParameter(“name"); String surname = request.getParameter(“surname"); String email = request.getParameter(“email"); …... Sistemas de Información Raquel Trillo Lado Servlets: Ejemplos package miprimeraaplicacion.ejemplo1 public class InsertUserServlet extends HttpServlet{ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ... //Comprobación de parámetros //p.e.: todos los campos obligatorios deben ser distintos de null, // la clave debe ser igual a la clave tecleada por segunda vez, // la dirección de correo debe ser una dirección válida // Si los parámetros son correctos se crea el objeto usuario // y se realiza una llamada a una clase del modelo que realiza la inserción en la bd UserVO user = new User (login, password, name, surname, email, language, country) try { ModelFacade model = new ModelFacade(); model.insertUser(user); }catch Exception e{ response.sendRedirect(“paginaError.html”) }… } Sistemas de Información Raquel Trillo Lado Servlets: Ejemplos public class InsertUserServlet extends HttpServlet{ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ... try { ModelFacade model = new ModelFacade(); model.insertUser(user); }catch Exception e{ response.sendRedirect(“paginaError.html”) } response.setContentType(“text/html; charset=ISO-8859-1”); PrinterWriter out = response.getWriter(); out.println(“<html><head><title>Inserción del usuario</title></head>”); out.println(“<body><p> El usuario con login “ + login + “se ha registrado correctamente </p>”); out.println(“</body></html>”); } Sistemas de Información Raquel Trillo Lado Servlets: Ejemplos El método sendRedirect le indica al cliente como respuesta a la petición http que ha hecho que genere una nueva petición a la URL que se le indica como parámetro A veces interesa pasar el control a otro servlet o JSP dentro del servidor en lugar de indicar una respuesta al cliente. En ese caso se emplea el método forward Sistemas de Información Raquel Trillo Lado Servlets: Ejemplos RequestDispatcher dispatcher = request.getRequestDispatcher(url); dispatcher.forward(request,response) Se pasa el control a otro servlet dentro del servidor. El cliente no es consciente de los forwards (la dirección del navegador muestra la URL correspondiente a la petición original) y por tanto se debe conservar el objeto request y response Sistemas de Información Raquel Trillo Lado JSPs: Introducción Una página JSP es un tipo especial de Servlet orientado a crear una interfaz gráfica: Tiene aspecto de una página HTML Puede incluir scriptlets (scripts) que se escriben en Java para generar código html dinámicamente JSPs: Introducción Cuando se accede a una página JSP: Si es la primera vez que se accede a ella entonces el servidor de apliaciones web implementa (lo genera a partir de la página jsp) un servlet asociado a dicha página, lo compila y lo carga en memoria Si no es la primera vez, le pasa la petición al servlet asociado Si la página jsp se ha modificado desde la compilación del servlet que tiene asociado y se requiere dicha página, entonces se genera un nuevo servlet Sistemas de Información Raquel Trillo Lado JSPs: Ejemplos Creación de una página JSP que procese los datos proporcionados por el cliente en el siguiente formulario de búsqueda y le comunique los datos de ese cliente si este existe: Ejercicio: Crear la página html que cree el formulario de búsqueda (acción http://localhost: 8080/MiPrimeraAplicacion/ShowUser.jsp ) Sistemas de Información Raquel Trillo Lado JSPs: Ejemplos <%@ page import=“miaplicacion.userVO”> <html> <%-- Comentarios en las páginas JSP --%> <head><title>Show a user </title></head> <body> <% String login = request.getParameter(“login”); try { ModelFacade model = new ModelFacade(); UserVO user = model.findUser(login); } catch Exception e{ response.sendRedirect(“paginaError.html”)} if (user == null) response.sendRedirect(“paginaError.html”) %> <h1>Información del usuario buscado (<%=login%>) </h1> <p>Nombre: <%= user.getLogin() %> </p> <p>Apellidos: <%= user.getSurname() %> </p> … </body> </html> Sistemas de Información Raquel Trillo Lado JSPs: Ejemplos Las páginas JSP usan <% ….%> para incluir código Java (crear scriptlets) Las páginas JSP usan la directiva <%@ … %> para importar clases Las páginas JSP usan <%--….--%> para generar comentarios (no en el html) Las páginas JSP tienen definidos los siguientes objetos de forma implícita: request: javax.servlet.http.HttpServletRequest response: javax.servlet.http.HttpServletResponse session: javax.servlet.http.HttpSession out: javax.servlet.jsp.JspWriter Las páginas JSP usan <%= expresión %> para incluir expresiones en Java que dan como resultado un objeto String o un objeto convertible a String (llamada al método toString()) Sistemas de Información Raquel Trillo Lado JSPs: Ejemplos Cuando usar JSP y cuando Servlets: JSP para la generación de la vista de la aplicación: Visualización de formularios y de mensajes de error después de validar los parámetros de entrada del formulario en el servidor Visualizar los resultados de una operación (por ejemplo una operación de búsqueda) Servlets para el procesamiento de los formularios y las llamadas a la capa modelo de la aplicación: Si los parámetros son válidos realizará la correspondiente operación y pasará el control a la página JSP que visualiza los resultados de la acción Si no lo son detectará los errores y pasará el control a la página JSP que permita al usuario subsanar lo errrores Sistemas de Información Raquel Trillo Lado Empaquetamiento de una aplicación Web ¿Cómo hacer disponible una aplicación Web? Instándola (deployment) en el servidor web Los servidores/contenedores de aplicaciones Web que trabajan con tecnologías Java emplean ficheros war. Jar cvf miPrimeraAplicacion.war directorio Estructura del fichero .war: Directorio WEB-INF/classes: contiene los ficheros .class de la aplicación web agrupados en directorios según su estructura de paquetes Directorio WEB-INF/lib: contiene los ficheros .jar de las liberías que usa la aplicación (por ejemplo el driver jdbc de conexión a la BD) Sistemas de Información Raquel Trillo Lado Empaquetamiento de una aplicación Web Estructura del fichero .war: Directorio WEB-INF/web.xml: fichero de configuración de la aplicación web que contiene diversos parámetros (p.e. qué URLs se asocian a cada Servlet incluido en la aplicación) Directorio raíz y subdirectorios que contienen los ficheros vista de la aplicación: Páginas HTML, CSS, imágenes, páginas JSP Los navegadores (clientes) no pueden acceder al contenido de WEB-INF (sólo es visible para los servlets y JSP) Sistemas de Información Raquel Trillo Lado Empaquetamiento de una aplicación Web <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns=“http://java.sun.com/xml/ns/javaee” xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>Mi primera aplicación Web</display-name> <!-- ================ Servlets ================ --> <servlet> <servlet-name>InsertUser</servlet-name> <servlet-class>miprimeraaplicacion.ejemplo1.InsertUserServlet </servlet-class> </servlet> Sistemas de Información Raquel Trillo Lado Empaquetamiento de una aplicación Web <!-- ===--========= Servlets Mapping======= --> <servlet-mapping> <servlet-name>InsertUser</servlet-name> <url-pattern>/InsertUser</url-pattern> </servlet-mapping> <!-- ============ Welcome page ========= --> <welcome-file-list> <welcome-file>Index.html</welcome-file> </welcome-file-list> </web-app> Sistemas de Información Raquel Trillo Lado Empaquetamiento de una aplicación Web En el ejemplo sólo se muestran algunas etiquetas comunes Display-name: Define el nombre de la aplicación Web Servlet: Declara cada clase servlet que forma parte de la aplicación (servlet-class) y le asigna un nombre (servletname) Servlet-mapping: Define las URLs asociadas a cada servlet (url-pattern) definido anteriormente (servlet-name) Welcome-file-list: indica la página devuelta por el servidor cuando se acceda a la aplicación (welcome-file) Sistemas de Información Raquel Trillo Lado Bibliografía Mark Andrews “Story of a Servlet: An instant Tutorial” (http://www.oracle.com/technetwork/ java/tutorial-138750.html) Fernando Bellas Permuy “Integración de Sistemas”, Ingeniería Informática, Universidad da Coruña Transparencias en la plataforma Blackboard 9.1 del Anillo Digital Docente (ADD): http:// bb.unizar.es Sistemas de Información Raquel Trillo Lado