JSP

Post on 25-May-2015

1.286 views 2 download

Transcript of JSP

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ági-na JSP se detectan al compilar el servlet (la primera vez que se accede a la URL).

• Salvo que se programe otra cosa, los men-sajes 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 enpá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 deexpresiones 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 accountSET 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)

Servlets

Vista

JSP

Modelo (datos)

Beans

Interfaz capa web - cliente

Capa de negocios

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.