Download Java Server Pages (JSP)
Document related concepts
no text concepts found
Transcript
Java Servlet Pages JSP, I • Código HTML con código Java embebido y otras extensiones de HTML específicas de JSP. • Ejemplo: <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@taglib prefix=“c” uri=“http://java....”%> <html> <head> <title> JSP </title> </head> <body> <h1> Hola, <%= request.getRemoteAddr() %> </h1> </body> </html> JSP, II • Se guardan en el directorio raíz (público) • URL estándar: ….jsp (web.xml) • Se compilan la primera vez que se usan, generando código de un servlet. • Al acceder a su URL, un servlet genérico busca la subclase de HttpServlet correspondiente a la página y la carga, compilándola previamente si hace falta. JSP, III • El código Java embebido corresponde a un método del servlet generado • Los errores en el código java de una página JSP se detectan al compilar el servlet (la primera vez que se accede a la URL). • Salvo que se programe otra cosa, los mensajes de error aparecen en el navegador. • Se pueden especificar en web.xml páginas de error a mostrar para errores específicos. Tipo de cláusulas de JSP • <%@ … %>: Directivas (se ejecutan al compilar la página JSP) • <%-- … %>: Comentarios • <%! … %>: Declaraciones de atributos y métodos Java. Se definen en la clase asociada. Tipo de cláusulas de JSP, II • <%= … %>: Inclusión de datos generados dinámicamente (expresiones; equivale a <% out.println(…) %>) • <% … %>: Scriplets (código a ejecutar) • Etiquetas JSP (ejemplo: <c:import url=www.ii.uam.es/>) • Expresiones UEL (ejemplo: ${x+y}) Tipos de directivas • • • • <%@ page contentType="text/html" %> <%@ page pageEncoding="UTF-8" %> <%@ page import="java.util.*", ... %> <%@ page errorPage="file_name" %> • <%@ include file="hello.jsp" %> Mejor utilizar la etiqueta c:import Objetos predefinidos en páginas JSP (variables Java) • request • response • pageContext (es un contexto específico para páginas JSP) • session • application • out • config (contexto del servlet) Importancia de la indentación <...> <% if (hello) { %> <P>Hello, world <% } else { %> <P>Goodbye, world <% } %> <...> Ejercicios • [SFJ1]: Escribir aplicaciones web con páginas JSP que se comportan como las de los ejercicios [SERV1], [SERV2] y [SERVCONT1]. • [OPJ] (opcional): Escribir una aplicación web formada por una página JSP que defina una calculadora con dos memorias numéricas. Lenguaje de expresiones (UEL) • Es un lenguaje de script interpretado que integra el acceso a la información disponible en la página JSP • Es una alternativa simplificada a la evaluación de expresiones Java • Las expresiones UEL pueden aparecer como atributos de expresiones JSP (HTML, etiquetas) o como texto estático que forma parte del contenido de la página Lenguaje de expresiones, II • Ejemplo: <img src=“${aplUrl+img1}”> ${title1} • Las expresiones UEL se evalúan por un contenedor web en una máquina virtual Java. • Los valores de las expresiones UEL son referencias a objetos Java que pueden ser JavaBeans, colecciones, enumeraciones o determinados objetos especiales (objetos implícitos) u objetos simples (números, Strings). • Los resultados de la evaluación de las expresiones UEL se traducen al tipo apropiado (String en los dos ejemplos anteriores) Lenguaje de expresiones, III • Se pueden definir variables UEL mediante la etiqueta c:set: • Ejemplo: <c:set var=“x” scope=“session” value=“2”/> • La evaluación de expresiones incluye un proceso de resolución (búsqueda) del tipo adecuado de objetos referidos. • Para evaluar una expresión compuesta del tipo ${xx.yy} primero se evalúa la expresión simple asociada ${xx}. UEL: Evaluación de expresiones simples • Prioridades en la resolución de expresiones simples: – Variables UEL – Objetos implícitos (ver próxima transparencia) – Atributos del ámbito de la página – Atributos del ámbito de la petición – Atributos del ámbito de la sesión – Atributos del ámbito de la aplicación – Null UEL: Objetos implícitos • • • • • pageContext initParam[“name”] param[“name”] paramValues[“name”] header[“name”] • • • • • • headerValues[“name”] cookie[“name”] pageScope requestScope sessionScope applicationScope UEL: Evaluación de expresiones simples, II • • • • Ejemplos: ${session} se refiere en general a pageContext.getAttribute(“session”) ${request} se refiere en general a pageContext.getAttribute(“request”) ${response} se refiere en general a pageContext.getAttribute(“response”) ${userId} puede referirse a session.getAttribute(“userId”) UEL: Evaluación de expresiones compuestas • La expresión ${obj.atr} equivale a ${obj[“atr”]}. • Resolución de expresiones compuestas de la forma ${obj.atr}: – Si ${obj} es un contexto: obj.getAttribute(“atr”) – Si ${obj} es un JavaBean: obj.getAtr() • Mecanismo de resolución en la evaluación de expresiones UEL: Resolvers y reflexión. • La resolución de expresiones se efectúa solamente la primera vez que se evalúan. Expresiones UEL: Tipos de evaluación • La evaluación de expresiones UEL puede ser inmediata (${ … }) o diferida (#{ … }). • La evaluación diferida se aplica en casos especiales: – Asignación de valores a variables: <c:set var=“#{userId}” value=“cacatua”> – Asignación de atributos a componentes gráficas (JSF) – Valores relacionados con bases de datos Ejercicio • [ACC1] Obligatorio: Aplicación web con una página JSP que muestra una lista HTML con las horas de acceso dentro de la misma sesión, y un botón “Acceder otra vez”. Depuración • El carácter dinámico de las páginas JSP y el hecho de que generen un servlet que se compila tras el despliegue de la aplicación dificultan su depuración. • Se puede compilar directamente una página JSP para generar el servlet correspondiente • Se puede ver el código Java del servlet (durante la ejecución de la aplicación). Depuración, II • Se pueden poner puntos de parada en la página JSP (no en el código del servlet). • Se puede hacer una llamada a una página JSP determinada o a un servlet con los parámetros deseados. Depuración, III • Se puede monitorizar la cadena de peticiones http realizadas dentro de una aplicación mediante el Http Monitor, y explorar su estado en cada paso. • Se puede revisar el log (registro de eventos) del servidor para ver detalles acerca de los errores y de la ejecución de la aplicación. Biblioteca de etiquetas: JSTL • Sintaxis tipo XML • Se traducen en invocaciones a código Java • Ejemplo: <jsp:useBean id="help“ scope="request" class="ConverterBean" /> // scope: request | session | application // Proporciona acceso a variable en Java • Se necesita una directiva para hacerlas accesibles: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> JSTL: Ejemplos • El ejemplo de la transparencia anterior, <jsp:useBean id="help“ scope="request" class="ConverterBean" /> se traduce a <% request.setAttribute(“help”, new ConverterBean() %> salvo optimizaciones. JSTL: Ejemplos, II • <jsp:setProperty name="limite" property="valor" value="10" /> se traduce a <% limite.setValor(10); %> • <c:import url="next.jsp" /> se traduce a <% response.sendRedirect(“next.jsp”); %> Etiquetas estándar JSP • Tipos: core (c), XML (x), bases de datos (sql), internacionalización (fmt), funciones (fn) • Hay que incluir una directiva por cada tipo que se utilice. • Información asociada: Variables UEL, guardadas en atributos (principal: var=”…”) – Ejemplo: <c:forEach var="item“ items="${sessionScope.cart.items}"> … </c:forEach> Etiquetas estándar JSP: Core • Variables: – <c:set var="bookId" value="${book.id}"/> – <c:remove var=“bookId”/> Atributo opcional en ambos casos: scope • Control de flujo: – <c:forEach var=“book” items=“${booksList}”> <tr><td>${book.title}</td></tr> <c:set var=“total” value=“${total+book.price}”/> </c:forEach> Etiquetas estándar JSP: Core, II • Control de flujo, II: – <c:if test=“${price<=total}”> <h1>Pedido:</h1> ${price} <c:set var=“priceOK” value=“true”/> </c:if> – <c:forTokens var=“token” items=“lunes, martes, miercoles”> <tr><td>token</td></tr> </c:forTokens> Etiquetas estándar JSP: Core, III • Control de flujo, III: – <c:choose> <c:when test=“${valor1<valor2}”> ${valor1} </c:when> <c:otherwise> ${valor2} </c:choose> Etiquetas estándar JSP: Core, IV • URL: – <c:import url="/books.xml" var=“bks" /> – <c:redirect url=“/books.xml”/> Otras etiquetas estándar JSP • XML: – Core – Control de flujo – Transformación Ejemplo: x:parse • Internacionalización: – Locale – Mensajes – Formato de números y fechas Etiquetas estándar JSP: Bases de datos <sql:setDataSource var="data“ driver=“com.mysql.jdbc.Driver“ url="jdbc:mysql://localhost/db?user=root“ scope=“application”/> • En la práctica el driver y la url deberían ser parámetros de la aplicación, especificados en web.xml Etiquetas estándar JSP: Bases de datos, II <sql:query var="books“ dataSource="${data}"> SELECT * from public.books WHERE id = ? <sql:param value="${bookId}" /> </sql:query> Etiquetas estándar JSP: Bases de datos, III <table> <c:forEach var=“book“ items="${books.rows}"> <tr> <td><c:out value="${book.author}" /></td> <td><c:out value="${book.title}" /></td> </tr> </c:forEach> </table> Etiquetas estándar JSP: Bases de datos, IV <sql:transaction dataSource="${dataSource}"> <sql:update> UPDATE account SET Balance = Balance - ? WHERE accountNo = ? <sql:param value="${transferAmount}"/> <sql:param value="${accountFrom}"/> </sql:update> </sql:transaction> Etiquetas estándar JSP: Funciones • Pueden aparecer en expresiones EL • Colecciones: – fn:length • Cadenas de caracteres: – fn:toUpperCase – fn:toLowerCase –… Documentación JSTL Ejercicio obligatorio • [PyCE1]: Aplicación web que permite acceder a cuatro páginas: – La primera muestra en una tabla de veinte en veinte los nombres de personas y sus correos electrónicos, contenidos en un fichero fijo. También permite borrar los datos de personas seleccionadas de la tabla. El fichero contendrá en cada línea el nombre y la dirección de correo de una persona, separados por una coma. Ejercicio obligatorio, II – La segunda página, a la que se accede tras seleccionar una fila de la tabla anterior y pulsar sobre el botón “Modificar”, permite modificar los datos de la persona previamente seleccionada. – La tercera página, a la que se accede tras pulsar sobre el botón “Nuevo”, permite añadir una persona nueva al fichero. – A la cuarta página se accede tras pulsar sobre el botón “Buscar”, y permite buscar el correo electrónico correspondiente a una persona y modificarlo. Ejercicio optativo • [FAV] Optativo: Aplicación web que permite mostrar páginas web arbitrarias y gestionar una lista de URLs correspondientes a las páginas que se desee entre las anteriores (favoritos). La lista de URLs favoritas se guardará en un fichero fijo. Arquitectura Modelo Vista Controlador (MVC) Controlador (eventos) Interfaz capa web - cliente Servlets Capa de negocios Modelo (datos) Beans Vista JSP Recursos, servicios, etc Ejercicios • [PyCE2] Obligatorio: Aplicación web (servlets y páginas jsp) que utiliza la arquitectura MVC para resolver el ejercicio PyCE1 anterior. • [UTIL] Voluntario: Extraer de los ejercicios anteriores clases y diseños útiles para otras aplicaciones.