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.