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=&quot;text/html&quot;%> <%@page pageEncoding=&quot;UTF-8&quot;%> <%@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=&quot; text/html &quot; %> <%@ page pageEncoding=&quot; UTF-8 &quot; %> <%@ page import=&quot; java.util.* &quot;, ... %> <%@ page errorPage=&quot; file_name &quot; %> <%@ include file=&quot; hello.jsp &quot; %> 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=&quot;help“ scope=&quot;request&quot;  class=&quot;ConverterBean&quot; /> // scope: request | session | application // Proporciona acceso a variable en Java Se necesita una directiva para hacerlas accesibles: <%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot;  prefix=&quot;c&quot; %>
JSTL: Ejemplos El ejemplo de la transparencia anterior, < jsp:useBean  id=&quot;help“ scope=&quot;request&quot;  class=&quot;ConverterBean&quot; /> se traduce a <% request.setAttribute(“help”, new ConverterBean() %> salvo optimizaciones.
JSTL: Ejemplos, II < jsp:setProperty  name=&quot;limite&quot;  property=&quot;valor&quot; value=&quot;10&quot; /> se traduce a <% limite.setValor(10); %> <c:import  url=&quot;next.jsp&quot; /> 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= &quot;item“ items= &quot;${sessionScope.cart.items}&quot;> … </c:forEach>
Etiquetas estándar JSP: Core Variables: < c:set  var=&quot;bookId&quot; value=&quot;${book.id}&quot;/> < 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=&quot;/books.xml&quot; var=“bks&quot; /> < 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=&quot;data“ driver=“com.mysql.jdbc.Driver“ url=&quot;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=&quot;books“ dataSource=&quot;${data}&quot;> SELECT * from public.books WHERE id = ? < sql:param  value=&quot;${bookId}&quot; /> </sql:query>
Etiquetas estándar JSP: Bases de datos, III <table> <c:forEach var=“book“ items=&quot;${books.rows}&quot;> <tr> <td>< c:out  value=&quot;${book.author}&quot; /></td> <td><c:out value=&quot;${book.title}&quot; /></td> </tr> </c:forEach> </table>
Etiquetas estándar JSP: Bases de datos, IV < sql:transaction  dataSource=&quot;${dataSource}&quot;> < sql:update > UPDATE account SET Balance = Balance - ? WHERE accountNo = ? <sql:param value=&quot;${transferAmount}&quot;/> <sql:param value=&quot;${accountFrom}&quot;/> </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) Interfaz capa web - cliente Capa de negocios Recursos, servicios, etc Controlador (eventos) Servlets Vista JSP Modelo (datos) Beans
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.

JSP

  • 1.
  • 2.
    JSP, I CódigoHTML con código Java embebido y otras extensiones de HTML específicas de JSP. Ejemplo: <%@page contentType=&quot;text/html&quot;%> <%@page pageEncoding=&quot;UTF-8&quot;%> <%@taglib prefix=“c” uri=“http://java....”%> <html> <head> <title> JSP </title> </head> <body> <h1> Hola, <%= request.getRemoteAddr() %> </h1> </body> </html>
  • 3.
    JSP, II Seguardan 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.
  • 4.
    JSP, III Elcó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.
  • 5.
    Tipo de cláusulasde JSP <%@ … %>: Directivas (se ejecutan al compilar la página JSP) <%-- … %>: Comentarios <%! … %>: Declaraciones de atributos y métodos Java. Se definen en la clase asociada.
  • 6.
    Tipo de cláusulasde 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})
  • 7.
    Tipos de directivas<%@ page contentType=&quot; text/html &quot; %> <%@ page pageEncoding=&quot; UTF-8 &quot; %> <%@ page import=&quot; java.util.* &quot;, ... %> <%@ page errorPage=&quot; file_name &quot; %> <%@ include file=&quot; hello.jsp &quot; %> Mejor utilizar la etiqueta c:import
  • 8.
    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)
  • 9.
    Importancia de laindentación <...> <% if (hello) { %> <P>Hello, world <% } else { %> <P>Goodbye, world <% } %> <...>
  • 10.
    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.
  • 11.
    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
  • 12.
    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)
  • 13.
    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}.
  • 14.
    UEL: Evaluación deexpresiones 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
  • 15.
    UEL: Objetos implícitospageContext initParam[“name”] param[“name”] paramValues[“name”] header[“name”] headerValues[“name”] cookie[“name”] pageScope requestScope sessionScope applicationScope
  • 16.
    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”)
  • 17.
    UEL: Evaluación deexpresiones 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.
  • 18.
    Expresiones UEL: Tiposde 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
  • 19.
    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”.
  • 20.
    Depuración El carácterdiná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).
  • 21.
    Depuración, II Sepueden 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.
  • 22.
    Depuración, III Sepuede 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.
  • 23.
    Biblioteca de etiquetas:JSTL Sintaxis tipo XML Se traducen en invocaciones a código Java Ejemplo: < jsp:useBean id=&quot;help“ scope=&quot;request&quot; class=&quot;ConverterBean&quot; /> // scope: request | session | application // Proporciona acceso a variable en Java Se necesita una directiva para hacerlas accesibles: <%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %>
  • 24.
    JSTL: Ejemplos Elejemplo de la transparencia anterior, < jsp:useBean id=&quot;help“ scope=&quot;request&quot; class=&quot;ConverterBean&quot; /> se traduce a <% request.setAttribute(“help”, new ConverterBean() %> salvo optimizaciones.
  • 25.
    JSTL: Ejemplos, II< jsp:setProperty name=&quot;limite&quot; property=&quot;valor&quot; value=&quot;10&quot; /> se traduce a <% limite.setValor(10); %> <c:import url=&quot;next.jsp&quot; /> se traduce a <% response.sendRedirect(“next.jsp”); %>
  • 26.
    Etiquetas estándar JSPTipos: 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= &quot;item“ items= &quot;${sessionScope.cart.items}&quot;> … </c:forEach>
  • 27.
    Etiquetas estándar JSP:Core Variables: < c:set var=&quot;bookId&quot; value=&quot;${book.id}&quot;/> < 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>
  • 28.
    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>
  • 29.
    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>
  • 30.
    Etiquetas estándar JSP:Core, IV URL: < c:import url=&quot;/books.xml&quot; var=“bks&quot; /> < c:redirect url=“/books.xml”/>
  • 31.
    Otras etiquetas estándarJSP XML: Core Control de flujo Transformación Ejemplo: x:parse Internacionalización: Locale Mensajes Formato de números y fechas
  • 32.
    Etiquetas estándar JSP:Bases de datos < sql:setDataSource var=&quot;data“ driver=“com.mysql.jdbc.Driver“ url=&quot;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
  • 33.
    Etiquetas estándar JSP:Bases de datos, II < sql:query var=&quot;books“ dataSource=&quot;${data}&quot;> SELECT * from public.books WHERE id = ? < sql:param value=&quot;${bookId}&quot; /> </sql:query>
  • 34.
    Etiquetas estándar JSP:Bases de datos, III <table> <c:forEach var=“book“ items=&quot;${books.rows}&quot;> <tr> <td>< c:out value=&quot;${book.author}&quot; /></td> <td><c:out value=&quot;${book.title}&quot; /></td> </tr> </c:forEach> </table>
  • 35.
    Etiquetas estándar JSP:Bases de datos, IV < sql:transaction dataSource=&quot;${dataSource}&quot;> < sql:update > UPDATE account SET Balance = Balance - ? WHERE accountNo = ? <sql:param value=&quot;${transferAmount}&quot;/> <sql:param value=&quot;${accountFrom}&quot;/> </sql:update> </sql:transaction>
  • 36.
    Etiquetas estándar JSP:Funciones Pueden aparecer en expresiones EL Colecciones: fn:length Cadenas de caracteres: fn:toUpperCase fn:toLowerCase …
  • 37.
  • 38.
    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.
  • 39.
    Ejercicio obligatorio, IILa 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.
  • 40.
    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.
  • 41.
    Arquitectura Modelo VistaControlador (MVC) Interfaz capa web - cliente Capa de negocios Recursos, servicios, etc Controlador (eventos) Servlets Vista JSP Modelo (datos) Beans
  • 42.
    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.