Java Server
Pages (JSP)
1
Contenido
1.
Primer vistazo a la tecnologa JSP
Qu es y para qu sirve JSP
Primer ejemplo Hola Mundo y la fecha
Uso de objetos implcitos y ejemplo
-> Ejercicio: instalacin y ejecucin de la primera aplicacin
web con tecnologa JSP
1.
Elementos bsicos de una pgina JSP
Directivas <%@ (page | include | taglib)
Cdigo Java <% (declaraciones | java | expresiones)
-> Ejercicios de manejo de ejemplos simples
Acciones estndar <jsp:accin (include |forward |
usebean| getproperty | setproperty)
-> Ejercicios de manejo de JavaBeans
1.
Elementos Avanzados de una pgina JSP
Acciones personalizadas (etiquetas)
Definicin de la estructura (biblioteca.tld y sta en web.xml)
Nombre, clase controladora, atributos, cuerpo, etc.
Definicin de la funcionalidad (JavaBean que deriva de taglib)
Declaracin en pgina con <%@taglib y uso posterior
-> Ejercicios de manejo de Etiquetas personalizadas
Introduccin a JSP
JSP es una especificacin de Sun Microsystems
Sirve para crear y gestionar pginas web
dinmicas
Permite mezclar en una pgina cdigo HTML para
generar la parte esttica, con contenido dinmico
generado a partir de marcas especiales <% .... %>
El contenido dinmico se obtiene, en esencia,
gracias a la posibilidad de incrustar dentro de la
pgina cdigo Java de diferentes formas Hay 3
formas de aadir contenido dinmico
Su objetivo final es separar la interfaz (presentacin
visual) de la implementacin (lgica de ejecucin)
Introduccin a JSP
Pgina JSP Servlet
La pgina JSP se convierte en un servlet
La conversin la realiza en la mquina
servidora el motor o contenedor JSP, la
primera vez que se solicita la pgina JSP
Este servlet generado procesa cualquier
peticin para esa pgina JSP
Si se modifica el cdigo de la pgina JSP,
entonces se regenera y recompila
Traduce
Compila
automticamente
el
servlet
y se
recarga la
Fichero.jsp
ServletJsp.java
ServletJsp.class
Motor
Compila
prxima vez
que
sea
solicitada
JSP
dor java
Funcionamiento
Peticin
fichero.jsp
Cliente
Servidor
Web
Respuesta
peticin
respuesta
Extensiones
del servidor
1 vez
Motor
JSP
1 vez
Analizador
JSP
Fichero.JSP
respuesta
Motor
Servlet
respuesta
peticin
1 vez
Compilador
Java
ServletJSP.java
Cargador
Clases
ServletJSP.class
Primer ejemplo de JSP
Ejemplo de pgina que dice Hola y escribe la fecha
actual (fichero ej1_hola.jsp)
<%@ page info="Un Hola Mundo import="java.util.Date" %>
<HTML>
<head> <title> Hola, Mundo </title> </head>
<body> <h1> Hola, Mundo! </h1>
La fecha de hoy es:
<%= new Date().toString() %>
</body>
</HTML>
En esta pgina se mezcla cdigo HTML con cdigo Java
incrustado con unas marcas especiales
En este caso es una expresin, que se sustituye en la pgina por
el resultado de evaluarla
En otros casos es un trozo de cdigo Java que simplemente se
ejecuta
Ciclo de vida del servlet
generado
Cuando se llama por primera vez al fichero JSP, se
genera un servlet con las siguientes operaciones
jspInit()
Inicializa el servlet generado
Slo se llama en la primera peticin
jspService(peticin,respuesta)
Maneja las peticiones. Se invoca en cada
peticin, incluso en la primera
jspDestroy()
Invocada por el motor para eliminar el servlet
Servlet generado por un
JSP
En el mtodo _jspService se introduce
automticamente el contenido dinmico de la
pgina JSP.
El cdigo html se transforma en una llamada al
objeto out donde se vuelca el contenido En el
ejemplo:
out.write("\r\n\r\n<HTML>\r\n<head> <title> Hola,
Mundo </title> </head>\r\n\r\n<body> <h1> Hola,
Mundo! </h1> \r\nLa fecha de hoy es: ");
El cdigo dinmico se traduce en funcin del
contenido
Ej: El cdigo jsp <%= new Date().toString() %> se
traduce por out.print( new Date().toString() );
Servlet generado por un
JSP
En la primera invocacin de esta pgina se genera
automticamente el siguiente servlet:
public class ej1_0005fhola$jsp extends HttpJspBase {
.....
public final void _jspx_init() throws JasperException {
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
....
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
String _value = null;
...
Servlet generado por un
JSP
try {
if (_jspx_inited == false) {
_jspx_init();
_jspx_inited = true;
}
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/HTML;charset=ISO-8859-1");
pageContext =
_jspxFactory.getPageContext(this, request, response,"",
true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
Servlet generado por un
JSP
// HTML
// begin [file="C:\\web\\jakartatomcat3.2.2\\webapps\\marian\\hola.jsp";from=(0,40);to=(6
,20)]
out.write("\r\n\r\n<HTML>\r\n<head> <title> Hola, Mundo
</title> </head>\r\n\r\n<body> <h1> Hola, Mundo!
</h1> \r\nLa fecha de hoy es: ");
// end
// begin [file="C:\\web\\jakartatomcat3.2.2\\webapps\\marian\\hola.jsp";from=(6,23);to=(6
,46)]
out.print( new Date().toString() );
// end
// HTML // begin [file="C:\\web\\jakartatomcat3.2.2\\webapps\\marian\\hola.jsp";from=(6,48);to=(1
1,0)]
out.write("\r\n\r\n</body>\r\n</HTML>\r\n\r\n");
// end
Objetos implcitos
JSP utiliza los objetos implcitos, basados en la API
de servlets.
Estos objetos estn disponibles para su uso en
pginas JSP y son los siguientes:
Objeto request
Representa la peticin lanzada en la invocacin
de service(). Proporciona entre otras cosas los
parmetros recibidos del cliente, el tipo de
peticin (GET/POST)
Objeto response
Instancia de HttpServletResponse que
representa la respuesta del servidor a la
peticin. mbito de pgina
Objetos implcitos
out: Es el PrintWriter usado para enviar la salida al
cliente. Es una versin con buffer de PrintWriter
llamada JspWriter. Podemos ajustar el tamao del
buffer, o incluso desactivar el buffer, usando el atributo
buffer de la directiva page. Se usa casi exclusivamente
en scriptlets ya que las expresiones JSP obtienen un
lugar en el stream de salida, y por eso raramente se
refieren explcitamente a out.
session: Este es el objeto HttpSession asociado con la
peticin. Las sesiones se crean automticamente, salvo
que se use el atributo session de la directiva page para
desactivar las sesiones, en cuyo caso los intentos de
referenciar la variable session causarn un error en el
momento de traducir la pgina JSP a un servlet.
Objetos implcitos
application: El ServletContext obtenido mediante
getServletConfig().getContext().
config: El objeto ServletConfig.
pageContext: JSP presenta una nueva clase llamada
PageContext para encapsular caractersticas de uso
especficas del servidor como JspWriters de alto
rendimiento. La idea es que, si tenemos acceso a ellas a
travs de esta clase en vez directamente, nuestro
cdigo seguir funcionando en motores servlet/JSP
"normales".
page: Esto es slo un sinnimo de this, y no es muy til
en Java. Fue creado como situacin para el da que el
los lenguajes de script puedan incluir otros lenguajes
distintos de Java.
mbitos
Define dnde y durante cuanto tiempo estn
accesibles los objetos (Objetos implcitos,
JavaBeans, etc)
Tipos de mbitos:
de pgina. El objeto es accesible por el servlet
que representa la pgina
de peticin
de sesin. El objeto es accesible durante toda
la sesin, desde los servlets a los que se
accede
de aplicacin. El objeto es accesible por el
servlet que representa la pgina
Ejemplo de objetos
implcitos
Aplicacin que pide el nombre al usuario y le devuelve
un saludo . Utiliza un fichero HTML como formulario
que pide los datos al cliente y se los pasa a una
pgina JSP que muestra el saludo con estos datos. El
paso de los datos del formulario al JSP se realiza a
travs de un objeto implcito: objeto request
Formulario HTML
(pide datos al cliente)
Objeto request
(contiene los parmetros de
la peticin)
Pgina JSP
(muestra saludo
personalizado al cliente)
Ejemplo de objetos
implcitos
Fichero HTML que pide los datos al cliente
(ej2_saludo.html)
<HTML>
<head>
<title> Formulario de peticin de nombre </title>
</head>
<body>
<h1> Formulario de peticin de nombre </h1>
<!-- Se enva el formulario al JSP saludo.jsp -->
<form method="post" action="saludo.jsp" >
<p> Por favor, introduce tu nombre:
<input type="text" name="nombre">
</p>
<p>
<input type="submit" value="enviar informacin">
</p>
</form> </body>
</HTML>
Ejemplo de objetos
implcitos
Fichero JSP que opera dinmicamente con los datos
del cliente y muestra los resultados (ej2_saludo.jsp)
<HTML>
<head><title> Saludo al cliente </title></head>
<body>
<h1> Saludo al cliente</h1>
<!-- Los parmetros que le pasa el cliente en la peticin
se obtienen del objeto implcito request -->
<%
String nombre = request.getParameter(nombre");
out.println(Encantado de conocerle, + nombre);
%>
<!-- Al evaluarse el cdigo, hay que escribir
explcitamente en la salida (obj. implcito out) -->
</body>
</HTML>
Elementos de una pgina
JSP
Cdigo HTML
Adems de cdigo HTML la pgina JSP puede
incluir marcadores que se agrupan en tres
categoras:
Directivas.
Afectan a toda la estructura del servlet generado
Elementos de Scripting (guiones)
Permiten insertar cdigo Java en la pgina JSP
Acciones
Afectan al comportamiento en tiempo de ejecucin
del JSP
Directivas JSP
Utilizadas para definir y manipular una
serie de atributos dependientes de la
pgina que afectan a todo el JSP.
Las
directivas
existentes
son
las
siguientes:
Page
Include
Taglib
Directivas de JSP Directiva Page
Sintaxis
<%@ page ATRIBUTOS %>
Donde ATRIBUTOS son parejas:
nombre=valor
Ejemplo:
<%@
page language=Java import=java.rmi.*,java.util.*
session=true buffer=12kb %>
Existe una lista de atributos que pueden ser
usados
Directivas de JSP Directiva Page
Algunos de los atributos ms usados:
import ="package.class".
Lista de paquetes o clases, separados por
comas, que sern importados para utilizarse
dentro del cdigo java.
session =true|false
Especifica si la pgina participa en una sesin
HTTP. Si se inicializa a true, est disponible el
objeto implcito sesin.
buffer =tamaokb
Especifica el tamao de un buffer de salida de
tipo stream, para el cliente.
Directivas de JSP - Directiva
Page
autoflush ="true|false".
extends ="package.class".
Un valor de true (por defecto) indica que el buffer
debera desacargase cuando est lleno. Un valor de
false, raramente utilizado, indica que se debe lanzar una
excepcin cuando el buffe se sobrecargue. Un valor de
false es ilegal cuando usamos buffer="none".
Esto indica la superclase del servlet que se va a generar.
Debemos usarla con extrema precaucin, ya que el
servidor podra utilizar una superclase personalizada.
info ="message".
Define un string que puede usarse para ser recuperado
mediante el mtodo getServletInfo.
Directivas de JSP - Directiva
Page
errorPage="url".
isErrorPage="true|false".
Especifica una pgina JSP que se debera procesar si se
lanzar cualquier Throwable pero no fuera capturado
en la pgina actual.
Indica si la pgina actual acta o no como pgina de
error de otra pgina JSP. El valor por defecto es false.
ContentType = "MIME-Type" o contentType =
"MIME-Type; charset = Character-Set"
Esto especifica el tipo MIME de la salida. El valor por
defecto es text/html. Tiene el mismo valor que el
scriptlet usando response.setContentType.
Directivas de JSP Directiva Page
isThreadSafe="true|false"
Un valor de true (por defecto) indica un procesamiento
del servlet normal, donde mltiples peticiones pueden
procesarse simultneamente con un slo ejemplar del
servlet, bajo la suposicin que el autor sincroniza los
recursos compartidos. Un valor de false indica que el
servlet debera implementar SingleThreadModel.
language="java"
En algunos momentos, esto est pensado para
especificar el lenguaje a utilizar. Por ahora, no debemos
precuparnos por l ya que java es tanto el valor por
defecto como la nica opcin legal.
Directivas de JSP - Directiva
Include
Indica al motor JSP que incluya el contenido del
fichero correspondiente en el JSP, insertndolo en el
lugar de la directiva del JSP.
El contenido del fichero incluido es analizado en el
momento de la traduccin del fichero JSP y se incluye
una copia del mismo dentro del servlet generado.
Una vez incluido, si se modifica el fichero incluido no
se ver reflejado en el servlet
El tipo de fichero a incluir puede ser un
fichero HTML (esttico)
fichero jsp (dinmico)
Sintaxis:
%>
<%@ include file=Nombre del fichero
Ejemplo de la Directiva
Include
Ejemplo:Pgina JSP que incluye el contenido de dos
ficheros (una pgina HTML y una pgina JSP)
<HTML>
<head>
<title> Pgina
</title>
</head>
<body>
<h1> Pgina
</h1>
<%@ include
<%@ include
</body>
</HTML>
de prueba de directivas de compilacin
de prueba de directivas de compilacin
file=/fichero.html %>
file=/fichero.jsp %>
Ejemplo de la Directiva
Include
Siendo, por ejemplo el fichero HTML el
Siendo, por ejemplo el fichero HTML el
siguiente:
<HTML>
<head> <title> Hola, Mundo </title> </head>
<body> <h1> Hola, Mundo! </h1>
</body>
</HTML>
y el fichero JSP el siguiente:
<%@ page info="Un ejemplo Hola Mundo"
import="java.util.Date" %>
La fecha de hoy es:
<%= new Date().toString() %>
Directivas de JSP - Directiva
Taglib
Permite extender los marcadores de JSP con
etiquetas o marcas generadas por el propio
usuario (etiquetas personalizadas).
Se hace referencia a una biblioteca de etiquetas
que contiene cdigo Java compilado definiendo
las etiquetas que van a ser usadas, y que han
sido definidas por el usuario
Sintaxis
<%@ taglib uri=taglibraryURI prefix=tagPrefix
%>
Elementos de una pgina
JSP
Cdigo HTML
Directivas
page
include
taglib
Elementos de Scripting (guiones)
Acciones (marcas estandar)
Elementos Scripting
Permiten la insercin de Declaraciones, Cdigo
Java (scriptlets) y Expresiones dentro de una
pgina JSP
Hay 3 categoras:
Declaraciones
Cdigo Java arbitrario
Expresiones
Elementos Scripting Declaraciones
Usadas para definir variables y mtodos con
mbito de clase para el servlet generado
Estas variables o mtodos declarados pasarn a
ser variables de instancia de la clase servlet
generada
Esto significa que sern globales a todo el servlet
generado para la pgina
Sintaxis
<%! Declaracin %>
Ejemplo:
<%! int contador >
Ejemplo de uso de
Declaraciones
Uso de un contador que indica el nmero de veces
que se accede a una pgina
(ej5_declaraciones.jsp)
<HTML>
<head><title> Pgina de control de declaraciones
</title></head>
<body>
<h1> Pgina de control de declaraciones </h1>
<%! int i=0 ; %> <!-- Esto es una declaracin -->
<% i++; %> <!-- scriptlet (cdigo Java) que se ejecuta-->
HOLA MUNDO
<%= "Este JSP ha sido accedido " + i + veces" %>
<!-- Esto es una expresin que se evala y se sustituye en
la pgina por su resultado -->
</body>
</HTML>
Elementos Scripting Scriptlets
Un scriptlet es un bloque de cdigo Java insertado en la
pgina y ejecutado durante el procesamiento de la
respuesta
El cdigo introducido se inserta directamente en el
mtodo _jspService() del servlet generado para la
pgina
Sintaxis
<% cdigo Java
%>
Ejemplo
<% int i,j;
for (i=0;i<3;i++) {
j=j+1;
}
%>
Ejemplo de uso de
Scriptlets
Pgina JSP que usa cdigo Java para repetir 10
veces un saludo
<HTML>
<head><title> Pgina de ejemplo de scriptlet </title></head>
<body>
<h1> Pgina de ejemplo de scriptlet </h1>
<%
for (int i=0; i<10; i++;){
out.println("<b> Hola a todos. Esto es un ejemplo de
scriptlet " + i + "</b><br>");
System.out.println("Esto va al stream System.out" +
i );
//Esto ltimo va a la consola del Java, no al cliente,
//out a secas es para la respuesta al cliente.
}
%>
</body>
</HTML>
Elementos Scripting Expresiones
Notacin abreviada que enva el valor de una
expresin Java al cliente.
La expresin se traduce por la llamada al mtodo
println del objeto out dentro del mtodo _jspService(),
con lo que en cada peticin, la expresin es evaluada y
el resultado se convierte a un String y se visualiza
Sintaxis
<%= Expresin Java a evaluar %>
Ejemplo
<%= Esta expresin muestra el valor de un contador +
contador %>
Nota: ser necesario que previamente contador haya tomado un
valor a travs de un scriptlet
Ejemplo de uso de
Expresiones
En esta pgina JSP la expresin consiste en crear
un objeto y llamar a uno de sus mtodos. El
resultado es un string que se muestra al cliente
<HTML>
<head>
<title> Pgina de ejemplo de expresiones </title>
</head>
<body>
<h1> Pgina de ejemplo de expresiones </h1>
Hola a todos, son las <%= new Date().toString() %>
</body>
</HTML>
Ejercicios
Con los ejemplos existentes en el directorio
JSP\ejemplossimples
1.
Modificar el fichero ej4_incluido.html y comprobar que
dichas modificaciones no aparecen reflejadas por la
directiva
Ejecutar la sumadora situada en el directorio sumadora
Crear una aplicacin que funcione como calculadora con
todas las operaciones.
2.
3.
4.
5.
Ejecutarlos, visualizar el contenido de los ficheros, visualizar
el contenido de alguno de los servlets generados para ellos
Basarse en ej2_saludo.html para hacer el formulario y
sumadora.jsp
Usar la instruccin if(operacin.equals(restar)
resultado=
Crear una aplicacin que funciones como euroconversor
Elementos de una pgina
JSP
Cdigo HTML
Directivas
page
include
taglib
Elementos de Scripting (guiones)
Declaraciones
Cdigo Java arbitrario
Expresiones
Acciones
Acciones estndar
Acciones personalizadas
Acciones estndar
Son marcas estndar, con formato XML, que
afectan al comportamiento en tiempo de ejecucin
del JSP y la respuesta se devuelve al cliente.
En la traduccin de JSP al servlet, la marca se
reemplaza por cierto cdigo Java que define a dicha
marca. Una marca por tanto define un cierto cdigo
Java (es como una macro)
Constan de un prefijo y un sufijo adems de una
serie de atributos. El prefijo es siempre jsp en las
acciones estndar
Sintaxis
<jsp:sufijo
atributos/>
Ejemplo
<jsp:include page=mijsp.jsp flush=true />
Acciones estndar
existentes
<jsp:include>
<jsp:include>
<jsp:forward>
<jsp:param>
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:plugin>
Accin jsp:include
Permite incluir un recurso especificado por la URL,
en la peticin JSP en tiempo de ejecucin.
Cuando se realiza la traduccin de JSP al servlet,
dentro del mtodo _jspService() se genera el cdigo
que comprueba si existe el recurso (pgina) y si no se
crea, invocndolo a continuacin.
Cuando se ejecuta el servlet, se invoca al recurso que
realiza la operacin y devuelve el resultado al servlet
El elemento incluido puede acceder al objeto request
de la pgina padre, y adems de los parmetros
normales, a los que se aadan con <jsp:param>
Accin jsp:include
Sintaxis
<jsp:include page=URL flush=true>
<jsp:param name=nombre clave
value=valor /> (no obligatorios) ....
</jsp:include>
Accin include vs Directiva
include
Es importante distinguir entre directiva include y
accin include
Directiva <%@ include file=Nombre fichero />
se aade el cdigo al servlet que se genera para
la pgina en tiempo de compilacin y se incluye
el contenido EXISTENTE EN EL MOMENTO
INICIAL.
Accin <jsp:include> no se aade cdigo al
servlet, sino que se invoca al objeto en tiempo de
ejecucin y se ejecuta el contenido EXISTENTE
EN EL MOMENTO DE LA PETICIN
Ejemplo de la accin
include
<HTML>
<head>
<title> Inclusin de fichero </title>
</head>
<body>
<h1> Inclusin de ficheros </h1>
<%@ include file="incluido.jsp" %>
<jsp:include page=incluido.jsp />
</body>
</HTML>
Fichero incluido (incluido.jsp)
<%@ page import="java.util.Date" %>
<%= "Fecha actual es " + new Date() %>
Tipos de acciones
existentes
<jsp:include>
<jsp:param>
<jsp:forward>
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:plugin>
Accin jsp:param
Se usa como submarca dentro de cualquier otra
marca
Sirve para pasar parmetros a un objeto
Sintaxis
<jsp:....
>
<jsp:param name=nombre clave
value=valor /> (no obligatorios)
....
</jsp:....
>
Tipos de acciones
existentes
<jsp:include>
<jsp:param>
<jsp:forward>
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:plugin>
Accin jsp:forward
Esta marca permite que la peticin sea redirigida a
otra pgina JSP, a otro servlet o a otro recurso esttico
Muy til cuando se quiere separar la aplicacin en
diferentes vistas, dependiendo de la peticin
interceptada.
Cuando se ejecuta el servlet se redirige hacia otro
servlet y no se vuelve al servlet original
Sintaxis
<jsp:forward page=URL >
<jsp:param name=nombre clave
value=valor /> (no obligatorios)
....
</jsp:forward>
Ejemplo de la accin
forward
Formulario HTML que pide nombre y password y los
enva a una pgina jsp que lo analiza (forward.jsp)
<HTML>
<head> <title> Ejemplo de uso del forward
</title> </head>
<body>
<h1> Ejemplo de uso del forward </h1>
<form method=post action=forward.jsp>
<input type=text name=userName>
<br> y clave:
<input type=password name=password>
</p>
<p><input type=submit name=log in>
</form>
</body>
</HTML>
Ejemplo de la accin
forward
Pgina JSP que lo ejecuta
Pgina JSP que lo ejecuta
No tiene nada de HTML
En funcin de los valores de los parmetros de
la peticin redirige a una segunda pgina JSP
(si es un usuario y una clave determinadas) o
bien recarga la pgina inicial (incluyndola)
Mezcla cdigo Java puro con acciones
estndard
Ejemplo de la accin
forward
<% if
<% if
((request.getParameter(userName).equals(
Ricardo)) &&
(request.getParameter(password).equals(
xyzzy))) {
%>
<jsp:forward page=saludoforward.jsp />
<% } else { %>
<%@ include file=forward.html%>
<% } %>
Ejemplo de la accin
forward
El programa saludoforward.jsp podra ser el siguiente:
<HTML>
<head>
<title> Saludo al cliente </title>
</head>
<body>
<h1> Saludo al cliente</h1>
<%
out.println(Bienvenido a la nueva
aplicacin");
%>
</body> </HTML>
Tipos de acciones
existentes
<jsp:include>
<jsp:include>
<jsp:forward>
<jsp:param>
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:plugin>
Accin jsp:useBean
Esta marca sirve para instanciar un JavaBean si no
existe, o localizar una instancia ya existente, para su
uso desde la pgina.
Los JavaBeans son objetos Java que cumplen
ciertas caractersticas en cuanto a su diseo: son
serializables y tienen un constructor implcito.
Se utilizan para reducir al mximo el cdigo Java
insertado en una pgina JSP. En lugar de meterlo
directamente en el fichero JSP se mete en una clase y
una instancia de sta se llama desde el JSP
Permite separar la lgica de ejecucin (en el
JavaBean) de la presentacin (en el servlet generado)
Se encapsula el cdigo Java en un objeto (JavaBean)
y se instancia y usa con el JSP.
Accin jsp:useBean
Los JavaBeans se caracterizan porque a sus atributos
(llamados propiedades) se acceden (por convenio) a
travs de los mtodos setNombreAtributo y
getNombreAtributo
Ojo, si el nombre va en minsculas el mtodo lleva la inicial del
nombre en maysculas para nombre se pone getNombre.
Si se usa un JavaBean en una pgina habr que definir
la clase correspondiente, creando los mtodos set y get
para los atributos definidos. Normalmente se suele definir
dentro de un paquete.
Dentro del servlet generado se puede llamar a mtodos de
un JavaBean que se encarguen de realizar ciertas
operaciones y el servlet muestra el resultado de las
mismas
Ventaja del traslado de la lgica a un JavaBean
Separacin de interfaz de la implementacin
Accin jsp:useBean
Sintaxis
<jsp:useBean id=nombre scope=nombrembito
detalles />
Caractersticas de los atributos de esta accin:
En id se define el nombre asignado al JavaBean
(identificador asociado)
El mbito se refiere a dnde puede referenciarse
el JavaBean. Permite compartir objetos en una
sesin
page,request,session y application
Accin jsp:useBean
Los detalles pueden ser:
class=Nombre de la clase del JavaBean (es lo que ms se
usa)
id: Da un nombre a la variable que referencia al bean. Se usar
un objeto bean anterior en lugar de instanciar uno nuevo si se
puede encontrar uno con el mismo id y scope.
class: Designa el nombre completo del paquete del bean.
scope: Indica el contexto en el que el bean debera estar
disponible. Hay cuatro posibles valores: page, request, session,
y application.
type: Especifica el tipo de la variable a la que se referir el
objeto.
beanName: Da el nombre del bean, como lo suministraramos
en el mtodo instantiate de Beans. Esta permitido suministrar
un type y un beanName, y omitir el atributo class.
Accin jsp:setProperty
Esta marca se utiliza junto con la marca useBean
para asignar valor a las propiedades del Bean
En el mtodo _jspService() del servlet generado se
invoca al mtodo set de la propiedad deseada.
2 usos:
Despus de un useBean.
<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName
property="someProperty" ... />
Se ejecuta siempre que haya una solicitud.
Accin jsp:setProperty
Dentro de un useBean
<jsp:useBean id="myName ... >
...
<jsp:setProperty name="myName"
property="someProperty" ... />
</jsp:useBean>
Slo se ejecuta cuando haya que
instanciar un bean.
Accin jsp:setProperty
Sintaxis
<jsp:setProperty name=identificador del Bean detalles
de la propiedad />
Donde los detalles pueden ser
property: Este atributo requerido indica la propiedad que
queremos seleccionar. Sin embargo, hay un caso especial: un
valor de "*" significa que todos los parmetros de la peticin
cuyos nombres correspondan con nombres de propiedades del
Bean sern pasados a los mtodos de seleccin apropiados.
value: Este atributo opcional especifica el valor para la
propiedad. Los valores string son convertidos automticamente
a lo que corresponda mediante el mtodo estndard valueOf. No
se pueden usar value y param juntos, pero si est permitido no
usar ninguna.
param: Este parmetro opcional designa el parmetro de la peticin
del que se debera derivar la propiedad. Si la peticin actual no tiene
dicho parmetro, no se hace nada: el sistema no pasa null al mtodo
seleccionador de la propiedad.
Accin jsp:setProperty
property=* (se cogen como propiedades
y valores todos los parmetros del objeto
request)
property=Nombre (se coge un parmetro
con el mismo nombre del objeto request)
property=Nombre
param=NombreParmetro (si se desean
nombres distintos)
property=Nombre value=valor
parmetro (se asignan propiedades
arbitrarias con valores concretos)
Accin jsp:getProperty
Se utiliza para obtener el valor de las
propiedades de un Bean.
Dentro del mtodo _jspService() del servlet
generado se accede al valor de una propiedad, lo
convierte a string y lo imprime en la salida
del cliente (objeto out).
Sintaxis
<jsp:getProperty> name=nombre del Bean
property=Nombre de la propiedad />
Ej. de uso de JavaBean
(Formulario cliente)
(lenguaje/beans.html)
<HTML>
<head>
<title> Pgina de prueba del uso de beans </title>
</head>
<body>
<h1> Pgina de prueba del uso de beans </h1>
<form method="post" action="beans.jsp" >
Se enva el formulario al servicio cuyo fichero es beans.jsp
<p> Por favor, introduce tu nombre:
<input type="text" name="nombre">
<br> Cul es tu lenguaje de programacin favorito?
[...]
Ej. de uso de JavaBean
(Formulario cliente)
[...]
<select name="lenguaje">
<option value="Java"> Java
<option value="C++"> C++
<option value="Perl"> Perl
</select>
</p>
<p>
<input type="submit" value="enviar informacin">
</p>
</form>
</body>
</HTML>
Ej. de uso de JavaBean (Fichero
jsp)
Fichero lenguaje/beans.jsp que usa un Bean
para elaborar los resultados y los muestra
<jsp:useBean id="lenguajeBean" scope="page"
class="es.uniovi.di.servinfo.lenguaje.LenguajeBean">
Usa un Bean generado a partir de la clase denominada
LenguajeBean que est en el paquete
es.uniovi.di.servinfo.lenguaje con mbito de pgina
<jsp:setProperty name="lenguajeBean" property="*"/>
Las propiedades del Bean las toma del objeto peticin
</jsp:useBean>
<HTML>
<head><title> Resultado de prueba del uso de beans </title>
</head>
Ej. de uso de JavaBean
(Fichero jsp)
<body> <h1> Resultado de prueba del uso de beans </h1>
<p> Hola
<jsp:getProperty name="lenguajeBean" property="nombre" />.
</p>
coge el valor de la propiedad indicada y lo imprime para lo cual
se ejecuta un mtodo del Bean con el nombre de la propiedad
<p> Tu lenguaje favorito es
<jsp:getProperty name="lenguajeBean" property="lenguaje" />.
</p>
<p> Mis comentarios acerca del lenguaje
<p> <jsp:getProperty name="lenguajeBean"
property="comentariosLenguaje" />. </p>
</body> </HTML>
Ej. de uso de JavaBean (Definicin
de la clase)
Clase LenguajeBean
(classes\es.uniovi.di.servinfo.lenguaje.LenguajeB
ean.java)
package es.uniovi.di.servinfo.lenguaje;
public class LenguajeBean {
// propiedades
private String nombre;
private String lenguaje;
// constructor implicito, no hace falta declararlo
public LenguajeBean() {}
[]
Ej. de uso de JavaBean (Definicin de
la clase)
// Coloca el valor a la propiedad Nombre
public void setNombre(String nombre) {
this.nombre=nombre;
}
// Recupera el valor de la propiedad nombre
public String getNombre() {
return nombre;
}
// Coloca el valor a la propiedad lenguaje
public void setLenguaje(String lenguaje) {
this.lenguaje=lenguaje;
}
// Consigue el valor de la propiedad Lenguaje
public String getLenguaje() {
return lenguaje; }
[...]
Ej. de uso de JavaBean (Definicin
de la clase)
/* Consigue el valor de la propiedad comentariosLenguaje */
public String getcomentariosLenguaje () {
if (lenguaje.equals("Java")) {
return "El rey de los lenguajes Orientados a objetos";
}
else if (lenguaje.equals("C++")) {
return "Demasiado complejo";
}
else if (lenguaje.equals("Perl")) {
return "OK si te gusta el cdigo incomprensible"; }
else {
return "Lo siento, no conozco el lenguaje " +
lenguaje ;
}
}
}
Accin jsp:plugin
Permite incluir applets en la jsp que la define, sin
que el programador deba preocuparse ni por su
correcta visualizacin en el cliente ni de que sus
recursos se hospeden en el mismo servidor que la jsp.
No obstante, cuando en la mquina cliente hay
instaladas varias versiones del JRE, puede haber
problemas.
Lo que hace esta accin es identificar el tipo y versin
del cliente web mediante el encabezado de peticin
User-Agent y generar cdigo html especfico para ese
cliente que permita asegurar la correcta visualizacin
del applet sin importar versin ni tipo de cliente.
Tiene muchos atributos coincidentes con los de la
etiqueta <applet> asociada a los applets Java. Los
principales son los siguientes:
Accin jsp:plugin Atributos
type
El valor applet es el ms normal.
Indica el tipo de componente que va a
insertarse
Si incluimos un bean grfico, utilizaramos
bean
Obligatorio
code
Nombre de la clase del applet
Obligatorio
Accin jsp:plugin Atributos
width
Anchura en pxeles
Obligatorio
height
Altura en pxeles
Obligatorio
codebase
En el caso de que no se encuentre
donde su archivo html asociado
Accin jsp:plugin Atributos
Se utiliza para ejecutar applets ubicados
en un servidor distinto de aquel en el que
est el jsp
No es obligatorio
archive
Indica el fichero jar donde estn
almacenados el applet y sus recursos
No es obligatorio
Hay ms, pero estos son los ms
utilizados
Accin jsp:plugin Ejemplo
<html>
<head><title>Boletin de noticias con
applet</title></head>
<body>
<h1>Boletin de noticias CON APPLET</h1>
<b>Jueguecillo de capitales (es un
applet):</b><p>
<jsp:plugin type="applet"
code="JuegoCapitales.class" width="700"
height="350">
</jsp:plugin><hr><p>
Accin jsp:plugin Ejemplo
<!-- Si los recursos del applet se encuentran en
un servidor distinto de aqul en
que se encuentra la jsp donde se declara la
accin -->
<%-- <jsp:plugin type="applet"
code="JuegoCapitales.class"
codebase="http://www10.brinkster.com/trilcej
f/applets"
width="700" height="350">
</jsp:plugin> --%>
Accin jsp:plugin Ejemplo
<b>Resumen de noticias:</b><p>
<ol>
<li><jsp:include
page="/Noticia1.html"/><hr><p>
<li><jsp:include
page="/Noticia2.html"/><hr><p>
<li><jsp:include page="/Noticia3.jsp">
<jsp:param name="origen" value="El Pas" />
</jsp:include><hr><p>
</ol>
</body>
</html>
JSP 2.0
Algunas nuevas caractersticas de
JSP 2.0 frente a 1.2 orientadas a
simplificar su desarrollo son:
Simple Expression Language (EL)
Fragmentos JSP
Ficheros de Tags
Manejadores de Etiquetas Simplificados
Simple Expression
Language
La Expression Language, est inspirada en los
lenguajes de expresiones de ECMAScript y XPath
Simplifican el uso de expresiones en JSPs.
Permite la ejecucin de expresiones fuera de los elementos
de scripting de JSP
Fue introducida con JSTL 1.0 como un mecanismo
alternativo al uso de expresiones en Java para asignar
valores a atributos
Desde JSP 2.0 el JSP container entiende expresiones
en EL
EL es mucho ms tolerante sobre variables sin valor
(null) y realiza conversiones automticas de datos
Se puede habilitar (por defecto) o deshabilitar el uso
de expresiones EL:
<%@ page isScriptingEnabled="true|false"
isELEnabled="true|false"%>
Sintaxis de EL
Una expresin en EL contiene variables y
operadores
${expr}, donde expr es:
Literales:
true o false
Integer
Floating point
String
null
Ejemplos:
${false} <%-- evaluates to false --%>
${3*8}
Sintaxis de EL
${expr}, donde expr es:
Operadores:
Aritmticos: +, -, *, /, div, %, mod, Lgicos: and, &&, or, ||, !, not
Relacionales: ==, eq, !=, ne, <, lt, <, gt, <=, le, >=, ge
Vaco, empty, valida si una variable es null o una colleccin
no tiene elementos
Llamadas a funcin, donde func es el nombre de la funcin
y args es 0 o ms argumentos separados por comas.
Condicional: A ? B: C, como en C y Java
Ejemplos:
${ (6 * 5) + 5 } <%-- evaluates to 35 --%>
${empty name}
Sintaxis de EL
${expr}, donde expr es:
Objetos implcitos:
pageContext contexto del JSP, puede usarse para acceder a
objetos implcitos como request, response, session, out,
servletContext, etc.
param
<-> request.getHeader(name)
${headerValues.name}
<-> request.getHeaderValues(name)
cookie
${header.name}
headerValues
<-> request.getParameter (name)
${paramvalues.name) <-> request.getParamterValues(name )
header
$(param.name)
paramValues
Ejemplo: ${pageContext.response}
${cookie.name.value} devuelve el valor de la primera cookie
con el nombre dado
initParam
initParam.name ServletContext.getInitparameter(String
name)
Sintaxis de EL
${expr}, donde expr es:
Objetos implcitos:
pageScope puede acceder a objetos
dentro del contexto de pgina
${pageScope.objectName}
${pageScope.objectName.attributeName}.
requestScope
${requestScope.objectName}
${requestScope.objectName.attributeName}
sessionScope
${sessionScope.name}
applicationScope
Ejemplos EL
${amount + 5} , aade 5 a una variable
amount
${order.amount + 5}, aade 5 a la
propiedad amount del bean order
Lo mismo sera hacer: ${order['amount'] + 5}
Para asignar un valor dinmico a un
atributo podemos hacer:
<input name="firstName" value="$
{customer.firstName}">
Ejemplos EL
El operador ?:
<select name="artist">
<option value="1" ${param.artist
'selected' : ''}>
Vesica Pisces
<option value="2" ${param.artist
'selected' : ''}>
Cortical Control
<option value="3" ${param.artist
'selected' : ''}>
Vida Vierra
</select>
== 1 ?
== 2 ?
== 3 ?
Pginas de Error JSP
Errores en servlets and JSPs desde su versin 2.0
vienen dadas en la variable
javax.servlet.error.exception
La propiedad errorData del objeto implcito
pageContext expone informacin sobre el
problema.
javax.servlet.jsp.ErrorData tiene las
siguientes propiedades:
requestURI la URI para la que fall la peticin
servletName el nombre del servlet o JSP que fall
statusCode el cdigo del fallo
throwable la excepcin que caus la invocacin de la
pgina de error
Pginas de Error JSP
<%@ page isErrorPage="true" contentType="text/html" %>
<%@ taglib prefix="log" uri="http://jakarta.apache.org/taglibs/log-1.0" %>
Sorry, but things didn't work out as planned. I've logged as much as
I know about the problem, so rest assured that my master will look
into what's wrong as soon as he's sober.
<jsp:useBean id="now" class="java.util.Date" />
<log:fatal>
----${now}
Request that failed: ${pageContext.errorData.requestURI}
Status code: ${pageContext.errorData.statusCode}
Exception: ${pageContext.errorData.throwable}
----</log:fatal>
Pginas de Error JSP
En el web.xml se puede indicar que esta es la
pgina de error mediante los siguientes
elementos:
...
<error-page>
<exceptiontype>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-code>500</exception-code>
<location>/error.jsp</location>
</error-page>
...
web.xml en JSP 2.0
Aunque se sigue utilizando web.xml hay dos
diferencias principales:
Las reglas de web.xml estn definidas en un XML
Schema
Las configuraciones especficas de JSP han sido
movidas a un nuevo elemento XML
Usar Schemas en vez de DTDs nos permite
colocar los elementos XML de primer nivel en
cualquier orden y realizar an mas verificaciones
sobre la sintaxis de web.xml
Todos los elementos especficos a la
configuracin de un JSP se encuentran
agrupados dentro del nuevo elemento <jspconfig>.
Elemento jsp-config
Su subelemento <jsp-property-group> es
muy interesante.
Permite aplicar configuraciones a un grupo de JSPs
que conforman con un patrn de url especfico
...
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
...
Elemento jsp-config
Elemento
Descripcin
<elignored
>
Indica si ignorar o no las expresiones EL dentro de un JSP
correspondiente al patrn URL indicado. Por defecto es
false.
<scriptinginvalid>
Si es true no se pueden introducir scriplets en el JSP.
<pageencodin
g>
Indica la codificacin de caracteres para un conjunto de
JSPs
<includecoda>
Indica el path correspondiente a un fichero a aadir al final
de cada pgina JSP..
<includeprelude
>
Lo mismo pero al comienzo de cada JSP.
<is-xml>
Si se asigna a true la sintaxis de los JSPs es en XML.
Ejercicios
Modificar la pgina ej4_directivainclude.jsp para
incluir tambin el fichero incluido.jsp como
accin include
Cambiar la pgina HTML o JSP y volver a ejecutar
comprobando resultados
Ejecutar el ejemplo del Bean que evala el lenguaje
preferido del cliente
Crear un Bean que funcione como sumadora.
1.
2.
3.
4.
5.
6.
Usar como base sumadora.html para sumadorabean.html,
lenguajebean.jsp para sumadorabean.jsp
lenguajebean.java y sumadora.jsp para sumadorabean.java
Ampliar la sumadora a calculadora con ms
operaciones
Usar un Bean para crear un euroconversor
Elementos de una pgina JSP
- Resumen
Cdigo HTML
Directivas <%@
page
<%@ page ATRIBUTOS %>
include <%@ include file=Nombre del fichero %>
taglib <%@ taglib uri=taglibraryURI prefix=tagPrefix %>
Elementos de Scripting (guiones) <%
Declaraciones
<% ! Declaracin %>
Cdigo Java arbitrario (scriptlets)
<% cdigo Java
Expresiones
%>
<%= Expresin Java a evaluar %>
Elementos de una pgina JSP Resumen
Acciones estndar <jsp:
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:include>
<jsp:param>
<jsp:forward>
<jsp:plugin>
Acciones personalizadas <etiq:
Problemas con JSPs
JavaBeans nos permiten separar la parte de
presentacin de una pgina JSP de la
implementacin de una regla de negocio
Sin embargo, slo 3 elementos accin en JSP se pueden
usar para acceder a un bean:
jsp:useBean
jsp:getProperty
jsp:setProperty
Por tanto a menudo tenemos que incluir cdigo en un
JSP
JSP (1.1 en adelante) define custom tags que pueden
ser usadas para definir acciones propietarias, de
manera que en nuestro JSP nicamente tenemos cdigo
de marcado
Etiquetas
personalizadas
Las acciones personalizadas estn definidas por el
programador de la aplicacin web mediante el uso de
etiquetas personalizadas.
Una etiqueta personalizada permite ocultar bajo ella un
conjunto de acciones (definidas con instrucciones java)
evitando que las mismas se incluyan en el fichero JSP.
As pues, para incluir lgica de programa en una
aplicacin web, es posible realizarlo de tres modos
Incluyendo el correspondiente cdigo Java en una
pgina JSP
Incluyndolo en un Java Bean que se llama desde la
pgina JSP
Incluyndolo en una etiqueta personalizada
Etiquetas personalizadas Caractersticas
Ventajas que proporcionan
Permiten reutilizar cdigo
Usando bibliotecas de etiquetas con las
funcionalidades ms extendidas
Permiten separar las funciones del diseador
web (que usa HTML y XML) de las del
programador web (que usa Java)
Permiten invocar funcionalidad sin necesidad de
introducir cdigo Java en la pgina JSP
Son ms potentes que los JavaBeans
(pgina siguiente)
Etiquetas personalizadas Caractersticas
Son ms potentes que los JavaBeans
El uso exclusivo de Beans no es suficiente para evitar todo
tipo de cdigo Java en una pgina JSP
Las marcas propias pueden lograr directamente lo que los
beans pueden slo lograr en conjuncin con los scriptlets
Ej: Una etiqueta que compruebe que un usuario existe
(u otra condicin) y se redirija a una pgina de xito o
de error en funcin de la comprobacin.
El uso exclusivo de Beans no es suficiente.
Podramos usar un bean para comprobar que el usuario
existe.
El hecho de redirigir a una pgina o a otra en funcin de si
existe o no debe hacerse en una pgina JSP (puesto que
desde un bean no se puede reenviar a una pgina JSP) y debe
utilizarse cdigo Java para realizar la comparacin (if)
JavaBeans no permiten interactuar con la JSP.
Etiquetas personalizadas Ejemplo de uso
Si se desea solicitar una lista de libros de una base
de datos con JSP podra hacerse utilizando un Bean
que devuelva la lista de libros.
<jsp:useBean id=biblio class=Libros />
<% ResultSet res=getLibros(Libros);%>
Posteriomente se recorre la lista y se muestra el
atributo ttulo de cada libro. Esto no se puede
hacer en el Bean porque en l no se puede acceder
al objeto out para devolver el resultado al cliente,
por lo que hay que incluirlo en el fichero JSP
<% while (res.next()){ %>
<%=res.getString(titulo) %>
<% } %>
Etiquetas personalizadas Ejemplo de uso
La inclusin de las acciones personalizadas
permite ocultar todo el cdigo Java al diseador
web, permitiendo que ste utilice etiquetas como
si de cualquier otra etiqueta HTML se tratase
<%@ taglib uri=/bilbliolib prefix=etiq %>
<etiq:getLibro id=libros />
<ul>
<etiq:bucle name=libros bucledId=biblio >
<li> <jsp:getProperty name=libros
property=titulo />
</etiq:bucle>
Etiquetas personalizadas Ventajas
Reducen o eliminan cdigo Java en las pginas
JSP
Sintaxis muy simple, como cdigo HTML
Tienen acceso a todos los objetos implcitos
de las pginas JSP
Facilitan la reutilizacin de cdigo porque
pueden ser usadas en cualquier aplicacin web
Se pueden anidar, consiguiendo interacciones
complejas
Pueden ser personalizadas a travs de atributos
y determinadas de forma esttica o dinmica
Etiquetas personalizadas Definicin
1. Definicin de la estructura en un fichero de
definicin de etiquetas (biblioteca de etiquetas)
2.
Fichero con extensin .tld Tag Library Descriptor (TLD)
es un fichero XML que describe la biblioteca
Los .tld se guardan en un directorio TLDS dentro de WEBINF de la aplicacin
La biblioteca (.tld) debe estar a su vez definida en el
fichero web.xml, que existir en el directorio WEBINF de la aplicacin
Definicin de la funcionalidad asociada a la etiqueta
(lo que queremos que haga cuando se use la
etiqueta) . Se define a travs de un controlador de
la etiqueta (clase que implementa la etiqueta)
Es un JavaBean, con propiedades que coinciden con los
atributos XML de la etiqueta.
Etiquetas personalizadas -
Uso en
una pgina JSP
Cuando se desee usar la etiqueta, se incluye en el
fichero JSP la directiva JSP taglib para importar las
etiquetas
<%@ taglib uri=direccin de la biblioteca
prefix=tagPrifix %>
Posteriormente se usa la etiqueta dentro de la pgina
Ejemplos:
<eti:holamundo/> esto es una etiqueta que muestra un mensaje de
hola Mundo
<eti:hola nombre=Marian/> Muestra un mensaje hola Marian
<eti:suma 3 4/>
muestra la suma de dos valores
Etiquetas personalizadas - Ejemplo de uso en
un fichero JSP
Caso simple, sin atributos ni cuerpo, que saca cdigo
HTML y contenido dinmico
(etiquetas\ejtag1_hola.jsp)
<%@ taglib uri=/WEB-INF/tlds/etiquetas.tld prefix=ejemplo %>
<HTML>
<head><title> Saludo al cliente mediante el uso de una
etiqueta </title></head>
<body>
<h1> Saludo al cliente con una etiqueta </h1>
<ejemplo:hola />
</body>
</HTML>
Etiquetas personalizadas -
Partes de
un fichero TLD
Descriptor de la biblioteca TLD Tag Library
Descriptor
1.
Informacin acerca de la biblioteca
(cabecera)
2.
Definicin de la estructura de cada etiqueta
Descriptor de la Librera de Etiquetas (Tag Library
Descriptor)
Fichero XML que define una librera de
tags y sus etiquetas. Consta de:
Prlogo XML como todo documento XML
El elemento raz <taglib>, que tiene como
sub-elementos:
tlib-version versin de la librera de etiquetas
jsp-version la versin de JSP, actualmente 2.0
short-name nombre corto para la librera
description informacin para documentacin
uri enlace a ms informacin sobre tag library
tag elemento ms importante, puede haber varios
y tiene sub-elementos
Elemento <tag> del descriptor de una librera
de etiquetas
Puede tener los siguientes sub-elementos ( name and
tag-class son los nicos obligatorios):
name identificador de la etiqueta
tag-class nombre de la clase completo que realiza el
procesamiento de esta etiqueta
tei-class clase de ayuda de esta etiqueta
body-content el tipo de cuerpo de una etiqueta:
description
attribute: cero o ms atributos que puede tener tres
subelementos:
empty no hay cuerpo
JSP cuerpo es un conjunto de elementos
tagdependent cuerpo debe ser interpretado por la etiqueta
name (obligatorio)
required: true o false (valor por defecto false)
rtexprvalue: determina si el valor de este atributo se puede
determinar en tiempo de ejecucin
Definicin de la estructura de
una etiqueta
En la definicin de una etiqueta personalizada
debe aparecer al menos:
<tag>
Indica comienzo de definicin
<name> Hola </name>
Nombre de la etiqueta
<tagclass> tagPaquete.HolaTag </tagclass>
Nombre de la clase que implementa la
funcionalidad
</tag>
Fin de la etiqueta
Adems puede llevar
Atributos, anidaciones y cuerpo
Ejemplo de definicin de estructura de una
etiqueta
TLD Tag Library Descriptor
(WEB-INF\tlds\etiquetas.tld)
Informacin acerca de la biblioteca (cabecera)
<?xml version=1.0 encoding=ISO-8859-1 ?>
<!DOCTYPE taglib >
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname> ejemplos </shortname>
<info> Biblioteca de ejemplos sencillos </info>
Informacin de cada etiqueta
<tag>
<name> Hola </name>
<tagclass> es.uniovi.di.servinfo.etiquetas.HolaTag
</tagclass>
<info> Ejemplo simple </info>
</tag>
</taglib>
La API de Etiquetas
Personalizadas
Paquete javax.servlet.jsp.tagext
Un manejador de etiquetas (Tag Handler) es una
clase que est ligada a una etiqueta
personalizada y es invocada cada vez que el
contenedor de JSPs encuentra la etiqueta.
En JSP 1.2, la clase javax.servlet.jsp.tagext
tiene 4 interfaces y 12 clases
Los dos interfaces ms importantes son Tag y BodyTag
Estos interfaces dictan el ciclo de vida de un manejador
de etiquetas
Manejadores de etiquetas (Tag
Handlers)
Un manejador de etiquetas tiene acceso a un API a travs
del cual se puede comunicar con una pgina JSP. El punto
de entrada a la API es el objeto
javax.servlet.jsp.PageContext , a travs del cual el
TagHandler puede recuperar todos los otros objetos
implcitos (request, session, and application) accesibles
desde una pgina JSP.
Los objetos implcitos pueden tener atributos con nombre
asociados con ellos. Tales atributos son accesibles usando
mtodos [set|get]Attribute.
Si la etiqueta est anidada, un Tag Handler tambin tiene
acceso al Tag Handler (llamado parent) de la etiqueta
padre.
Un conjunto de clases Tag Handler relacionadas
constituyen una tag library y son empaquetadas como un
fichero JAR.
Ciclo de vida de las
etiquetas
Cuando el motor JSP encuentra la etiqueta durante
1.
2.
3.
la traduccin de la pgina JSP al servlet
Se crea un objeto de la clase etiqueta si no
existe
Se invocan sus mtodos set de cada uno de sus
atributos
Se invoca el mtodo doStartTag(). Este
mtodo finaliza con una de estas opciones
1.
2.
4.
SKIP_BODY (si no hay cuerpo)
EVAL_BODY_INCLUDE
Si no hay cuerpo se invoca ya a doEndTag() y
se acaba
Ciclo de vida de las
etiquetas
Si hay cuerpo,
1.
2.
3.
4.
Se invoca el mtodo setBodyContent()
Cualquier salida de la etiqueta se deriva al objeto
BodyContent
Se invoca el mtodo doInitBody() permite realizar
acciones antes de ser evaluado el cuerpo. La salida se
guarda en el buffer BodyContent
Se procesa el cuerpo de la etiqueta (se pasa el
contenido al buffer del BodyContent
Se invoca el mtodo doAfterBody(). Al final del mtodo
se puede determinar por dnde seguir el ciclo de
vida, devolviendo una de las siguientes constantes:
5.
6.
EVAL_BODY_AGAIN
SKIP_BODY
Si EVAL_BODY_AGAIN se vuelve al paso 3
Se invoca el mtodo doEndTag() y se acaba
El interfaz Tag
Este interfaz define los siguientes
mtodos:
doStartTag
doEndTag
getParent
setParent
setPageContext
release
Definicin de la funcionalidad de una
etiqueta
La funcionalidad de una etiqueta est definida en
una clase controladora (clase Java)
Permite instanciar un objeto que ser invocado por
el servlet generado para la pgina JSP que usa la
etiqueta
JSP 1.2 proporciona 3 interfaces de manejadores de
etiquetas:
Tag
IterationTag
BodyTag
Para evitar que el programador tenga que codificar
todos los mtodos tambin proporciona varias clases
de ayuda:
TagSupport, implementa todos los mtodos de la interfaz
Tag.
Definicin de la funcionalidad de una
etiqueta
La forma bsica de definicin de funcionalidad es
construir una clase que herede de una clase de
ayuda, por ejemplo TagSupport, y redefinir los
mtodos que queramos cambiar.
Dos mtodos bsicos:
doStartTag() llamado cuando se abre la etiqueta
doEndTag() llamado cuando se cierra
Si la etiqueta tiene atributos hay que definir los
mtodos set y get para los mismos
Otros mtodos son doInitBody, doAfterBody(), si
tiene cuerpo, etc.
Desde el servlet para la pgina se invoca a estos
mtodos
Ejemplo de definicin de la clase
controladora
(WEB-INF\classes\es\uniovi\di\servinfo\etiquetas\HolaTag.java)
package tagPaquete;
import
import
import
import
java.io.IOException;
java.util.Date;
javax.servlet.jsp.*;
javax.servlet.jsp.tagext.*;
public class HolaTag extends TagSupport {
public int doStartTag() throws JspTagException {
// el motor JSP llama este mtodo cuando encuentre el
// comienzo de una marca implementada por esta clase
return SKIP_BODY;
}
[]
Ejemplo de definicin de la clase
controladora
public int doEndTag() throws JspTagException {
// el motor llama este mtodo cuando encuentre el
// final de una marca implementada por esta clase
String dateString = new Date().toString();
try {
pageContext.getOut().write(Hola mundo.<br/>);
pageContext.getOut().write(Mi nombre es +
getClass().getName() + y son las +
dateString + <p/>);
} catch (IOException ex) {
throw new JspTagException
(Error: la etiqueta hola no puede escribir en la
salida del JSP);
}
return EVAL_PAGE;
}
}
// clase HolaTag
Usando atributos en una etiqueta
personalizada I
Objetivo: Etiqueta personalizada
para imprimir un saludo que incluya
el nombre del usuario
El manejador debe definir un mtodo
setNombre para asignar un atributo
al valor
Etiqueta con atributos:
definicin en la tld
<taglib>
[]
<tag>
<name>saludo</name>
<tagclass>es.uniovi.di.servinfo.etiquetas.HolaTagAtribut
o</tagclass>
<bodycontent> empty</bodycontent>
<info>Esta es una etiqueta muy simple de saludo
</info>
<atribute>
<name>nombre</name>
<required>false</required>
<rtextvalue>false</rtexpvalue>
</atribute>
</tag>
</taglib>
Etiqueta con atributos:
definicin de la
clase controladora
package es.uniovi.di.servinfo.etiquetas;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HolaTag extends TagSupport {
// Atributo de la etiqueta definido en el
fichero TLD
private String nombre = null;
public void HolaTag() {}
Etiqueta con atributos:
definicin de la
clase controladora
// Mtodos set y get del atributo "nombre" que
// se ha definido en el fichero TLD para esta etiqueta
public void setNombre( String _nombre ) {
nombre = _nombre;
}
public String getNombre() {
return( nombre );
}
Etiqueta con atributos:
definicin de la
clase controladora
// Al inicio de la etiqueta
public int doStartTag() throws JspTagException {
try {
JspWriter out = pageContext.getOut();
out.println( "<table border=1>" );
if( nombre != null ) {
out.println( "<tr><td> Hola " +nombre+ "
</td></tr>" );
}
else { out.println( "<tr><td>Hola Mundo
JSP</td></tr>" );
}
} catch( Exception e ) { throw new
JspTagException( e.getMessage() );
}
return( SKIP_BODY );
}
Etiqueta con atributos:
definicin de la
clase controladora
// Al cierre de la etiqueta
public int doEndTag() throws JspTagException {
try {
/* Se utiliza el pageContext para obtener el
objeto de salida, sobre el que colocar la etiqueta
HTML de cierre de la tabla */
pageContext.getOut().print( "</table>" );
} catch( Exception e ) {
throw new JspTagException( e.getMessage() );
}
return( SKIP_BODY );
}
Etiqueta con atributos:
definicin de la
clase controladora
public void release() {
/* Llama al mtodo release() del padre, para que se
devuelvan todos los recursos utilizados al sistema.
Esta es una buena prctica, sobre todo cuando se
estn utilizando jararquas de etiquetas */
super.release();
}
} // de la clase
Etiqueta con atributos: uso de
la etiqueta
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN">
<%@ taglib uri="/WEB-INF/tlds/ejemplo2.tld"
prefix=etiq" %>
<html>
<head>
<title>Ejemplo Etiquetas, Etiqueta Saludo</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>
Etiqueta con atributos: uso de
la etiqueta
<body>
<h2>Ejemplo de biblioteca de etiquetas:
<i>HolaTagAtributo.java</i></h2>
En esta pgina se muestra el uso de esta etiqueta,
que se invoca en primer lugar especificando un valor
para el atributo <i>nombre</i> y luego sin ningn
argumento.
<p>
<hr><center>
<etiq:saludo nombre="Agustn"/>
</center><hr>
<etiq:saludo />
</body>
</html>
El interfaz IterationTag
Extiende el interfaz Tag aadiendo un
nuevo mtodo doAfterBody, que
puede devolver:
Tag.SKIP_BODY el cuerpo se ignora y
el contenedor llama a doEndTag
IterationTag.EVAL_BODY_AGAIN
doAfterBody es llamado de nuevo
Ejemplo IterationTag I
Objetivo: calcular una potencia: 2^3=8
package es.deusto.customtags;
import
import
javax.servlet.jsp.*;
javax.servlet.jsp.tagext.*;
public class PowerTag
//extends TagSupport {
implements IterationTag {
private
private
private
private
private
PageContext pageContext;
int number;
int power;
int counter = 0;
int result = 1;
// the setter for number
public void setNumber(int number) {
System.out.println("number: " + number);
this.number = number;
}
public int getNumber() {
return this.number;
}
Ejemplo IterationTag II
// the setter for power
public void setPower(int power) {
System.out.println("power: " + power);
this.power = power;
}
public int getPower() {
return this.power;
}
public void setParent(Tag t) {
}
public void setPageContext(PageContext p) {
System.out.println("setPageContext");
pageContext = p;
}
public void release() {
System.out.println("doAfterBody");
}
public Tag getParent() {
return null;
}
Ejemplo IterationTag III
public int doStartTag() {
System.out.println("doStartTag");
return EVAL_BODY_INCLUDE;
}
public int doAfterBody() {
System.out.println("doAfterBody");
counter++;
result *= number;
if (counter >= power)
return SKIP_BODY;
else
return EVAL_BODY_AGAIN;
}
public int doEndTag() throws JspException {
System.out.println("doEndTag");
try {
JspWriter out = pageContext.getOut();
out.println(number + "^" + power + "=" + result);
this.counter = 0;
this.result = 1;
}
catch (Exception e) {
}
return EVAL_PAGE;
}
}
Ejemplo IterationTag III
JSP para evaluar el cdigo:
<%@ taglib uri="/myTLD" prefix="easy"%>
<easy:myTag number="2" power="3">.</easy:myTag>
Fichero TLD:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>myTag</short-name>
<tag>
<name>myTag</name>
<tag-class>es.deusto.customtags.PowerTag</tag-class>
<body-content>tagdependent</body-content>
<attribute>
<name>number</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>power</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Manipulando el contenido de una etiqueta
personalizada
Una etiqueta personalizada puede
tener un cuerpo:
<%@ taglib uri=/myTLD
prefix=x%>
<x:theTag>This is the body
content</x:theTag>
Para manipular el cuerpo de una
etiqueta es necesario utilizar
BodyTag y BodyContent
La interfaz BodyTag
Extiende la IterationTag con 2 mtodos
Tiene un ciclo de vida similar a IterationTag, sin
embargo:
doStartTag puede devolver SKIP_BODY, EVAL_BODY_INCLUDE
(el cuerpo se evalua como con IterationTag) o
EVAL_BODY_BUFFERED (un objeto de tipo BodyContent es
creado al cuerpo de la etiqueta personalizada)
public void setBodyContent(BodyContent
bodyContent)
Llamado despus de doStartTag, seguido de doInitBody,
pero no se invoca si:
La custom tag no tiene cuerpo
La custom tag tiene cuerpo pero doStartTag devuelve SKIP_BOBY
o EVAL_BODY_INCLUDE
public void doInitBody() throws
java.servlet.jsp.JspException
No se invoca si se cumple alguna de las mismas condiciones
que para setBodyContent
La clase BodyContent
Representa el cuerpo de una
etiqueta personalizada
Ejemplo:
Codificar el contenido HTML de una
etiqueta personalizada y visualizar
su contenido en el navegador
Ejemplo de manipulacin del cuerpo de
custom tag I
package es.deusto.customtags;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class EncoderTag
implements BodyTag {
PageContext pageContext;
BodyContent bodyContent;
/* Encode an HTML tag so it will be displayed as it is on the browser. Particularly, this method searches the passed in String and replace every
occurrence of the following character:
* '<' with "<"
* '>' with ">"
* '&' with "&"
* //'"' with """
* ' ' with " */
private String encodeHtmlTag(String tag) {
if (tag == null) return null;
int length = tag.length();
StringBuffer encodedTag = new StringBuffer(2 * length);
for (int i = 0; i < length; i++) {
char c = tag.charAt(i);
if (c == '<')
encodedTag.append("<");
else if (c == '>')
encodedTag.append(">");
else if (c == '&')
encodedTag.append("&");
else if (c == '"')
encodedTag.append(""");
//when trying to output text as tag's value as in
// values="???".
else if (c == ' ')
encodedTag.append(" ");
else
encodedTag.append(c);
}
return encodedTag.toString();
}
Ejemplo de manipulacin del cuerpo de
custom tag II
public void setParent(Tag t) {
}
public void setPageContext(PageContext p) {
pageContext = p;
}
public void release() {
}
public Tag getParent() {
return null;
}
public int doStartTag() {
return EVAL_BODY_BUFFERED;
}
public void setBodyContent(BodyContent bodyContent) {
this.bodyContent = bodyContent;
}
public void doInitBody() {
}
public int doAfterBody() {
String content = bodyContent.getString();
try {
JspWriter out = bodyContent.getEnclosingWriter();
out.print(encodeHtmlTag(content));
}
catch (Exception e) {}
return SKIP_BODY;
}
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
}
Ejemplo de manipulacin del cuerpo de
custom tag III
Ejemplo JSP que usa EncoderTag:
<%@ taglib uri="/myTLD" prefix="easy"%>
<easy:myTag><BR> means change line</easy:myTag>
TLD file:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag
Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name/>
<tag>
<name>myTag</name>
<tag-class>es.deusto.customtags.EncoderTag</tag-class>
<body-content>tagdependent</body-content>
</tag>
</taglib>
Clases de ayuda
Clases que implementan interfaces Tag,
IterationTag y BodyTag:
public class TagSupport implements
IterationTag, java.io.Serializable
public class BodyTagSupport extends
TagSupport implements Bodytag
Ahora slo es necesario sobre-escribir los
mtodos que quieran utilizarse en el
procesamiento de custom tags
Ejemplo con
BodyTagSupport I
package es.deusto.customtags;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class CapitalizerTag extends BodyTagSupport {
public int doAfterBody() {
String content = bodyContent.getString();
try{
JspWriter out = bodyContent.getEnclosingWriter();
out.print(content.toUpperCase());
}
catch(Exception e) {}
return SKIP_BODY;
}
}
Ejemplo con
BodyTagSupport II
JSP que utiliza CapitalizerTag:
<%@ taglib uri="/myTLD" prefix="easy"%>
<easy:myTag>See the big picture?</easy:myTag>
Fichero TLD:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP
Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name/>
<tag>
<name>myTag</name>
<tag-class>es.deusto.customtags.CapitalizerTag</tag-class>
<body-content>tagdependent</body-content>
</tag>
</taglib>
Etiquetas anidadas
Cuando dos o ms etiquetas
personalizadas estn anidadas es posible
obtener una referencia a la clase padre a
travs de findAncestorWithClass
Ejemplo:
OuterTag1 parent1 =
(OuterTag1)findAncestorWithClass(thi
s, OuterTag.class);
Variables de script
La clase Tag Extra Info (TEI) se usa para permitir
la creacin de variables de script.
Hay que definir en la clase TagExtraInfo el mtodo
getVariableInfo
Este mtodo crea un array de objetos VariableInfo
Se crear uno de estos objetos por cada variable a definir,
especificndose:
Nombre variable
Clase de la variable
Boolean indicando si habr que crear una nueva variable
Scope de la variable:
AT_BEGIN variable disponible en interior etiqueta y el
resto del JSP
NESTED variable disponible en el interior de la etiqueta
AT_END variable disponible en el resto del JSP
Ejemplo: definir un
iterador I
package es.deusto.customtags;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class IteratorTag
extends BodyTagSupport {
private
private
private
Collection collection;
Iterator iterator;
PageContext pageContext;
public void setPageContext(PageContext p) {
System.out.println("setPageContext");
pageContext = p;
}
Ejemplo: definir un
iterador II
// the setter for number
public void setCollection(Collection collection) {
this.collection = collection;
}
public int doStartTag() throws JspException {
return collection.size() > 0 ? EVAL_BODY_BUFFERED : SKIP_BODY;
}
public void doInitBody() throws JspException {
iterator = collection.iterator();
this.pageContext.setAttribute("item", iterator.next());
}
Ejemplo: definir un
iterador III
public int doAfterBody() throws JspException {
if (iterator == null) {
iterator = collection.iterator();
}
if (iterator.hasNext()) {
this.pageContext.setAttribute("item", iterator.next());
return EVAL_BODY_AGAIN;
}
else {
try {
getBodyContent().writeOut(getPreviousOut());
}
catch (java.io.IOException e) {
throw new JspException(e.getMessage());
}
return SKIP_BODY;
}
}
public void release() {
collection = null;
iterator = null;
}
}
Ejemplo: definir un
iterador IV
Definir un objeto TagExtraInfo
package es.deusto.customtags;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class IteratorTagInfo extends TagExtraInfo {
public VariableInfo[] getVariableInfo(TagData data) {
return new VariableInfo[]
{
new VariableInfo("item",
"java.lang.Object",
true,
VariableInfo.AT_BEGIN)
};
}
}
Ejemplo: definir un
iterador V
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name/>
<tag>
<name>iterate</name>
<tag-class>es.deusto.customtags.IteratorTag</tag-class>
<tei-class>es.deusto.customtags.IteratorTagInfo</tei-class>
<body-content>JSP</body-content>
<!--<variable>
<name-given>item</name-given>
<name-from-attribute>item</name-from-attribute>
<variable-class>java.lang.String</variable-class>
<declare>true</declare>
<scope>AT_BEGIN</scope>
</variable>
<attribute>
<name>id</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>-->
<attribute>
<name>collection</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Ejemplo: definir un
iterador VI
<html><head><title>An Iterator</title></head>
<%@ taglib uri="/myTLD" prefix="it"%>
<body>
<%
java.util.Vector vector = new java.util.Vector();
vector.addElement("one");
vector.addElement("two");
vector.addElement("three");
vector.addElement("four");
%>
Iterating over <%= vector %> ...
<p>
<it:iterate collection="<%=vector%>">
Item: <%= item %><br>
</it:iterate>
</p>
</body>
</html>
Custom Tags en JSP 2.0
JSP 2.0 permite la declaracin en un
fichero TLD de funciones invocables
desde cualquier JSP
JSP 2.0 define Simple Tag Handler API,
apropiada para etiquetas personalizadas
donde el cuerpo slo contenga:
Cdigo de marcado
Expresiones EL
Elementos de accin
Invocando Funciones
desde JSPs
La EL de JSP 2.0 permite invocar a un mtodo pblico de
una clase usando la siguiente sintxis:
${prefix:methodName(param1, param2, ...)}
La funcin JSP debe ser declarada en un tag library
descriptor (TLD):
<function>
<name>methodName</name>
<function-class>className</function-class>
<function-signature>
returnType methodName(param1Type,
param2Type, ...)
</function-signature>
</function>
La clase Java que lo implementa no tiene que utilizar
ninguna interfaz especial, el mtodo debe ser pblico y
esttico.
Ejemplo Funcin JSP
Revisar ejemplo en:
examples\customtag\ej7_static_fun
ction_jsp
Copiar contenido a webapps\myapp
Ejecutar:
http://localhost:8080/ej7_static_funct
ion_jsp/TestFunction.jsp
Ejemplo Simple Tag
Una tag simple debe implementar la interfaz
javax.servlet.jsp.tagext.SimpleTag
Hay que aadir elementos setter por cada atributo e
implementar doTag
La clase javax.servlet.jsp.tagext.SimpleTagSupport
implementa la interfaz
Slo se invoca un mtodo no tres como antes: doStartTag(),
doAfterBody(), doEndTag()
IMPORTANTE: los elementos de scripting no se
permiten en el cuerpo del elemento siempre que la
custom tag utilice un simple tag handler
Revisar ejemplo
customtag\ej8_simpletag\ej8_simpletag
Ejemplo Simple Tag
package com.mycompany.mylib;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class PollTag extends SimpleTagSupport {
private String question;
private Map answers;
private String votesMapName;
private String answersMapName;
public void setQuestion(String question) {
this.question = question;
}
public void setAnswers(Map answers) {
this.answers = answers;
}
public void setVotesMapName(String votesMapName) {
this.votesMapName = votesMapName;
}
public void setAnswersMapName(String answersMapName) {
this.answersMapName = answersMapName;
}
Ejemplo Simple Tag
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
JspFragment body = getJspBody();
getJspBody();
if (body != null) {
out.println("<p>");
body.invoke(null);
out.println("</p>");
}
out.print("Question:"); out.print(question); out.println("<br>");
out.println("<form action=\"result.jsp\" target=\"result\">");
out.print("<input type=\"hidden\" name=\"question\" value=\"");
out.print(question); out.println("\">");
out.print("<input type=\"hidden\" name=\"votesMapName\" value=\"");
out.print(votesMapName); out.println("\">");
out.print("<input type=\"hidden\" name=\"answersMapName\" value=\"");
out.print(answersMapName); out.println("\">");
Iterator i = answers.keySet().iterator();
while (i.hasNext()) {
String key = (String) i.next();
String value = (String) answers.get(key);
out.print("<input type=\"radio\" name=\"vote\" value=\"");
out.print(key); out.print("\">"); out.print(value); out.println("<br>");
}
out.println("<input type=\"submit\" value=\"Vote\">");
out.println("</form>");
}
}
Ficheros Tag en JSP 2.0
JSP 2.0 permite desarrollar una accin
propietaria como un fichero de tag (tag
file).
Un tag file es un fichero de texto donde se
utilizan elementos JSP para todas las
partes dinmicas
Tiene la misma funcionalidad que un Tag
Handler
Se diferencia de un JSP en que:
Tiene extensin .tag
Usa una directiva tag en vez de page
Permite especificar entrada y salida con
directivas vlidas slo en tag files.
Ejemplo de Fichero de
Tag
<%@ tag body-content="empty" %>
<%@ attribute name="question" required="true" %>
<%@ attribute name="answers" required="true"
type="java.util.Map" %>
<%@ attribute name="votesMapName" required="true" %>
<%@ attribute name="answersMapName" required="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Question: ${question}<br>
<form action="result.jsp" target="result">
<input type="hidden" name="question" value="${question}">
<input type="hidden" name="votesMapName" value="${votesMapName}">
<input type="hidden" name="answersMapName" value="${answersMapName}">
<c:forEach items="${answers}" var="a">
<input type="radio" name="vote" value="${a.key}">${a.value}<br>
</c:forEach>
<input type="submit" value="Vote">
</form>
Explicacin Fichero Tag
La directiva tag es similar a page
Declara caractersticas generales del fichero.
Su atributo body-content indica:
La directiva attribute declara atributos vlidos para la
accin definida
empty el elemento XML representando la accin no tiene
cuerpo
scriptless el cuerpo no puede contener cdigo Java
tagdependent el contenedor pasa el cuerpo al evaluador de la
tag
Su atributo type indica el tipo de datos, por defecto String
Los Map de respuestas y votos y las preguntas son
codificados como campos hidden en el formulario, para as
poderse transferir a la pgina procesando los votos
Pgina Procesando Votos
<%@ page contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Poll Results</title>
</head>
<body bgcolor="white">
<c:set target="${applicationScope[param.votesMapName]}"
property="${param.vote}"
value="${applicationScope[param.votesMapName][param.vote] + 1}" />
<p>
Question: ${param.question}<br>
<c:forEach items="${applicationScope[param.answersMapName]}"
var="a">
${a.key}) ${a.value}:
${applicationScope[param.votesMapName][a.key]}<br>
</c:forEach>
</p>
</body>
</html>
Utilizando el poll tag
<%@ page contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>
<html>
<head>
<title>My Page</title>
</head>
<body bgcolor="white">
<jsp:useBean id="myAnswers" scope="application"
class="java.util.TreeMap">
<c:set target="${myAnswers}" property="1" value="Yes" />
<c:set target="${myAnswers}" property="2" value="No" />
<c:set target="${myAnswers}" property="3" value="Maybe" />
</jsp:useBean>
<jsp:useBean id="myVotes" scope="application"
class="java.util.HashMap" />
...
<p>
<my:poll question="Will you start using tag files?"
answers="${myAnswers}"
answersMapName="myAnswers" votesMapName="myVotes" />
</p>
...
</body>
</html>
Ejercicios
Ejecutar los ficheros
1.
2.
3.
4.
ejtag1_hola.jsp
ejtag2_hola.jsp
ejtag3_hola.jsp
(Etiqueta sin atributos ni cuerpo)
(Etiqueta con atributos)
(etiqueta con atributos y cuerpo)
Comprobar el contenido del fichero web.xml
Comprobar el contenido del fichero
etiquetas.tld
Hacer una etiqueta denominada suma, que
efecte la suma de los dos nmeros pasados
como parmetros
Inclusin de la funcionalidad en una
aplicacin web
As pues, la funcionalidad de una aplicacin puede ser
integrada de tres modos:
Como cdigo Java dentro de las pginas JSP
Con el uso de JavaBeans llamados desde las pginas
JSP
Separa la interfaz de la implementacin en gran medida
Con el uso de etiquetas personalizadas
No separa la interfaz de la implementacin
Evitan la necesidad de inclusin de cualquier cdigo Java en la
pgina JSP
Un buen diseo pasa por evitar en la medida de lo
posible la primera de las tres opciones
Mantenimiento de
sesiones
Dado que el JSP se convierte en un servlet, todo lo visto
en servlets es vlido con JSP.
Uso de Interfaz HttpSession para la gestin de sesiones
El objeto session se crea automticamente en JSP
(puede suprimirse con page)
El objeto session es un diccionario al que se pueden
asociar objetos (atributos) y darles un nombre (tambin
eliminar)
Se puede recuperar la informacin desde otras
peticiones posteriores de la misma sesin
session.setAttribute(mipaquete.sesion.nombre,
miObjeto);
Clase unObjeto =
session.getAttribute(mipaquete.sesion.nombre);
Tambin se puede eliminar un objeto asociado
session.removeAttribute(mipaquete.sesion.nombre);
Proceso de autentificacin de
usuarios
Todo lo visto en servlets es aplicable en JSP
Mecanismos
Declarativo. Usa un mecanismo proporcionado
por el motor de servlets
Indicar restricciones de seguridad
Indicar el modo de realizar la autentificacin
Indicar los usuarios definidos en el sistema
Por programa
Generar formulario html para nombre y clave
Generar pgina JSP que accede a Base de Datos,
comprueba clave y se fijan los parmetros de
seguridad en el JavaBean, cuyo mbito se restringe a
la sesin que acaba de establecer el usuario
XML y JSP trabajando
juntos
Para utilizar un documento XML en una
aplicacin es preciso analizarlo
Existen dos modelos de analizadores aceptados:
Analizador de XML tipo DOM
DOM (Modelo de objetos de documento)
SAX (API simple para XML)
El analizador crea una estructura de datos en memoria
en forma de rbol, donde se coloca todos los
elementos del documento
Ofrece mtodos para acceso a los nodos y a la
informacin de los mismos a travs de una API
Analizador SAX
En lugar de crear un rbol, va leyendo el archivo XML
y ejecuta acciones segn las etiquetas encontradas.
XML y JSP trabajando
juntos
Si se desea usar un documento XML en una
aplicacin JSP habr que
Incluir el cdigo Java para la manipulacin del
documento XML
o bien incluir un JavaBean que lo manipule
o bien definir una etiqueta personalizada que
envuelva la operacin dentro de su clase
En cualquier caso se trata de manejar XML
con Java
Ej. de anlisis XML con DOM en una
pgina JSP
Veamos cmo realizar la autenticacin de
usuarios en base a un fichero XML con los datos
de autenticacin
AutenticacionBean
Entrada
Proceso
OK
login01.jsp
login02.jsp
si.html
NO
no.html
Usuarios.xml
Ej. de anlisis XML con DOM en una
pgina JSP
Supongamos el siguiente contenido de la pgina
xml de usuarios autorizados
<?xml version=`1.0` encoding=`iso-8859`?>
<usuariosAutorizados>
<usuario nombre=Agustin pwd=agustin
nivel=administrador>
</usuario>
<usuario nombre=Invitado pwd=invitado
nivel=usuario>
</usuario>
</usuariosAutorizados>
Ej. de anlisis XML con DOM en una
pgina JSP
Formulario de entrada (login01.jsp)
<form method=POST accion=login02.jsp
name=autenticacion>
<table border=0 cellpadding=0 cellspacing=0
width=200>
<tr>
<td width=50%>Nombre</td>
<td width=50><input type=text name=nombre
size=16></td>
</tr>
<tr>
<td width=50%>Contrasea</td>
<td width=50%><input type=password name=pwd
size=16></td>
</tr>
<tr>
<td width=50%> colspan=2 align=center>
<input type=submit value=Entrar size=16></td>
</tr> </table> </form>
Ej. de anlisis XML con DOM en una
pgina JSP
Autenticacin (login02.jsp)
Importacin de los paquetes para el control del
fichero XML
<%@ page import=javax.xml.parsers.* %>
Definicin de las varibles para informacin de
entorno
<%!
<%!
<%!
String
String
String
usuario=; %>
pwd=; %>
redireccionURL =; %>
Instanciacin del JavaBean responsable de mantener
informacin del usuario mientras dure la sesin
<jsp:useBean id=login scope=session
class=login.Autenticacion/>
Ej. de anlisis XML con DOM en una
pgina JSP
Recuperacin de los datos de identificacin
del usuario enviados desde el formulario
HTML de la pgina previa
if (request.getParameter(nombre)!= null)
{usuario=request.getParameter(nombre);
if (request.getParameter(pwd)!=null)
{ pwd= request.getParameter(pwd); }
Inicializacin de variables para el
procesamiento del documento XML
Document documento;
DocumentBuilderFactory.newInstance();
redireccionURL=no.html;
Ej. de anlisis XML con DOM en una
pgina JSP
Generacin del conjunto de nodos siguiendo el
modelo DOM
// Apertura del archivo
URL url=new URL(archivoXml);
InputStream datosXML=url.openStream();
// Construccin del documento XML
DocumentBuilder builder=factory.newDocumentBuilder();
documento=builder.parse(datosXML);
//Generacin de lista de nodos en base a la clave usuario
NodeList
listaNodos=documento.getElementsByTagName(usuario
);
Ej. de anlisis XML con DOM en una
pgina JSP
Comparacin de los atributos introducidos con
los existentes en el rbol
for (int i=0; i<listaNodos.getLength();i++) {
Node actNodo=listaNodos.item(i);
// para este nodo recogemos el valor del nombre y
contrasea
Element actElemento=(Element)listaNodos.item(i);
String actUsuario=actElemento.getAtribute(nombre);
String actPwd=actElemento.getAtribute(pwd);
// si el usuario es correcto le dejamos que siga
if (actUsuario.equals(usuario)&& actPwd.equals(pwd)){
redireccionURL=si.html;
Ej. de anlisis XML con DOM en una
pgina JSP
//Actualizamos el bean para indicar que el usuario ya est
autorizado
logon.setNombre(usuario);
logon.setAutorizado();
break bucle();
}
}
Cdigo JavaScript que permite el reenvo de una
pgina a otra, de forma que se pueda presentar al
visitante la pgina adecuada dependiendo de que
haya sido posible la autenticacin o no
<script language=javascript>
setTimeout(document.location=`<%= redireccionURL
%>`,100)
</script>
Ej. de anlisis XML con DOM en una
pgina JSP
Control de la sesin
El JavaBean Autenticacion.java lleva a cabo el
control
Es posible comprobar en cada pgina web si el
usuario est autorizado llamando al JavaBean
Los mtodos set de las propiedades nombre y clave
se invocan desde las pginas de control de la lgica
de aplicacin (login02.jsp) una vez que el usuario ha
sido validado
Los mtodos get devuelven objetos String con la
identificacin y la autorizacin del usuario
Ej. de anlisis XML con DOM en una
pgina JSP
package login;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class Autenticacion {
// Propiedad "nombre" del bean, que corresponde al
nombre
// del usuario para el que se implementa el bean
String nombre = "";
// Variable de clase que indica si el usuario para el
// que se crea el bean en la sesin que ha
establecido
// con el servidor est identificado ante el sistema
y se
// le concede autorizacin
boolean autorizado = false;
Ej. de anlisis XML con DOM en una
pgina JSP
// Mtodos get() y set() de la propiedad "nombre"
public String getNombre() {
return( nombre );
}
public void setNombre( String _nombre ) {
nombre = _nombre;
}
// Mtodos get() y set() de la variable de clase que
controla
// la autenticacin del usuario ante el sistema
public void setAutorizado() {
autorizado = true;
}
public boolean getAutorizado() {
return( autorizado );
} }
Qu se ha visto en esta
sesin
Primer vistazo a la tecnologa JSP
1.
Qu es y para qu sirve JSP
Primer ejemplo Hola Mundo y la fecha
Uso de objetos implcitos y ejemplo
Elementos bsicos de una pgina JSP
Directivas <%@ (page | include | taglib)
Cdigo Java <% (declaraciones | java |
expresiones)
Acciones estndar <jsp:accin (include |forward
| usebean| getproperty | setproperty)
Elementos Avanzados de una pgina JSP
Acciones personalizadas (etiquetas)
2.
3.
Definicin de la estructura (biblioteca.tld y sta en
web.xml)
Nombre, clase controladora , atributos, cuerpo, etc.
Definicin de la funcionalidad (JavaBean que deriva de
taglib)
Declaracin en pgina con <%@taglib y uso posterior
Principales conclusiones de
diseo
La tecnologa JSP permite diseo de aplicaciones web con
generacin dinmico de pginas web tras un
procesamiento
La lgica de la aplicacin (procesamiento) se invoca desde
una pgina html mediante tres posibles modos
1.
2.
1.
2.
3.
Para realizar un buen diseo que separe interfaz de lgica
no se debe incluir directamente el cdigo Java . De este
modo estn separadas las funciones:
3.
4.
Inclusin de cdigo Java
Invocacin de objetos (JavaBeans) que implementen la lgica
Invocacin de etiquetas personalizadas que implementen la
lgica
Diseador de interfaces (JSP sin cdigo Java -> html y marcas)
Programador de la lgica de la aplicacin (JavaBeans que
implementan la funcionalidad)
Una pgina JSP se transforma automticamente en un
servlet. La ventaja es que el diseo de la interfaz no se
mezcla con la programacin en Java
Java Server
Pages (JSP)
Fin de la
sesin
180