Tema2c-JSTL (1) JPA Se Encarga de Mapear Una Clase

Descargar como ppt, pdf o txt
Descargar como ppt, pdf o txt
Está en la página 1de 39

Tema 2c - JavaServer

Pages Standard Tag


Library (JSTL)
Dr. Diego Lz. de Ipia Gz. de Artaza
http://paginaspersonales.deusto.es/dipina
http://paginaspersonales.deusto.es/dipina/cursos/J2EECesine.
zip
[email protected]

JSTL

Objetivo:

Simplificar y agilizar el desarrollo de


aplicaciones web

3ra iteracin despus de servlets y


JSPs
Sirven para la generacin dinmica
de pginas web

Instalar JSTL

Asumimos que ya has instalado Tomcat


5 en tu mquina, si no consguelo de:

http://apache.rediris.es/jakarta/tomcat-5/v5.
5.7/bin/jakarta-tomcat-5.5.7.zip

Bajar JSTL 1.1 de:

http://cvs.apache.org/builds/jakarta-taglibs/
nightly/jakarta-taglibs-20050216.zip

Copiar archivos standard.jar y


jstl.jar a %TOMCAT_HOME
%\common\lib

http://jakarta.apache.org/taglibs/

JSTL 1.0 vs JSTL 1.1

JSTL 1.1 es una pequea mejora de JSTL


1.0 creada para alinear JSTL con JSP 2.0.
Antes haba una versin de cada librera
dependiendo de si utilizabamos
expresiones EL o Java, ahora es la misma
librera.

Ha cambiado el nombre de los identificadores


de las libreras, se ha aadido un elemento
del path /jsp a todos ellos

Usar JSTL en una


aplicacin Web

Para cualquier aplicacin web desde la cual quieres usar JSTL, copiar los ficheros
.tld al directorio WEB-INF de tu aplicacin web.
Edita el web.xml de tu aplicacin web aadiendo las siguientes entradas
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/sql</taglib-uri>
<taglib-location>/WEB-INF/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/x</taglib-uri>
<taglib-location>/WEB-INF/x.tld</taglib-location>
</taglib>

Estas entradas permiten a tu aplicacin web usar las libreras de etiquetas JSTL que
usan el lenguaje de expresiones. La posicin de estas entradas tiene importancia.

Caractersticas

Las pginas JSTL son tambin pginas JSP. JSTL es un


superconjunto de JSP.
JSTL provee un conjunto de cinco libreras estndar:

Core
Internationalization/format
XML
SQL y
Funciones

Adems JSTL define un nuevo lenguaje de expresiones


llamado EL, que ha sido luego adoptado por JSP 2.0
Una etiqueta JSTL corresponde a una accin;
llamndolas accin nos indica que aaden
comportamiento dinmico a una, de otra manera,
pgina esttica.

Soporte para EL I

El lenguaje de expresiones EL
simplemente define un poderoso
mecanismo para expresar expresiones
simples en una sintxis muy sencilla.

Es algo entre JavaScript y Perl.


Su combinacin con las etiquetas de las 4
libreras antes mencionadas proveen mucha
flexibilidad y poder para el desarrollo de
pginas dinmicas.

En EL las expresiones estn delimitadas


por ${ }.

Soporte para EL II

Algunos ejemplos del uso de EL son:

${anExpression}
${aList[4]}
${aList[someVariable]} acceso a un elemento de una coleccin
${anObject.aProperty} acceso a la propiedad de un objeto
${anObject["aPropertyName"]} entrada en un mapa con
propiedad aPropertyName
${anObject[aVariableContainingPropertyName]}

Existen una serie de variables implcitas definidas en EL:

pageContext: el contexto del JSP actual


pageScope, requestScope, sessionScope, and applicationScope:
colecciones de mapas que mapean nombres de variables en esos
contextos a valores
param and paramValues: parmetros pasados con la peticin de la
pgina, lo mismo que en JSP
header and headerValues: cabeceras pasadas en la peticin de la
pgina
cookie: mapa que mapea nombres de cookies a los valores de las
mismas

JSTL Tag Libraries


Librera

URI

Prefijo
Librera

Core

http://java.sun.com/jsp/jstl/core

Internationalizati http://java.sun.com/jsp/jstl/fmt
on I18N
formateo

fmt

SQL/DB support

http://java.sun.com/jsp/jstl/sql

sql

Procesamiento
XML

http://java.sun.com/jsp/jstl/xml

Functions

http://java.sun.com/jsp/jstl/functions

fn

Uso de las libreras JSTL en


un JSP
La siguiente directiva ha de incluirse al
comienzo de la pgina:
<%@ taglib prefix="c"
uri=http://java.sun.com/jsp/jstl/core
%>
Para utilizar una etiqueta de una librera
simplemente se ha de preceder con el
prefijo de la librera utilizada:
<c:out value="${anExpression}"/>

La librera de etiquetas
Core

Permiten llevar a cabo las


siguientes acciones:

Visualizar/asignar valores y manejar


excepciones
Control de flujo
Otras acciones de utilidad

Visualizar/asignar valores y
manejar excepciones con
Core I

Para visualizar valores utilizamos:


<c:out:
value="${applicationScope.product.inventoryCount}"
escapeXml="true" default="0"/> of those items in
stock.

escapeXml indica si hay que aplicar cdigos de escape a los


caracteres <, >, & y .

Asignar una variable en una pgina:


<c:set var="customerID" value="$param.customerNumber"
scope="session" />

scope indica el contexto en el que se define la variable


Tambin podemos asignar el contenido de una etiqueta a una
variable:

<c:set var="cellContents">
<td>
<c:out value="${myCell}"/>
</td>
</c:set>

Visualizar/asignar valores y
manejar excepciones con
Core II

Normalmente en un JSP o incluimos un


bloque try/catch o usamos la directiva
errorPage:
<c:catch>
<!--. . . some set of nested
JSTL tags below which would be
hit on an exception-->
</c:catch>
Para borrar una variable se puede
utilizar <c:remove>

Control de flujo con JSTL


Core I

Para llevar a cabo simples condiciones (c:if):


<c:if test="${status.totalVisits == 1000000}" var="visits">
You are the millionth visitor to our
site!Congratulations!
</c:if>
El switch de un lenguaje de programacin se puede emular con
c:choose:
<c:choose>
<c:when test="${item.type == 'book'}">
...
</c:when>
<c:when test="${item.type == 'electronics'}">
...
</c:when>
<c:when test="${item.type == 'toy'}">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>

Control de flujo con JSTL


Core II

Para iterar sobre una coleccin se define


c:foreach. Se pueden especificar ndice
de comienzo, final e incremento con los
atributos begin, end y step.

<table>
<c:forEach var="name" items="${customerNames}">
<tr><td><c:out value="${name}"/></td></tr>
</c:forEach>
</table>

Control de flujo con JSTL


Core III

Funcionalidad similar a StringTokenizer


puede ser obtenida en JSTL con c:forTokens:

<table>
<c:forTokens
items="47,52,53,55,46,22,16,2"
delims="," var="dailyPrice">
<tr><td><c:out value="$
{dailyPrice}"/></td></tr>
</c:forTokens>
</table>

Listar todos los


parmetros pasados a una
peticin

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


<html>
<body>
<head>
<title>Parameter Listing Example</title>
</head>
<br>

<b>Parameter values passed to this page for each parameter: </b>


<table border="2">
<c:forEach var="current" items="${param}">
<tr>
<td>
<b><c:out value="${current.key}" /></b>
</td>
<c:forEach var="aVal" items="${paramValues[current.key]}">
<td>
<c:out value="${aVal}" />
</td>
</c:forEach>
</tr>
</c:forEach>
</table>
</body>
</html>

Otras acciones
Para codificar URLs se puede utilizar c:url:
<c:url
value="http://acme.com/exec/register"
var="myUrl">
<c:param name="name" value="$
{param.name}"/>
<c:param name="country" value="$
{param.country}"/>
</c:url>
<a href='<c:out value="$
{myUrl}"/>'>Register</a>
Se pueden importar otros JSPs o incluso otros
recursos en una URL arbitraria usando
c:import (anlogo to jsp:include)
Para manejar redireccionamiento se puede
utilizar la etiqueta c:redirect

La Nueva Librera de
Funciones de EL

Cuando EL se migr de la especificacin


JSTL a JSP, se le aado una nueva
funcionalidad: la invocacin a funciones.
Su uso es trivial: nombre-func(listaparams)
<%@ taglib prefix="fn"
uri="http://java.sun.com/jsp/jstl/fun
ctions" %>
${fn:length(myCollection)}

Contiene un grupo de funciones


utilizadas comnmente

Funciones en EL
Funcin

Descripcin

fn:contains(string,
substring)

Devuelve true si el string contiene substring.

fn:containsIgnoreCase
(string, substring)

Devuelve true si el string contiene a substring, ignorando capitalizacin.

fn:endsWith(string,
suffix)

Devuelve true si el string termina con suffix.

fn:escapeXml(string)

Devuelve el string con todos aquellos caracteres con especial significado en XML
y HTML convertidos a sus cdigos de escape pertinentes.

fn:indexOf(string,
substring)

Devuelve la primera ocurrencia de substring en el string.

fn:join(array,
separator)

Devuelve un string compuesto por los elementos del array, separados por
separator.

fn:length(item)

Devuelve el nmero de elementos en item (si un array o coleccin), o el nmero


de caracteres (es un string).

Funciones en EL
Funcin

Descripcin

fn:replace(string, before,
after)

Devuelve un string donde todas las ocurrencias del string before han sido
reemplazadas por el string after.

fn:split(string,
separator)

Devuelve un array donde los elementos son las partes del string
separadas por separator.

fn:startsWith(string,
prefix)

Devuelve true si el string comienza por prefix.

fn:substring(string,
begin, end)

Devuelve la parte del string que comienza por el ndice begin y que acaba
en el ndice end.

fn:substringAfter(string,
substring)

Devuelve la parte del string que sigue a substring.

fn:substringBefore(string,
substring)

Devuelve la parte de string que precede a substring.

fn:toLowerCase(string)

Devuelve un string con todos los caracteres de la entrada convertidos a


minsculas.

fn:toUpperCase(string)

Devuelve un string con todos los caracteres de la entrada convertidos a


maysculas.

fn:trim(string)

Devuelve un string sin espacios en sus laterales.

La librera de etiquetas de
internacionalizacin I

Cubre dos reas:

Etiquetas (acciones) de formateo


Acciones de internacionalizacin

Acciones de formateo:
Inspiradas en el funcionamiento de las clases DateFormat y
NumberFormat

Para formatear un nmero usamos formatNumber con los atributos


number para el nmero y pattern para el patrn de formateo a aplicar.
<fmt:formatNumber value="1000.001" pattern="#,#00.0#"/>

Si queremos parsear un nmero a partir de un string usamos


parseNumber:
<fmt:parseNumber value="${currencyInput}" type="currency"
var="parsedNumber"/>

Para formatear una fecha usamos formatDate y para parsear un string


parseDate:
<jsp:useBean id="now" class="java.util.Date" />
<fmt:formatDate value="${now}" timeStyle="long"
dateStyle="long"/>
<fmt:parseDate value="${dateInput}" pattern="MM dd, YYYY" />

La librera de etiquetas de
internacionalizacin II

Acciones de internacionalizacin:

Una pieza importante de la localizacin en Java es la clase


ResourceBundle. Las acciones JSTL que permiten trabajar
con esta clase son:

fmt:bundle para obtener un ResourceBundle correspondiente


al Locale actual y
fmt:message para hacer lookups en el ResourceBundle

Ejemplo:

<fmt:bundle basename="myBundle">
<%-- Use values in myBundle --%>
<fmt:message key="Introduction">
<fmt:param value="${loginName}"/>
<fmt:param value="${loginCount}"/>
</fmt:message>
<fmt:formatDate value="${now}"
var="parsedDate"/>
</fmt:bundle>

La librera de etiquetas
SQL I

JSTL permite una fcil integracin con bases de datos


No gestiona bien connection pooling, por tanto son solamente adecuadas para
llevar a cabo prototipos o aplicaciones de bajo volumen.
Ejemplo: seleccionar y visualizar un conjunto de elementos
<sql:setDataSource
driver="com.cheapDrivers.jdbcDriver"
url="jdbc:cheapDrivers:."
user="guest"
password="password"
var="dataSource" />
<sql:query var="orderItems" dataSource="${dataSource}">
SELECT * FROM items
WHERE order_id = <cout value="${orderID}"/>
ORDER BY price
</sql:query>
<table>
<c:forEach var="row" items="${orderItems.rows}">
<tr>
<td><c:out value="${row.itemName}"/></td>
<td><c:out value="${row.price}"/></td>
<td><c:out value="${row.weight}"/></td>
</tr>
</c:forEach>
</table>

Creando la BBDD Deusto


CREATE DATABASE deusto;
GRANT ALTER, SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON deusto.*
TO deusto@'%'
IDENTIFIED BY 'deusto';
GRANT ALTER, SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON deusto.*
TO deusto@localhost
IDENTIFIED BY 'deusto';
use deusto;
CREATE TABLE EVENTOS(ID int(11) NOT NULL PRIMARY KEY,
NOMBRE VARCHAR(250), LOCALIZACION VARCHAR(250), FECHA bigint(20), DESCRIPCION
VARCHAR(250));
INSERT INTO EVENTOS VALUES (0, 'SEMANA ESIDE', 'ESIDE-DEUSTO', 0, 'Charla sobre
Python');
INSERT INTO EVENTOS VALUES (1, CURSO J2EE', CESINE', 0, Curso sobre tecnologas
Java 2 Enterprise Edition');

Recuperando Datos de
Tabla Eventos
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<sql:setDataSource
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/deusto"
user="deusto"
password="deusto"
var="dataSource"/>
<sql:query var="eventItems" dataSource="${dataSource}">
select * from eventos
</sql:query>
<table>
<c:forEach var="row" items="${eventItems.rows}">
<tr>
<td><c:out value="${row.ID}"/></td>
<td><c:out value="${row.NOMBRE}"/></td>
<td><c:out value="${row.LOCALIZACION}"/></td>
<td><c:out value="${row.FECHA}"/></td>
<td><c:out value="${row.DESCRIPCION}"/></td>
</tr>
</c:forEach>
</table>

La librera de etiquetas
SQL II

Tambin se soportan acciones para manejar transacciones


(sql:transaction), sql:update soporta no slo updates sino que
tambin insert y delete e incluso create, es decir todas las acciones
SQL que no devuelven un resultado:

<sql:transaction dataSource="${dataSource}">
<sql:update>
UPDATE account
SET account_balance =account_balance -?
WHERE accountNo = ?
<sql:param value="${transferAmount}"/>
<sql:param value="${sourceAccount}"/>
</sql:update>
<sql:update>
UPDATE account
SET account_balance =account_balance +?
WHERE accountNo = ?
<sql:param value="${transferAmount}"/>
<sql:param value="${destAccount}"/>
</sql:update>
</sql:transaction>

Recuperando Datos con


JSTL de MySQL
1.
2.

3.

4.

5.

Instalar MySQL (http://www.mysql.com)


Instalar Connector/J, driver JDBC para MySQL
(http://www.mysql.com/products/connector/j/)
Mover el driver MySQL a
$CATALINA_HOME/common/lib.
Asegurarse que en
$CATALINA_HOME/common/lib estn las libreras
de JSTL standard.jar y jstl.jar, si no bajarlas de:
http://apache.rediris.es/jakarta/taglibs/standard/
binaries/
Crear una tabla de prueba con el siguiente
comando: mysql uroot < createmysqldbtest.sql

Recuperando Datos con


JSTL de MySQL

Contenido de createmysqldbtest.sql:

GRANT ALL PRIVILEGES ON *.* TO javauser@localhost


IDENTIFIED BY 'javadude' WITH GRANT OPTION;
create database javatest;
use javatest;
create table testdata (
id int not null auto_increment primary key,
foo varchar(25),
bar int
);
insert into testdata values(null, 'hello', 12345);

Recuperando Datos con


JSTL de MySQL
Aadir el siguiente prrafo a
$CATALINA_HOME/conf/server.xml:
<Context path="/DBTest" docBase="DBTest"
debug="5" reloadable="true"
crossContext="true">
<Resource name="jdbc/TestDB" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30"
maxWait="10000"
username="javauser" password="javadude"
driverClassName="com.mysql.jdbc.Driver"
5.

url="jdbc:mysql://localhost:3306/javatest?
autoReconnect=true"/>
</Context>

Recuperando Datos con


JSTL de MySQL
Crear un fichero de configuracin para esta aplicacin WEBINF/web.xml:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
6.

Recuperando Datos con


JSTL de MySQL
Crear un fichero test.jsp:
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
7.

<sql:query var="rs" dataSource="jdbc/TestDB">


select id, foo, bar from testdata
</sql:query>
<html>
<head>
<title>DB Test</title>
</head>
<body>
<h2>Results</h2>
<c:forEach var="row" items="${rs.rows}">
Foo ${row.foo}<br/>
Bar ${row.bar}<br/>
</c:forEach>
</body>
</html>

JSTL y Access

Ejecutar ejemplo contenido en standardexamples.war de JSTL:


http://localhost:8080/standardexamples/sql/
Crear base de datos en Access vaca como la
contenida en: sql/jstlsql.mdb

Configurar los detalles de la base de datos con


los siguientes parmetros:

Registrar fuente de datos ODBC: Panel de Control


Herramientas Administrativas Fuentes de Datos
(ODBC) JSTLSQLDB (nombre fuente de datos),
seleccionar el fichero arriba mencionado

Driver sun.jdbc.odbc.JdbcOdbcDriver
Base de datos jdbc:odbc:JSTLSQLDB

Ejecutar los .JSPs

La librera de etiquetas
XML I

El soporte de XML que lleva a cabo JSTL conforma con la especificacin


XPath.
Xpath provee una sintxis clara para acceder a partes jerrquicas de un
documento.
Acciones c:import es utilizada para importar un documento, mientras
x:parse para genera un rbol DOM a partir de l. x:set crea una variable
a partir de un extracto de XML

<!-- Find and parse our XML document (somewhere on the WWW) -->
<c:import url="http://www.cheapstuff.com/orderStatus?id=2435"
var="xml"/>
<x:parse xml="${xml}" var="doc"/>
<!-- access XML data via XPath expressions -->
<x:out select="$doc/name"/>
<x:out select="$doc/shippingAddress"/>
<x:out select="$doc/deliveryDate"/>
<!-- Set a scoped variable -->
<x:set var="custName" scope="request" select="$doc/name"/>

La librera de etiquetas
XML II

JSTL se integra fenomenlmente con XSTL

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
<c:set var="xsltSource">
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="music">
<html>
<head></head>
<body marginheight="0" marginwidth="0" topmargin="0" leftmargin="0">
<table cellpadding="0" cellspacing="0" border="1" bgcolor="#ffffff">
<tr>
<td><STRONG>Artist</STRONG></td>
<td><STRONG>Album</STRONG></td>
<td><STRONG>Year</STRONG></td>
<td><STRONG>Genre</STRONG></td>
</tr>

La librera de etiquetas
XML III
<!---Set up for loop to collect all the artist information //-->
<!-- <xsl:for-each select="./*[name()='artists']"> -->
<xsl:for-each select="artists">
<tr>
<td><xsl:value-of select="artist"/></td>
<td><xsl:value-of select="album"/></td>
<td><xsl:value-of select="year"/></td>
<td><xsl:value-of select="genre"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
</c:set>
<x:transform xslt="${xsltSource}" >
<music>
<artists>
<artist>Jonny B</artist>
<album>Feedback and Distortion</album>
<year>2001</year>
<genre>Rock</genre>
</artists>
<artists>
<artist>Harmony's Nieces</artist>
<album>Sappy Pop Ballads</album>
<year>2002</year>
<genre>Pop</genre>
</artists>
</music>
</x:transform>

La librera de etiquetas
XML IV

Una manera ms sencilla de realizar una


transformacin XSLT sera:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core"


prefix="c"%>
<%@ taglib prefix="x"
uri="http://java.sun.com/jsp/jstl/xml" %>
<c:import var="xmlSource" url=${someDocumentURL}" />
<c:import var="xsltSource" url=$
{anotherDocumentURL}" />
<x:transform xml="${xmlSource}" xslt="${xsltSource}"/>

Ejemplos

Copiar standard-examples.war
contenido en la distribucin
estndar de JSTL 1.1 a
%TOMCAT_HOME%\webapps\
Ejecutar en el navegador:
http://localhost:8080/standar
d-examples/

Recursos
Javadoc de JSTL APIs es disponible
en:
http://www.jcp.org/aboutJava/commun
ityprocess/final/jsr052/

También podría gustarte