Curso JSP Mas
Curso JSP Mas
Curso JSP Mas
JSP no nos da nada que no pudierámos en principio hacer con un servlet. Pero es
mucho más conveniente escribir (y modificar!) HTML normal que tener que
hacer un billón de sentencias println que generen HTML.
<%--
- Author (s) :
- Date :
- Copyright Notice :
- @(#)
- Description :
--%>
Este comentario sólo es visible en el lado del servidor porque se elimina durante la
traducción JSP. Dentro de este comentario están los autores, la fecha, la nota de
copyright de la revisión, un identificador y una descripción sobre el JSP para los
desarrolladores web.
Una directiva page, defina atributos asociados con la página JSP en tiempo de
traducción. La especificación JSP no impone ninguna obligaciñon sobre cuántas
directivas page se pueden definir en la misma página. Por eso los fragmentos
de código que veremos a continuación son equivalentes:
Esta directiva nos permite incluir ficheros en el momento en que la página JSP es
traducida a un servlet. La directiva se parece a esto:
Una directiva taglib declara las librerías de etiquetas usadas por el JSP. Una
directiva corta se declara en una sola línea. Si tenemos varias directivas taglib
se deben almacenar juntas en la misma localización dentro del cuerpo JSP:
<%@ taglib
uri=”URI1”
prefix=”tagprefix1” %>
Los script son bloques de código Java residentes entre los tags <% %>.
Los elementos de script permiten insertar código Java dentro del método
_jspService() del servlet que se generará desde la página JSP. Hay dos tipos:
Expresiones: <%= expresion %>: Una expresión JSP se usa para insertar
valores directamente en la salida.
Las expresiones no terminan en (;), ya que el motor de JSP pondrá la
expresión automáticamente dentro de out.println().
Scriptles: <% código %>: Los scriptlets JSP permiten insertar código Java
dentro del método _jspService() del servlet que será construido al general la
página.
Los comentarios JSP( tambien conocidos del lado del servidor) sólo son visibles
en el lado del servidor (es decir, no se propagan al lado del cliente ).
Se prefieres los comentarios puros JSP sobre los comentarios JSP con
comentarios de scripts, ya que los primeros son menos dependientes del
lenguaje de script subyacente.
<%!
String ip = null; // IP del cliente
String host = null; // Host del cliente
Enumeration e = null;
String value = null;
String name = null;
%>
<html>
<head>
<body>
<%
ip = request.getRemoteAddr();
host = request.getRemoteHost();
%>
<div><b>Información del cliente</b></div>
<div>ip del cliente : <%= ip %><div>
<div>host del cliente : <%= host %><div>
<hr/>
<div><b>Cabeceras</b><div>
<%
e = request.getHeaderNames();
while (e.hasMoreElements()) {
name = (String)e.nextElement();
value = request.getHeader(name);
out.println("<div>" + name + " = " + value + "</div>");
}
%>
</body>
</html>
Ejercicio 1:
Realizar una gestión de usuarios, de tal forma que podamos listar, añadir
usuarios, modificar usuarios y eliminar usuarios.
pk_id - int
nombre - varchar( 80 )
departamento – varchar( 80 )
email – varchar ( 80 )
Recuerda que, como en XML, los nombre de elementos y atributos son sensibles
a las mayúsculas.
jsp:include
jsp:forward
jsp:useBean
jsp:getProperty
jsp:setProperty
Esta acción nos permite insertar ficheros en una página que está siendo
generada. La síntaxis se parece a esto:
Esta acción nos permite reenviar la petición a otra página. Tiene un sólo atributo,
page, que debería consistir en una URL relativa. Este podría ser un valor
estático, o podría ser calculado en el momento de la petición:
pagina.jsp?login=alumno
Un JavaBean no es más que una clase java que sigue ciertas convenciones con
los nombres de sus métodos
Una clase bean debe contar, al menos, con un constructor sin argumentos.
No debe tener variables de instancia públicas. No debe permitir el acceso
directo a las variables de instancia.
Se accede a los valores de las variable a través de métodos denominados
getXXX y setXXX.
Un método que devuelve un tipo booleano debe denominarse is en lugar de
get.
Cuando se dice que un bean tiene una propiedad “nombre”, realmente se quiere
decir que la clase tiene un método getNombre que devuelve un tipo X, y otro
método llamado setNombre que toma X como argumentod e entrada.
jsp:useBean: Crea un objeto (si no existe ya) de una clase que cumple ser un
JavaBean y le da un nombre. A partir de este momento ese objeto se
utilizará por su nombre
request: Indica que el bean sólo está disponible para la petición actual.
session: Indica que está disponible para todas las páginas durante el
tiempo de vida de la sesión actual.
Ejemplo:
<html><head><title>Ejemplo de Bean</title></head>
<body>
<jsp:useBean id=”discos” class=”DiscosTienda” >
<jspSetroperty name=”disco” property=”id” />
<ul>
<li>
Titulo del disco:
<jsp:getProperty name=”disco” property=”titulo” />
</li>
</ul>
</body></html>
Fichero StringBean.java
package business.vo;
Fichero StringBean.jsp
<htmlL>
<head><title>Uso de JavaBeans con JSP</title></head>
<body>
<div>Uso de JavaBeans con JSP</div>
<jsp:useBean id="stringBean" class="business.vo.StringBean" />
<ul>
<li>Valor inicial (getProperty):
<jsp:getProperty name="stringBean" property="mensaje" />
</li>
<li>
<jsp:setProperty name="stringBean" property="mensaje"
value="Texto" />
Valor después de haber cambiado el campo con setProperty:
<jsp:getProperty name="stringBean" property="mensaje" />
</Ii>
</ul>
</body>
</html>
Ejercicio 1:
Tendremos que realizar una página JSP que nos muestre un formulario con
los datos personales de un usuario.
Una vez que rellenemos dicho formulario, mostraremos utilizando beans los
datos de ese usuario por pantalla.
Ejercicio 2:
Modificar la aplicación anterior, de tal forma que vamos a tener una página de
inicio que lo único que hará será redirigirnos a otra págia principal utilizando
la acción apropiada.
Esa página principal estaá formada por cuatro páginas incluidas mediante otra
acción.
Como se verá a lo largo de nuestro estudio, JSTL utiliza ciertas convenciones que
hacen más fácil al desarrollador el recordar la estructura interna de las etiquetas.
El código de Java dentro de scriptlets JSP no pueden ser reutilizados por otros
JSP, por lo tanto la lógica común termina siendo re-implementado en múltiples
páginas.
Debido a que las etiquetas JSTL son XML, estas etiquetas se integran limpia y
uniformemente a las etiquetas HTML.
Las etiquetas JSTL pueden referenciar objetos que se encuentren en los ambientes
Request y Session sin conocer el tipo del objeto y sin necesidad de hacer el
Casting.
Los JSP EL (Expression Language) facilitan las llamadas a los métodos Get y Set en
los objetos Java. Esto no es posible en la versión JSP 1.2, pero ahora está
disponible en JSP 2.0. EL es usado extensamente en la librería JSTL.
Los JSTL pueden agregar mayor sobrecarga en el servidor. Los scriptlets y las
librerías de etiquetas son compilados a servlets, los cuales luego son ejecutados
por el contenedor. El código Java embebido en los scriptlets es básicamente
copiado en el servlet resultante. En cambio, las etiquetas JSTL, causan un poco
más de código en el servlet. En la mayoría de casos esta cantidad no es
mensurable pero debe ser considerado.
Los scriptlets son más potentes que las etiquetas JSTL. Si desea hacer todo en un
script JSP pues es muy probable que insertará todo el código en Java en él. A
pesar que las etiquetas JSTL proporciona un potente conjunto de librerías
reutilizables, no puede hacer todo lo que el código Java puede hacer. La librería
JSTL está diseñada para facilitar la codificación en el lado de presentación que es
típicamente encontrado en la capa de Vista si hablamos de la arquitectura Modelo-
Vista-Controlador.
Antes de JSTL, JSP usaba Java para referenciar atributos dinámicos. Con JSTL ya
no es necesario. Compara por ejemplo, la lectura de un parametro:
con JSP
<%= request.getParameter("login") %>
con JSTL
${param.login}.
Una expresión EL se escribe de la forma ${expresion} y entre las llaves puede usarse
cualquier operador binario o unario que se quiera, ya sea matemático, de cadena,
relacional o lógico. Es muy útil el operador unario empty para saber si algo es null
o no.
Literales. Son números, cadenas delimitadas por comillas simples o dobles, y los
valores true, false, y null.
Podemos usar expresiones en cualquier parte del documento, o como valores de los
atributos de etiquetas JSTL, exceptuando los atributos var y scope, que no aceptan
expresiones.
En cualquier sitio donde sea valido colocar una expresión, también será válido
colocar más de una. Por ejemplo: value="Hola ${nombre} ${apellidos}".
${bean.propiedad}
${map.elemento}
${header['User-Agent']}
${bean1.bean2.propiedad}
Las expresiones pueden aparecer como parte del valor de un atributo de una
etiqueta:
<c:out value="${nombre}"/>
<c:if test="${tabla.indice % 2 == 0}">es par</c:if>
Ejemplo:
<c:out> utilizada con el mismo objetivo que el scriptlet <%= expresion %> tiene
algunas funcionalidades adicionales
<c:set> permite asignar valores a variables (p.ej., de sesión) o a propiedades de
Java Beans
<c:remove> es el complemento natural al anterior, y sirve para destruir variables
con ámbito
<c:catch> permite recuperar un error, y supone el complemento perfecto para la
página de error JSP
<c:if> emite por la salida el cuerpo que contiene sólo si la condición a que se
refiere es cierta
<c:choose>, <c:when> y <c:otherwise> permiten formar una estructura de ifs en
cascada con parte else
<c:forEach> permite recorrer una colección o un array, así como ejecutarse como
un bucle FOR
<c:forTokens> divide una cadena en trozos y se ejecuta para cada trozo
Emite por la salida el valor del atributo value. Si este es nulo, se saca por pantalla el
valor del atributo default.
Por defecto escapeXml está puesto a true, lo que quiere decir que se traducen
algunos caracteres para evitar errores:
package business.vo;
import java.io.*;
public class StringBean {
Y el JSP sería:
<c:out value="${stringBean.lector}"/><br>
<c:set value=”valor”
var=”nombreVar”
[scope=”page|request|session|application”] />
<c:remove> sólo tiene sentido para variables con ámbito. La sintaxis de <c:remove>
es:
<c:if test=”condicion”
[var=”nombreVar”
[scope=”page|request|session|application”]] >
// Acciones que se ejecutan si la condicion se cumple
</c:if>
Como puede verse, esta etiqueta carece de cláusula else. El motivo es que la
cláusula else, utilizada a discreción, se convierte en unos ifs en cascada
mutuamente excluyentes; y para eso, la biblioteca core suministra otras etiquetas
Ej. de control:
Puede probarse a cargar una página que contenga esto pasando o no pasando en
la dirección URL el parámetro nombre.
<c:choose>
<c:when test=”condicion1”>
// Cuerpo que se emite si condicion1 es cierta
</c:when>
<c:when test=”condicion2”>
// Cuerpo que se emite si condicion2 es cierta
// y condicion1 es falsa
</c:when>
....
<c:otherwise>
// Cuerpo que se emite si ninguna de las
// condiciones anteriores es cierta
</c:otherwise>
</c:choose>
<c:forEach [var=”nombreVar”]
items=”coleccion”
[varStatus=”nombreVarEstado”]
[begin=”comienzo”]
[end=”final”]
[step=”paso”] >
// Cuerpo a repetir
</c:forEach>
<c:forEach [var=”nombreVar”]
[varStatus=”nombreVarEstado”]
begin=”comienzo”
end=”final”
[step=”paso”] >
// Cuerpo a repetir
</c:forEach>
Si el recorrido de una colección hace uso de begin y demás, quiere decir que se comienza en el
ítem de la colección situado en posición comienzo. Si hay menos ítems que comienzo,
entonces el bucle ni se ejecuta. El primer elemento de la colección está en la posición 0.
El <c:forEach> se usa para recorrer una colección de forma que cada elemento visitado es
apuntado por nombreVar
Si la colección es un mapa, lo que se recorren son las entradas, que son del tipo Map.Entry.
Como colección también puede indicarse un array tradicional e incluso un String. En este último
caso, se supone que el String posee palabras separadas por comas, y el <c:forEach> se
ejecuta para cada una de tales palabras. La coma hace las veces de carácter delimitador.
3. Del directorio temporal, copie todos los archivos s tandard.jar y jstl.jar que
se encuentran en jakarta-taglibs-standard-1.1.2/lib al directorio /WEB-INF/lib de su
aplicación Web.También copiaremos el contenido de la carpeta jakarta-taglibs-
standard-1.1.2/conf a un /WEB-INF/conf.
<taglib>
<taglib-uri>/WEB-INF/c</taglib-uri>
<taglib-location>/WEB-INF/conf/c.tld</taglib-location>
</taglib>
5.Ahora, creamos una página JSP y probamos algunas etiquetas simples para
asegurarnos que la configuración del JSTL está bien hecha.
<div>Cabecera: </div>
<ul>
<c:forEach var="elemento" items="${header}">
<li><strong>${elemento.key}:</strong> ${elemento.value}</li>
</c:forEach>
</ul>
<hr/>
<ul>
<c:forEach var="unaCookie" items="${cookie}">
<li><strong>${unaCookie.key}:</strong> ${unaCookie.value}</li>
</c:forEach>
<ul/>
</body></html>
Ejercicio 1: