Vous êtes sur la page 1sur 11

4.

DESARROLLO WEB CON JAVA JSP & SERVLETS


La programacin de aplicaciones web sobre la especificacin de JSP y Servlets es un subconjunto de la plataforma Java EE. Existen muchas formas de estructurar una aplicacin web en funcin de los elementos y patrones de diseo empleados y la complejidad del propio desarrollo (Fuente: INTEGRATING SERVLETS AND JSP: THE MODEL VIEW CONTROLLER (MVC) ARCHITECTURE).

Aplicaciones sencillas o equipo de desarrollo pequeo

Aplicaciones complejas o equipo de desarrollo grande

Invocar a clases directamente desde el cdigo Java: el cdigo Java estar embebido en el JSP. En este caso se programa la lgica de negocio en el JSP. Nada recomendable. Invocar a clases Java de forma indirecta: se embeber el cdigo necesario para invocar a las clases que formen parte de la lgica de negocio. Utilizacin de beans (MVC 1): las clases que formen parte de la lgica de negocio sern implementadas como beans. Utilizacin de una arquitectura MVC 2: un Servlet gestionar las peticiones, invocar a la lgica de negocio, acceder a los datos y guardar el resultado en beans. El Servlet almacenar los resultados en la request y la redirigir al JSP para mostrar los resultados. La pgina JSP utiliza beans. Utilizacin de JSP EL (Expression Language): utilizacin de un lenguaje sencillo y abreviado para manejar los resultados generados por el controlador. Utilizacin de etiquetas personalizadas: se utilizar un gestor de etiquetas basadas en XML. Se requiere de un framework que gestione estas etiquetas de funcionalidad aadida.

QU ES UN BEAN
Un bean es un objeto convencional Java, el cual tiene como propsito encapsular a otros (de ah su nombre) o no. Para que una clase pueda ser tratada como bean debe cumplir con una serie de requisitos bsicos: Debe tener un constructor sin argumentos. Sus atributos (propiedades) deben ser accesibles mediante mtodos getter y setters pblicos. Debe ser serializable.

4.1. SERVLETS
Programas Java que se codifican en forma de clases. Los servlets heredan de la clase HttpServlet y permiten gestionar elementos HTTP mediante las clases: HttpServletRequest: recibe la peticin (mbito de request). HttpServletResponse: genera la respuesta. HttpSession: permite crear una sesin comn a un conjunto de request (mbito de sesin). ServletContext: gestiona la informacin comn a todas las peticiones realizadas sobre la aplicacin (mbito de aplicacin). Se obtiene a partir del mtodo getServletContext() de la clase HttpServlet.

4.2. JSP
http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/

4.2.1. SCRIPTLETS
Pginas HTML con cdigo Java embebido de dos formas: Scriptlets: cdigo Java multi-mensaje entre los smbolos <% %>. Cada mensaje debe ir separado por punto y coma. Expresiones: un mensaje Java que devuelve un resultado. No finaliza con punto y coma y se escribe entre los smbolos <%= %>.

Los elementos HTTP definidos en los servlets estn predefinidos en los JSP, como: request response sesin application

Estos objetos se podrn invocar directamente sin necesidad de definirlos, como se puede ver en el siguiente ejemplo:
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Bienvenido</h2> La hora actual es: <%= new java.util.Date() %> <% Persona p = new Persona(request.getParameter(nombre)); session.setAttribute(usuario, p); out.println(p.getNombre()); %> </body> </html>
Cdigo 11. Ejemplo de JSP tratando objetos.

Se pueden manipular las diferentes peticiones HTTP mediante el mtodo getHeader(String nombreCabecera).
<% if(request.getHeader("user-agent").contains("iPhone")) response.sendRedirect("/m/index.jsp"); %>
Cdigo 12. Ejemplo de JSP manipulando cabeceras HTTP.

4.2.2. JSP TAGS


Otra forma ms estructurada y elegante de implementar el cdigo Java en la pgina JSP es mediante la utilizacin de etiquetas JSP, al estilo HTML. Poseen una funcionalidad muy reducida y se utilizan sobre todo para la creacin y utilizacin de beans. Tambin, se puede especificar de forma aadida el mbito del bean con el parmetro scope.

<jsp:useBean id="hora1" class="service.ServicioHora" scope="session" /> <jsp:setProperty name="hora1" property="hora" value="12" /> <jsp:getProperty name="hora1" property="hora" />

Cdigo 13. Utilizacin de un Bean mediante JSP Tags.

En el caso de que los valores a asignar a las propiedades del bean sean parmetros de una peticin POST/GET, se utilizar param para establecer un parmetro determinado o property=* para asignar todos los parmetros a las propiedades. En este ltimo caso, el nombre de los parmetros deber coincidir con el nombre de la propiedad.

<jsp:useBean id="hora1" class="service.ServicioHora" scope="session" /> <jsp:setProperty name="hora1" property="hora" param="time" /> <jsp:setProperty name="hora1" property="*" />

Cdigo 14. Recuperacin de parmetros y creacin de un Bean mediante JSP tags.

4.3. ARQUITECTURA MVC


Fuente: http://www.oracle.com/technetwork/articles/javase/servlets-jsp-140445.html

4.3.1. MVC 1

4.3.2. MVC 2

4.4. SESIONES
En una aplicacin web existen tres contextos diferentes de trabajo. Por un lado est el contexto de la peticin web, como una request que realiza un usuario contra un recurso del servidor web. Cada peticin del usuario tiene su propio de espacio de memoria independiente. Si se desea compartir un espacio de memoria entre todas las peticiones realizadas por un mismo usuario, se debe trabajar con el concepto de sesin (session). Esto es muy til, por ejemplo, para comprobar si el usuario est accediendo a un recurso de la aplicacin y previamente se ha autenticado. Por ltimo, se puede compartir informacin entre todos los usuarios de la aplicacin en el espacio de memoria de aplicacin (application). Por defecto, cuando se crea una sesin para un usuario se genera un identificador nico para l en forma de Cookie en su navegador. El nombre de esta Cookie es JSESSIONID.

El trabajar con sesiones, conlleva a que el usuario tenga habilitada la aceptacin de cookies en su navegador. Por este motivo existe otra tcnica en la que se enva el identificador de sesin JSESSIONID como un parmetro ms de la URL.

Es importante destacar que esta prctica es negativa desde el punto de vista de SEO (distintas URLs, muestran el mismo contenido) y desde el punto de vista de seguridad, por la visibilidad del identificador de la sesin. Aplicacin: o Contenido del fichero web.xml:
<context-param> <param-name>bd</param-name> <param-value>personas</param-value> </context-param>

Cdigo Java de acceso a los parmetros:

this.getServletContext().getInitParameter("bd");

Sesin o Cdigo Java de creacin de la sesin:


HttpSession sesion = request.getSession(); sesion.setAttribute("persona", p1);

Cdigo Java de acceso a los atributos creados sobre la sesin:

HttpSession sesion = request.getSession(); if(sesion.getAttribute("persona")!=null)

Request o Cdigo Java de acceso a un atributo de la request:


String nombre = request.getParameter(nombre));

Operaciones que se pueden realizar con sesiones: boolean isNew(): devuelve true si el cliente no tena una previamente y el servidor la ha creado. void setMaxInactiveInterval(int segundos): establece el tiempo mximo de inactividad en la sesin para inhabilitar la sesin. invalidate(): inhabilita la sesin.

4.5. COOKIES
Las cookies permiten persistir informacin en el lado del cliente, vinculando un servidor con el ordenador, y nunca con el usuario. Generalmente, se utilizan para mejorar la experiencia de navegacin del usuario. La creacin de la cookie se realiza en el servidor gracias a la clase Cookie, envindosela al navegador a travs de la response, como se muestra en el cdigo siguiente.
Cookie c = new Cookie("usuario", request.getParameter("usuario")); c.setComment("Control de acceso"); c.setMaxAge(60*60*24); //expresado en segundos response.addCookie(c);
Cdigo 15. Servlet creando una cookie.

El navegador almacenar la cookie en el navegador.

Y se podr recuperar posteriormente para procesarla.


<% String valorUsuario = "Introduzca su usuario"; Cookie [] cookies=request.getCookies(); if(cookies!=null) { for(int i=0;i<cookies.length;i++) { Cookie c = cookies[i]; if(c.getName().equals("usuario")) valorUsuario = c.getValue(); } } %> <h1>Bienvenido</h1> <form action="/EjemploMVC/Validar" method="POST"> Usuario: <input type="text" name="usuario" value="<%=valorUsuario%>"> <input type="submit" value="Acceder"> </form>

Cdigo 16. Ejemplo de JSP recuperando las cookies del cliente.

A continuacin se describen algunas caractersticas de las cookies y cmo se implementan en Java: Cookies no manipulables desde Javascript en el cliente: ests cookies mitigan los ataques del tipo XSS.

c.setHttpOnly(true);

Cookies persitentes: permanecen vivas durante el tiempo especificado.

c.setMaxAge(Integer.MAX_VALUE);

Cookies de sesin: cuando se cierre el navegador, se elimnar.

c.setMaxAge(-1);

Cookies seguras: se enviarn slo mediante HTTPS.

c.setSecure(true);

A continuacin se muestra un ejemplo de cookies ledas mediante Javascript, definidas como HttpOnly y sin definir esta propiedad. Cdigo cliente
<script> function leerCookies() { alert("Cookies leidas: " + document.cookie.split(";")); } </script>

<small><a href="javascript:leerCookies();">leer cookies mediante Javascript</a></small>

Cdigo de generacin de la Cookie


Cookie c = new Cookie("pag", request.getParameter("pag")); c.setComment("aaaaaaaaaa"); c.setMaxAge(Integer.MAX_VALUE); //expresado en segundos response.addCookie(c);

Resultado sin definir la Cookie como HttpOnly

Cdigo de generacin de la Cookie


Cookie c = new Cookie("pag", request.getParameter("pag")); c.setComment("aaaaaaaaaa"); c.setHttpOnly(true); c.setMaxAge(Integer.MAX_VALUE); //expresado en segundos response.addCookie(c);

Resultado definiendo la Cookie como HttpOnly

4.6. EXPRESSION LANGUAGE (EL)

Lenguaje que simplifica el proceso de recuperacin de objetos almacenados en los elementos bsicos de una aplicacin web como son la request, session, cookies, etc. EL est basado en una notacin sencilla identificando los objetos entre los caracteres ${.}. La ventaja del lenguaje EL es poder utilizar cualquier objeto depositado como atributo en la request con la expresin ${objeto.propiedad}, sin necesidad de referenciar a este mbito, ni realizar downcastings. EL est incorporado por defecto en la especificacin JSP 2.0. As, el acceso a los objetos depositados en la request (tpica accin de un patrn MVC) se acceder directamente. Para el resto de elementos (parmetros, cookies, session, etc.) se utilizarn objetos predefinidos. JSP estndar
<% ArrayList<Persona> lista = (ArrayList<Persona>) request.getAttribute("listaResultado"); %>

JSP con EL
${listaResultado}

<% Persona p = (Persona) request.getAttribute ("persona"); String nombre = p.getNombre(); %>

${persona.nombre}

<%= request.getParameter("nombre") %>


Cdigo 17. Comparacin entre JSP estndar y EL.

${param["nombre"]}

Objetos predefinidos: param paramValues header headerValues cookie initParam

Objetos predefindos en funcin del mbito que posean: pageScope requestScope sessionScope applicationScope

${sessionScope.validado} ${cookie.usuario.value} ${header['User-Agent']}


Cdigo 18. Ejemplo de acceso a elementos Java Web mediante el lenguaje EL.

4.7. JSTL
http://download.oracle.com/docs/cd/E17802_01/products/products/jsp/jstl/1.1/docs/tlddocs/ http://www.labcom.upcomillas.es/isw2/docs/JSTL.pdf La librera JSTL est definida en la especificacin Java EE. Define un conjunto de etiquetas estandarizadas que simplifica el desarrollo de aplicaciones MVC. Las etiquetas JSTL se organizan en 4 libreras: core: funciones script bsicas como loops, condicionales, y entrada/salida. xml: procesamiento de xml fmt: la internacionalizacin y formato de valores como de moneda y fechas. sql: acceso a base de datos.

<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Ejemplo JSTL</title> <link rel="stylesheet" type="text/css" href="r/estilos.css" /> </head> <body> <p class="titulo">Informacin de las personas de la Base de Datos:</p> <hr> <table border="1" width="200"> <tr> <th>Nombre</th> <th>Edad</th> <th>DNI</th> </tr> <c:forEach var="persona" items="${personas}"> <tr> <td>${persona.nombre}</td> <td>${persona.edad}</td> <td>${persona.dni}</td> </tr> </c:forEach> </table> <br> <a href="/ISW2EjemploMVC/index.jsp">Nueva bsqueda</a> </body> </html>
Cdigo 19. Ejemplo de vista JSTL.

<c:forEach var="persona" items="${personas}" varStatus=contador> <tr> <td>${contador.count}</td> <td>${contador.first}</td> <td>${contador.last}</td> </tr> </c:forEach>
Cdigo 20. Empleo del contador de estado varStatus en un bucle forEach.

<c:if test="${sessionScope.validado!=null}"> <h1>Bienvenido, ${sessionScope.nombre}.</h1> <h2>Tu cookie de usuario es: ${cookie.usuario.value}</h2> <h2>Tu informacin del navegador: ${header['User-Agent']}</h2> </c:if>
Cdigo 21. Ejemplo de JSTL manipulando distintos tipos de variables: sesin, cookies y cabeceras HTTP.