SlideShare una empresa de Scribd logo
1 de 73
Descargar para leer sin conexión
Samuel Marrero Lorenzo -
smarlor@iespana.es 1
J2EE – Java Server Pages
JSP
2
Introducción Servlets - JSP
En los servltes vistos anteriormente:
el texto generado para el aspecto (vista) de la interfaz
gráfica (HTML,WML, etc.) está mezclado con código Java
No es posible usar herramientas de generación de HTML,
etc. directamente
La generación del texto necesita ser escrita por una persona
con conocimientos de Java => económicamente muy
costoso
Cambios al aspecto de la interfaz gráfica requieren
recompilación, creación de un nuevo fichero .war y
rearranque del servidor
En una aplicación web, especialmente en Internet, los
cambios a la interfaz gráfica son muy frecuentes
3
Introducción Servlets – JSP
(2)
Situación a la que queremos llegar
Separación de roles
Personas que realizan el aspecto gráfico => diseñadores
gráficos o similares
Conocimientos de diseño gráfico y herramientas para
generación de HTML y WML
Personas que implementan el controlador y el modelo
=>programadores
Conocimientos de diseño e implementación
Se deberían poder usar directamente las herramientas de
diseño de páginas web
Las actualizaciones al aspecto gráfico no deben provocar un
re-arranque del servidor
4
JSP
¿ Qué es JSP ?
A modo de ejemplo, una página JSP que genera HTML
Tiene el aspecto de una página HTML
Puede incluir scriptlets (scripts) para generar HTML dinámicamente
Típicamente los scriptlets se escriben en Java
En realidad, una página JSP es un tipo especial de servlet
(javax.servlet.jsp y javax.servlet.jsp.tagext) orientado a
generar el texto de la interfaz gráfica
Invocables por GET y POST
<<interface>>javax.servlet.Servlet
<<interface>> javax.servlet.jsp.JspPage
<<interface>>javax.servlet.jsp.HttpJspPage
+ _jspService(request : HttpServletRequest, response :
HttpServletResponse) : void
5
JSP (2)
¿ Qué ocurre cuando se accede a una página
JSP ?
Si es la primera vez, el servidor de aplicaciones
genera un servlet (que implementa
javax.servlet.jsp.HttpJspPage) a partir de la
página JSP, lo compila y lo carga en memoria
Si no es la primera vez, le pasa la petición al
servlet (ya compilado y creado en memoria)
Si la página se ha modificado desde la última
compilación, el servidor se da cuenta, genera el
nuevo servlet, lo compila y lo carga de nuevo
6
Primer ejemplo de JSP
<%@page language="java"%> directiva
<HTML> HTML
<HEAD>
<TITLE>Primer ejemplo JSP</TITLE>
</HEAD>
<BODY>
<%if(request.getParameter("nombre")==null){%> scriptlet
<H1>Hola Mundo</H1>
<%}else {%>
<H1>Hola <%=request.getParameter("nombre")%></H1>
<%}%> Expresión
</BODY>
</HTML>
Código: c:javaJSP1-HolaMundoHolaMundoHolaMundo.jsp
7
Servlet generado por el servidor
Tomcat a partir del código JSP
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class HolaMundo_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static java.util.Vector _jspx_dependants;
public java.util.List getDependants() {
return _jspx_dependants;
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,true, 8192, true);
8
Servlet generado por el servidor
Tomcat a partir del código JSP
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("rn"); out.write("rn"); out.write("<HTML>rn"); out.write("<HEAD>rn"); out.write("<TITLE>Primer ejemplo JSP</TITLE>rn");
out.write("</HEAD>rn"); out.write("<BODY>rn"); out.write("rn");
if(request.getParameter("nombre")==null){
out.write("rn"); out.write("rn");
out.write("t<H1>Hola Mundo</H1>rn");
out.write("rn");
}else {
out.write("rn");
out.write("rn");
out.write("t<H1>Hola ");
out.print(request.getParameter("nombre"));
out.write("</H1>rn");
out.write("rn");
}
out.write("rn"); out.write(" trn"); out.write("</BODY>rn"); out.write("</HTML>");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
9
Expresiones
Expresión JSP: <%= expression %>
La expresión es evaluada y situada en la salida.
<%=request.getParameter(“nombre”)%>
Escribe en la salida el parámetro ‘nombre’ del objeto petición
‘request’
El equivalente XML es
<jsp:expression> expression </jsp:expression>.
Las variables predefinidas son request, response, out,
session, application, config, y pageContext.
10
Scriptlets
Scriptlet JSP: <% código Java %>
El código se inserta en el método
service del servlet generado
El equivalente XML es:
<jsp:scriptlet>código</jsp:scriptlet>
11
JSP1-HolaMundo
Scriptlets
<%if(request.getParameter("nombre")==null)
{
out.println(“<H1>Hola Mundo</H1>”);
}else {
out.println(“<H1>Hola”+
request.getParameter("nombre")+”</H1>”);
}
%>
Fíjate que aquí se utiliza en objeto out para escribir la salida,
equivalente al PrintWriter usado en servlets
El código está disponible en el directorio JSP1-HolaMundo
c:javaJSP1-HolaMundoHolaMundoHolaMundo.jsp
12
Declaraciones
Declaración JSP: <%! Código Java %>
El código se inserta en el cuerpo de la
clase del servlet generado, fuera del
método service, como un atributo de la
clase servlet.
El equivalente XML es:
<jsp:declaration>código</jsp:declaration>
13
Ejemplo de declaración
El siguiente ejemplo implementa un
contador de visitas a una página
<%! private int accesos = 0; %>
Visitas a la página desde el arranque del servidor
<%= ++accesos %>
14
Directiva page
Directiva page JSP: <%@ page atributo=“valor" %>
Dirige al motor servlet sobre la configuración general.
El equivalente XML es: <jsp:directive.page language=“java">.
Los atributos legales son (con los valores por defecto en negrita):
import="package.class"
contentType="MIME-Type"
isThreadSafe="true|false"
session="true|false"
buffer="sizekb|none"
autoflush="true|false"
extends="package.class"
info="message"
errorPage="url"
isErrorPage="true|false"
language="java"
15
La directiva page (2)
import="paquete.clase1,...,paquete.claseN".
Por ejemplo: <%@ page import="java.util.*" %> El atributo import es el
único que puede aparecer múltiples veces.
contentType="MIME-Type; charset=Character-Set" Esto especifica
el tipo MIME de la salida. El valor por defecto es text/html.
Por ejemplo, la directiva: <%@ page contentType="text/plain" %> tiene el
mismo valor que el scriptlet <% response.setContentType("text/plain");
%>
isThreadSafe="true|false". Un valor de true (por defecto) indica un
procesamiento del servlet normal, donde múltiples peticiones pueden
procesarse simultáneamente con un sólo ejemplar del servlet.
Un valor de false indica que el servlet debería implementar
SingleThreadModel, con peticiones enviadas serialmente.
16
La directiva page (3)
session="true|false". Un valor de true (por defecto) indica que la
variable predefinida session (del tipo HttpSession) es la sesión si existe,
si no existe, se crea una nueva sesión.
Un valor de false indica que no se usarán sesiones, y los intentos de
acceder a la variable session resultarán en errores en el momento en que la
página JSP sea traducida a un servlet.
buffer="sizekb|none". Esto especifica el tamaño del buffer para el
JspWriter out. El valor por defecto es específico del servidor, debería
ser de al menos 8kb.
autoflush="true|false". Un valor de true (por defecto) indica que el
buffer debería descargase cuando esté lleno. Un valor de false,
raramente utilizado, indica que se debe lanzar una excepción cuando el
buffer se sobrecargue. Un valor de false es ilegal cuando usamos
buffer="none".
17
La directiva page (4)
extends="paquete.superclase". Esto indica la superclase del servlet
que se va a generar. Debemos usarla con extrema precaución, ya que
el servidor podría utilizar una superclase personalizada.
info="message". Define un string que puede usarse para ser
recuperado mediante el método getServletInfo.
errorPage="url". Especifica una página JSP que se debería procesar si
se lanzará cualquier Throwable pero no fuera capturado en la página
actual.
isErrorPage="true|false". Indica si la página actual actúa o no como
página de error de otra página JSP. El valor por defecto es false.
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 opción
legal.
18
Ejemplo JSP2 - TablaHTML
En el siguiente ejemplo se muestra la
construcción en JSP de una tabla de los
valores trigonométricos
Código TablaHTML.jsp: c:javaJSP2-
TablaHTMLTablaHTMLTablaHTML.jsp
Claves:
<%@ page import="java.io.*,java.text.*,java.util.*" %>
<%! private static final DecimalFormat FMT1 = new DecimalFormat("#0");%>
<% for (double gdo = 0; gdo <= 45; gdo += 1.0) { %> …
19
Directiva include
Directiva include JSP:
<%@ include file="url" %>
Un fichero del sistema local se incluirá cuando
se traduce de JSP a servlet.
El equivalente XML es:
<jsp:directive.include file="url">.
La URL debe ser relativa.
Usamos la acción jsp:include para incluir un
fichero en el momento de la petición en vez
del momento de la tradución.
20
Comentarios
Comentario JSP: <%-- comment --%>
Comentario ignorado cuando se traduce
la página JSP en un servlet.
Si queremos un comentario en el HTML
resultante, usamos la síntaxis de
comentario normal del HTML <--
comment -->.
21
Objetos implícitos en páginas
JSP
Objeto application Se corresponde con el ServletContext
obtenido mediante getServletConfig().getContext().
Objeto request HttpServletRequest, objeto proveniente de
la petición del cliente o de una redirección
Objeto response HttpServletResponse, objeto que
representa la respuesta
Objeto session HttpSession asociado con el request (si
existe una sesión)
Objeto out el PrintWriter (una versión con buffer del tipo
JspWriter) usada para envíar la salida al cliente (navegador).
22
Convenciones en JSP
Surge la siguiente cuestión:
"¿Cómo estructuramos el código JSP
para que sea fácil de leer, de escribir y
de mantener? “
23
Ficheros y su localización
Tipo de Fichero Extensión Localización Recomendada
JSP .jsp <contexto>/<subsystem path>/
Fragmento JSP .jsp <contexto>/<subsystem path>/
Fragmento JSP .jspf <contexto>/WEB-INF/jspf/<subsystem path>/
CCS .css <contexto>/css/
javascript .js <contexto>/js/
página HTML .html <contexto>/<ruta>/
fuente web .gif, .jpg, etc. <contexto>/images/
TLD .tld <contexto>/WEB-INF/tld/
24
Acceso a base de datos desde
JSP
JSP utiliza JDBC para acceder a base de
datos.
No necesita etiquetas especiales para
acceder a base de datos.
25
JSP con el código de acceso a
BD incrustado
Uso de scritplets que utilizan JDBC para
acceder a la BD.
No es necesaria la captura de
excepciones, JSP hace el trabajo
automáticamente.
Cuando recuperamos resultados de una
consulta aparecerá código HTML dentro
del bucle para ir mostrando cada fila.
26
Ejemplo JSP4-JDBC
Esta aplicación crea una conexión con la base
de datos ‘agenda’ y lista todos los contactos
de la tabla ‘Contactos’
MostrarTodos.jsp:
Código: c:javaJSP4-JDBCMostrarTodos.jsp
El driver JDBC de la base de datos tiene que estar
incluído en el directorio <contexto>/WEB-INF/lib
Los scriptlets de Java en este ejemplo están
mezclados con el código HTML haciendo difícil
el manejo y mantenimiento de esta aplicación
27
Optimización del diseño de las
aplicaciones
Objetivo: separar en capas la lógica de las
aplicaciones
Vista: en páginas JSP
Modelo: para el modelo y la lógica de negocio se
van a utilizar JavaBeans y clases Java
A este modelo se le conoce como Modelo 1, y
es el primer paso para llegar al modelo MVC
Más adelante veremos el Modelo 2 que
además proporciona el control de la
aplicación de forma separada. En ocasiones
también denominado MVC
28
Modelo 1: Acceso a través de
Beans
Una forma habitual de utilizar BD con JSP es utilizar
componentes JavaBean de apoyo.
De esta forma mantenemos independiente la
presentación y el acceso a datos, esto es fundamental
para facilitar el mantenimiento de la aplicación.
29
Introducción a JavaBeans
¿Qué es un JavaBean?
Un JavaBean es una clase Java
Representa un objeto del modelo, por
ejemplo un cliente
Proporciona métodos para leer y modificar
sus variables o atributos
<tipo> getAtributo () {…}
void setAtributo (<tipo> valor) {...}
30
Proceso para recuperar datos
a través de un JavaBean
El Bean se encarga de conectar con la BD y
ejecutar la sentencia deseada.
El bean proporciona métodos para
posicionarse en cada fila de la consulta.
A través de las propiedades del JavaBean
podemos acceder a los valores de cada uno
de los campos.
Las propiedades de un JavaBean se
representan muy fácilmente en una página
JSP.
31
Acción jsp:useBean
Acción jsp:useBean
<jsp:useBean at1=val1 at2=val2 …/>
<jsp:useBean atri=val*> ... </jsp:useBean>
Encuentra o construye un Java Bean. Los
posibles atributos son:
id="name"
scope="page|request|session|application"
class="package.class"
type="package.class"
beanName="package.class"
32
Acción jsp:setProperty
Acción jsp:setProperty:
<jsp:setProperty atrib=val …/>
Modifica las propiedades del bean, bien
directamente o designando el valor que viene
desde un parámetro de la petición.
Los atributos legales son:
name=“nombre del bean"
property=“propiedad del bean|*"
param=“nombre del parámetro"
value=“valor"
33
Acción jsp:getProperty
Acción jsp:getProperty:
<jsp:getProperty
name=“nombrePropiedad" value="valor"/>
Recupera y saca las propiedades del
Bean.
34
Ejemplo de utilización de
<jsp:useBean>
Ejemplo de uso:
<jsp:useBean id="pool" scope="application"
class="Clientes.Pool"/>
En este ejemplo se obtiene o crea el
objeto ‘pool’, con ámbito de aplicación y
a partir del JavaBean Pool del paquete
Clientes
35
Estructura del JavaBean para
acceso a BD
Constructor del JavaBean:
conexión con la base de datos.
realización de la consulta.
Guardar resultados en una estructura local al Bean.
establecer los valores de las propiedades.
cerrar la conexión.
Método para recorrer los resultados.
Recargando las propiedades cada vez que cambie.
Propiedades se corresponden con los campos
de la tabla.
36
Ejemplo Modelo 1.
JSP5-JDBC-CliPool
Este ejemplo de aplicación web utiliza un
JavaBean y clases Java que permiten
recuperar resultados de una BD, usando un
pool de conexiones.
Vista: varias páginas JSP
Modelo: clases Java
BDClientes: realiza las consultas y acciones en la BD
Cliente: JavaBean que representa el objeto Cliente del
modelo
Pool: Es el objeto que conecta con la base de datos y
permite obtener la conexión cuando sea solicitada
37
Ejemplo Modelo 1.
JSP5-JDBC-CliPool (2)
Clase BDClientes, métodos estáticos:
obtenerClientes(): hace la consulta sobre la BD y
guarda resultados en un vector interno, para
visualizar en JSP.
obtenerCliente(): crea un objeto cliente a partir de
su identificador para pasarlo a la página JSP.
insertarCliente(): inserta un nuevo cliente dado
por el usuario en una página JSP.
eliminarCliente(): elimina un cliente dado por el
usuario en una página JSP.
38
Ejemplo Modelo 1.
JSP5-JDBC-CliPool (3)
Clase Cliente, JavaBean:
Contiene las propiedades de un cliente y los
métodos getProp y setProp
Clase Pool, JavaBean:
Constructor: crea un objeto DataSource para la
conexión con la BD ‘agenda’
getConnection: obtiene una conexión a partir de la
asociación de conexiones
freeConnection: cierra la conexión, devolviéndola
a la asociación de conexiones
39
Ejemplo JSP5-JDBC-CliPool
Modelo
Modelo: código de las clases Java:
Clase BDClientes: c:javaJSP5-JDBC-
CliPoolCliPoolWEB-
INFsrcClientesBDClientes.java
Clase Cliente: c:javaJSP5-JDBC-
CliPoolCliPoolWEB-INFsrcClientesCliente.java
Clase Pool: c:javaJSP5-JDBC-
CliPoolCliPoolWEB-INFsrcClientesPool.java
40
Ejemplo JSP5-JDBC-CliPool
Vistas (2)
Vista: código de las páginas JSP
index.jsp: c:javaJSP5-JDBC-CliPoolCliPoolindex.jsp,
presenta el formulario para agregar un contacto de cliente
InsertarCliente.jsp: c:javaJSP5-JDBC-
CliPoolCliPoolInsertarCliente.jsp, inserta un cliente
EliminarCliente.jsp: c:javaJSP5-JDBC-
CliPoolCliPoolEliminarCliente.jsp, elimina un cliente
MostrarClientes.jsp: c:javaJSP5-JDBC-
CliPoolCliPoolMostrarClientes.jsp, muestra los clientes
VerCliente.jsp: c:javaJSP5-JDBC-
CliPoolCliPoolVerCliente.jsp, visualiza un cliente
41
Ejemplo JSP5-JDBC-CliPool
Ficheros de configuración
web.xml: c:javaJSP5-JDBC-CliPoolCliPoolWEB-INFweb.xml
Fragmento de código a insertar en server.xml, entre las etiquetas
<Host>
<Context path="/JSP5-JDBC-CliPool" docBase="/JSP5-JDBC-
CliPool/CliPool" debug="0" reloadable="true" crossContext="true">
<Resource name="jdbc/dsAgenda"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/dsAgenda">
…Parametros…
</Context>
42
Ejemplo JSP5-JDBC-CliPool
Ficheros de configuración (2)
Parámetros de conexión en server.xml
<parameter>
<name>username</name>
<value>curso_java</value>
</parameter>
<parameter>
<name>password</name>
<value>curso_java</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@10.1.1.36:1521:DESA</value>
</parameter>
</ResourceParams>
43
Limitaciones del Modelo 1
Tiene cierta separación entre contenido y
presentación, por lo que es buena para pequeñas
aplicaciones Web.
El hecho que la lógica de presentación normalmente
conduzca a una considerable cantidad de código Java
embebido en el JSP en el formato de scriptlets, hace
que sea una pesadilla para los desarrolladores Java
experimentados el mantenimiento de estos sistemas.
Fíjate que en el Modelo 1, JSP es responsable de:
Procesar la petición y la respuesta al cliente (lógica de
presentación)
Problema sobretodo para los diseñadores de páginas JSP
que no programan código en Java
44
Arquitectura del Modelo 2
45
Componentes en el Modelo 2
Se implementa al igual que en el Modelo 1,
la vista con páginas JSP
el modelo con clases Java o JavaBeans
En el Modelo 2 además se implementa un
sistema de controladores (MVC)
En éste modelo, un controlador maneja las
solicitudes del usuario, en lugar de lidiar con otro
JSP.
El controlador o “controller” es implementado
como un servlet.
46
Misión del servlet Controlador
Aquí el servlet actúa como el
Controlador y está al cargo
del procesamiento de las peticiones
de la creación de cualquier JavaBean u
objeto usado por el JSP
así como, dependiendo de las acciones del
usuario, a qué página JSP redirigir la
petición
47
Pasos en el Modelo 2
Los siguientes pasos son ejecutados cuando el usuario envía
una solicitud:
1. El servlet Controlador atiende la solicitud.
2. El servlet Controlador instancia el JavaBeans apropiado,
basado en los parámetros de la solicitud.
3. El JavaBeans se comunica con la base de datos para retirar
los datos requeridos.
4. El Controlador ajusta el JavaBeans resultante, en uno de los
siguientes contextos: request, session o aplicación.
5. El Controlador entonces despacha la solicitud a la siguiente
vista basado en la URL solicitante.
6. La vista usa el JavaBeans del paso 3, para desplegar los
datos.
48
Ejemplo de Modelo 2
Esta pequeña aplicación ejemplifica el
uso del Modelo 2
Descripción:
Tienda en Internet de venta de cd’s
El usuario dispone de un carrito de compra
donde se almacenan, usando una sesión,
los cd’s que este compra
49
Ejemplo de Modelo 2
Componentes
Los componentes son:
Modelo: un JavaBean que representa el
objeto del negocio CD.java
Controlador: un servlet ServletCompra.java
que realiza las redirecciones a las vistas y
la creación de los Beans necesarios
Vista: varios ficheros .jsp que permiten al
usuario interactuar con la aplicación
50
Ejemplo JSP8-Modelo2
Modelo: CD.java
Es una clase java que representa un CD de
música con las propiedades siguientes:
Album, artista, país, precio, cantidad
Métodos: como en todo JavaBean se
proporcionan los métodos getXXX y setXXX
Código: c:javaJSP8-Modelo2WEB-
INFsrcshoppingcd.java
51
Ejemplo JSP8-Modelo2
Controlador: ServletCompra.java
Comprueba la acción a realizar
Realiza la acción insertando los valores
necesarios en la sesión, si existe
Redirige la salida a la vista adecuada
52
Ejemplo JSP8-Modelo2
Funcionamiento del controlador
ServletCompra.java:
Acción ‘Agregar’: Añade el cd seleccionado a la
sesión y redirige la salida a Tienda.jsp
Acción ‘Borrar’: Borra el cd seleccionado de la
sesión y redirige a Tienda.jsp
Acción ‘Comprar’: Calcula el total y redirige a
Comprar.jsp
Código: c:javaJSP8-Modelo2WEB-
INFsrcServletCompra.java
53
Ejemplo JSP8-Modelo2
Vistas: son las páginas JSP
Tienda.jsp: página de entrada, muestra el
catálogo de CD’s disponibles
c:javaJSP8-Modelo2Tienda.jsp
Carrito.jsp: esta página se incluye en la anterior y
muestra los cd’s que el usuario ha ido metiendo
en el carrito
c:javaJSP8-Modelo2Carrito.jsp
Comprar.jsp: muestra el contenido del carrito y el
total a pagar cerrando la sesión
54
Ventajas del Modelo 2
Como no hay lógica de presentación en el
JSP, no hay necesidad de demasiados
scriptlets.
Se pueden tener múltiples controladores en la
aplicación Web,
aunque normalmente, se suele usar 1 solo.
Las aplicaciones Web son más sencillas de
mantener y extender, ya que las vistas no
refieren unas a otras, y no hay lógica de
presentación en ellas.
55
Acción jsp:include
Acción jsp:include:
<jsp:include page="relative URL" flush="true"/>
Incluye un fichero en el momento en que la
página es solicitada.
Aviso: en algunos servidores, el fichero
incluido debe ser un fichero HTML o JSP,
según determine el servidor (normalmente
basado en la extensión del fichero).
56
Acción jsp:forward
Acción jsp:forward
<jsp:forward page="URL relativa"/>
Reenvía la petición a otra página.
57
Acción jsp:plugin
Acción jsp:plugin:
<jsp:plugin attribute="value"*> ...
</jsp:plugin>
Genera etiquetas OBJECT o EMBED,
apropiadas al tipo de navegador,
pidiendo que se ejecute un applet
usando el Java Plugin.
58
Tags personalizadas
En las páginas JSP se usa código HTML, XML, Java e
incluso se usan etiquetas que encapsulan parte de la
lógica.
El uso de la etiqueta <jsp:useBean> en conjunción
con los JavaBeans hace que podamos separar la
lógica de presentación de la de proceso y
consigue unos archivos JSP mas claros,
y lo que es mas importante, el que escribe la JSP, no tiene
por que tener unos conocimientos avanzados de
programación para crear páginas JSP de funcionalidades
avanzadas.
59
Tipos de etiquetas
Hay dos tipos principales de etiquetas,
etiquetas que no tienen cuerpo. Ejemplo:
<img src=“canteras.gif”>
etiquetas que si lo tienen. Ejemplo:
<title>Las Canteras</title> que tiene
cuerpo y etiqueta de final.
Estos son dos tipos de etiquetas que
podemos crear en Java
60
Etiquetas personalizadas JSP
JSP sigue una sintáxis XML por lo tanto
Etiquetas sin cuerpo: <jsp:etiqueta/>
Etiquetas con cuerpo: <jsp:etiqueta> … </jsp:etiqueta>
Para crear etiquetas a medida debemos implementar
o heredar de otras clases
Interface Tag  interface general
Clase TagSupport  creación de etiquetas sin cuerpo
Clase BodyTagSupport  creación de etiquetas con cuerpo
En los ejemplos siguientes trabajaremos extendiendo
la clase TagSupport y BodyTagSupport que son
simplificaciones del interface Tag
61
Clase TagSupport
Las clase TagSupport suministra una serie de
métodos que sobreescribiremos para crear
una etiqueta. Estos son algunos:
doStartTag(): se invoca cuando se encuentra la
etiqueta de apertura
doEndTag(): se invoca cuando se encuentra la
etiqueta de cierre
doAfterBody(): se invoca una vez se ha obtenido
el contenido del cuerpo, cuando éste existe
62
Primer ejemplo JSP6-
HolaMundoTag
Diseñaremos una etiqueta sin cuerpo que
escribirá el mensaje “Hola Mundo” en el
cliente:
<JSP6:holamundo/>
Siguiendo la sintáxis XML, de documentos bien
formateados
Código y configuración:
Clase de la etiqueta: c:javaJSP6-
HolaMundoTagWEB-
INFsrcejemplosHolaMundoTag.java
63
JSP6-HolaMundoTag
Ficheros de configuración:
Definir el descriptor de librería de etiquetas
(Tag Library Descriptor) o TLD, en este
caso JSP6.tld: c:javaJSP6-
HolaMundoTagWEB-INFJSP6.tld
web.xml: c:javaJSP6-
HolaMundoTagWEB-INFweb.xml
64
Tag Library Descriptor (TLD)
JSP6.tld
Este fichero de configuración, situado en
<contexto>/WEB-INF, describe el formato del
conjunto de las etiquetas una librería.
En este caso la librería recibe el nombre de ‘JSP6’ y
describe una etiqueta de nombre ‘holamundo’
<tag>
<name>holamundo</name>
<tagclass>HolaMundoTag</tagclass>
<bodycontent>empty</bodycontent>
<info>Saludo</info>
</tag>
65
JSP6-HolaMundo
web.xml
El descriptor de despliegue de la aplicación
JSP6-HolaMundo: web.xml
Asigna un uri a la localización de la librería,
para poder referirnos a ella en las páginas
JSP, en este caso mediante el uri = ‘/JSP6’
<taglib>
<taglib-uri>/JSP6</taglib-uri>
<taglib-location>/WEB-INF/JSP6.tld
</taglib-location>
</taglib>
66
JSP6-HolaMundo
HolaMundo.jsp
HolaMundo.jsp: c:javaJSP6-
HolaMundoTagHolaMundo.jsp
<!-- HolaMundo.jsp -->
<%@ taglib uri="/JSP6" prefix="JSP6"
%>
<HTML>
<HEAD>
<TITLE>Tag Hola Mundo</TITLE>
</HEAD>
<JSP6:holamundo/>
</BODY>
</HTML>
67
Página HolaMundo.jsp
Directiva taglib
Una directiva taglib declara las librerías de etiquetas
usadas por el JSP. Un directiva corta se declara en
una sola línea. Si tenemos varias directivas taglib se
deben almacenar juntas en la misma localización
dentro del cuerpo JSP:
<%@ taglib uri=“/JSP6" prefix=“JSP6" %>, en este ejemplo
Sólo deberíamos importar librerías de etiquetas que
realmente se van a utilizar en la página JSP.
Desde JSP 1.2, esta altamente recomendado utilizar
la JSP Standard Tag Library en nuestra aplicación
web para reducir la necesidad de scriptlets JSP en
nuestras páginas. Las páginas que usan JSTL son, en
general, más fáciles de leer y de mantener.
68
Constantes de las etiquetas
personalizadas
SKIP_BODY : indica en el método que la
etiqueta no tiene cuerpo o que no quiere
seguir evaluándolo
EVAL_PAGE : indica en el método doEndTag()
que se procede a evaluar el resto de la
página JSP
SKIP_PAGE : indica que no se siga evaluando
la página JSP
EVAL_BODY_AGAIN: indica que se vuelva a
evaluar el cuerpo, en caso de bucles
69
Etiquetas personalizadas con
parámetros
Vamos a ver una etiqueta con parámetros del
tipo
<JSP6:suma num1=2 num2=3/>, que suma los
números 2+3
Por cada parámetro que queremos que
soporte la etiqueta, se proporciona un
método set como en un javabean
El código de la clase SumaTag lo veremos a
continuación
70
SumaTag.java
Esta etiqueta no tiene cuerpo por lo que será
igual que la anterior excepto que se añaden
los métodos set
Código: c:javaJSP6-HolaMundoTagWEB-
INFsrcejemplosSumaTag.java
Mediante los métodos set los valores de los
parámetros son cargados automáticamente
en la clase
71
Modificación del Tag Library
Descriptor (TLD)
JSP6.tld: c:javaJSP6-HolaMundoTagWEB-
INFJSP6.tld
Uso de etiquetas para describir parámetros:
<attribute>
<name>num1</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue> </attribute>
</attribute>
<rtextprvalue> indica si tiene o no que ser
evaluada en tiempo de ejecución
72
Etiquetas personalizadas con
cuerpo
Vamos a crear una etiqueta con cuerpo
y parámetro que realice un bucle.
<JSP7:bucle veces=“7”>
<JSP7:holamundo/> cuerpo
</JSP7:bucle>
La clase BucleTag extenderá la clase
BodyTagSupport
73
Ejemplo JSP7-BucleTag
BucleTag.java :c:javaJSP7-BucleTagWEB-
INFsrcejemplosBucleTag.java
JSP7.tld: c:javaJSP7-BucleTagWEB-
INFJSP7.tld
<bodycontent>JSP</bodycontent>
Indica que el contenido del cuerpo puede ser
HTML, texto o etiquetas JSP
Bucle.jsp: c:javaJSP7-BucleTagBucle.jsp
web.xml: c:javaJSP7-BucleTagWEB-
INFweb.xml

Más contenido relacionado

La actualidad más candente

Arquitectura en Capas
Arquitectura en CapasArquitectura en Capas
Arquitectura en CapasHelenSaravia
 
Desarrollo de uml
Desarrollo de umlDesarrollo de uml
Desarrollo de umlLuis Reyez
 
Arquitectura 3 Capas
Arquitectura 3 CapasArquitectura 3 Capas
Arquitectura 3 CapasFani Calle
 
base de datos para dispositivos móviles
base de datos para dispositivos móvilesbase de datos para dispositivos móviles
base de datos para dispositivos móvilesyavidamian
 
Base De Datos Distribuidas
Base De Datos DistribuidasBase De Datos Distribuidas
Base De Datos DistribuidasJorge Guerra
 
Curso Java Inicial 5 Relaciones Entre Objetos
Curso Java Inicial   5 Relaciones Entre ObjetosCurso Java Inicial   5 Relaciones Entre Objetos
Curso Java Inicial 5 Relaciones Entre ObjetosEmilio Aviles Avila
 
Javascript conditional statements
Javascript conditional statementsJavascript conditional statements
Javascript conditional statementsnobel mujuji
 
Modos de Direccionamiento
Modos de DireccionamientoModos de Direccionamiento
Modos de Direccionamientogbermeo
 
Geecon09: SOLID Design Principles
Geecon09: SOLID Design PrinciplesGeecon09: SOLID Design Principles
Geecon09: SOLID Design PrinciplesBruno Bossola
 
Arquitectura y diseño de aplicaciones Java EE
Arquitectura y diseño de aplicaciones Java EEArquitectura y diseño de aplicaciones Java EE
Arquitectura y diseño de aplicaciones Java EECarlos Gavidia-Calderon
 
Pathway,I Ts Web Client Programming Manual
Pathway,I Ts Web Client Programming ManualPathway,I Ts Web Client Programming Manual
Pathway,I Ts Web Client Programming Manualguest2dfc87
 
Presentación power point relational rose
Presentación power point relational rosePresentación power point relational rose
Presentación power point relational roseengelstalin
 
Introducción a los modelos de datos
Introducción a los modelos de datosIntroducción a los modelos de datos
Introducción a los modelos de datosGalo Anzules
 

La actualidad más candente (20)

Uml
UmlUml
Uml
 
Arquitectura en Capas
Arquitectura en CapasArquitectura en Capas
Arquitectura en Capas
 
Desarrollo de uml
Desarrollo de umlDesarrollo de uml
Desarrollo de uml
 
Arquitectura 3 Capas
Arquitectura 3 CapasArquitectura 3 Capas
Arquitectura 3 Capas
 
Diagrama de Componentes
Diagrama de ComponentesDiagrama de Componentes
Diagrama de Componentes
 
Cuadro comparativo de los diferentes DBMS
Cuadro comparativo de los diferentes DBMSCuadro comparativo de los diferentes DBMS
Cuadro comparativo de los diferentes DBMS
 
base de datos para dispositivos móviles
base de datos para dispositivos móvilesbase de datos para dispositivos móviles
base de datos para dispositivos móviles
 
Base De Datos Distribuidas
Base De Datos DistribuidasBase De Datos Distribuidas
Base De Datos Distribuidas
 
Curso Java Inicial 5 Relaciones Entre Objetos
Curso Java Inicial   5 Relaciones Entre ObjetosCurso Java Inicial   5 Relaciones Entre Objetos
Curso Java Inicial 5 Relaciones Entre Objetos
 
Javascript conditional statements
Javascript conditional statementsJavascript conditional statements
Javascript conditional statements
 
Modos de Direccionamiento
Modos de DireccionamientoModos de Direccionamiento
Modos de Direccionamiento
 
Resumen sql-oracle
Resumen sql-oracleResumen sql-oracle
Resumen sql-oracle
 
Taller de Base de Datos - Unidad 5 transacciones
Taller de Base de Datos - Unidad 5  transaccionesTaller de Base de Datos - Unidad 5  transacciones
Taller de Base de Datos - Unidad 5 transacciones
 
Alice 11
Alice 11Alice 11
Alice 11
 
Geecon09: SOLID Design Principles
Geecon09: SOLID Design PrinciplesGeecon09: SOLID Design Principles
Geecon09: SOLID Design Principles
 
Arquitectura y diseño de aplicaciones Java EE
Arquitectura y diseño de aplicaciones Java EEArquitectura y diseño de aplicaciones Java EE
Arquitectura y diseño de aplicaciones Java EE
 
Pathway,I Ts Web Client Programming Manual
Pathway,I Ts Web Client Programming ManualPathway,I Ts Web Client Programming Manual
Pathway,I Ts Web Client Programming Manual
 
Presentación power point relational rose
Presentación power point relational rosePresentación power point relational rose
Presentación power point relational rose
 
DIAGRAMAS DE CLASE
DIAGRAMAS DE CLASEDIAGRAMAS DE CLASE
DIAGRAMAS DE CLASE
 
Introducción a los modelos de datos
Introducción a los modelos de datosIntroducción a los modelos de datos
Introducción a los modelos de datos
 

Destacado

Proyecto agenda
Proyecto agendaProyecto agenda
Proyecto agendajona5650
 
Objetivos y estrategias de la agenda digital
Objetivos y estrategias de la agenda digitalObjetivos y estrategias de la agenda digital
Objetivos y estrategias de la agenda digitaldiegoenrique20
 
Guis en java-1pp_2012_
Guis en java-1pp_2012_Guis en java-1pp_2012_
Guis en java-1pp_2012_Robert Wolf
 
Exceptions (2)
Exceptions (2)Exceptions (2)
Exceptions (2)jbersosa
 
Java exceptions
Java exceptionsJava exceptions
Java exceptionsDeli_amor
 
Excepciones
ExcepcionesExcepciones
Excepcionesrilara
 
Curso Java Inicial 7 Excepciones
Curso Java Inicial   7 ExcepcionesCurso Java Inicial   7 Excepciones
Curso Java Inicial 7 ExcepcionesEmilio Aviles Avila
 
Tema 10 excepciones
Tema 10 excepcionesTema 10 excepciones
Tema 10 excepcionesjbersosa
 
J2EE Struts with Hibernate Framework
J2EE Struts with Hibernate FrameworkJ2EE Struts with Hibernate Framework
J2EE Struts with Hibernate Frameworkmparth
 
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-20065. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006Samuel Marrero
 
Clase 6 excepciones
Clase 6   excepcionesClase 6   excepciones
Clase 6 excepcionesJorge Gamez
 
excepciones_java en www.fiec.espol.edu.ec
excepciones_java  en www.fiec.espol.edu.ecexcepciones_java  en www.fiec.espol.edu.ec
excepciones_java en www.fiec.espol.edu.ecSilvana Vargas
 
2. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-20062. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-2006Samuel Marrero
 

Destacado (20)

Proyecto agenda
Proyecto agendaProyecto agenda
Proyecto agenda
 
Objetivos y estrategias de la agenda digital
Objetivos y estrategias de la agenda digitalObjetivos y estrategias de la agenda digital
Objetivos y estrategias de la agenda digital
 
Guis en java-1pp_2012_
Guis en java-1pp_2012_Guis en java-1pp_2012_
Guis en java-1pp_2012_
 
C6 java beans v2
C6  java beans v2C6  java beans v2
C6 java beans v2
 
Exceptions (2)
Exceptions (2)Exceptions (2)
Exceptions (2)
 
Unidad 5: Excepciones Ejercicio 1
Unidad 5: Excepciones Ejercicio 1Unidad 5: Excepciones Ejercicio 1
Unidad 5: Excepciones Ejercicio 1
 
Gestion de errores en java
Gestion de errores en javaGestion de errores en java
Gestion de errores en java
 
Java exceptions
Java exceptionsJava exceptions
Java exceptions
 
Excepciones
ExcepcionesExcepciones
Excepciones
 
Unidad 5: Excepciones Ejercicio 2
Unidad 5: Excepciones Ejercicio 2Unidad 5: Excepciones Ejercicio 2
Unidad 5: Excepciones Ejercicio 2
 
Curso Java Inicial 7 Excepciones
Curso Java Inicial   7 ExcepcionesCurso Java Inicial   7 Excepciones
Curso Java Inicial 7 Excepciones
 
Excepciones en java
Excepciones en javaExcepciones en java
Excepciones en java
 
Tema 10 excepciones
Tema 10 excepcionesTema 10 excepciones
Tema 10 excepciones
 
Unidad 6: Flujos y Archivos Ejercicio 4
Unidad 6: Flujos y Archivos Ejercicio 4Unidad 6: Flujos y Archivos Ejercicio 4
Unidad 6: Flujos y Archivos Ejercicio 4
 
J2EE Struts with Hibernate Framework
J2EE Struts with Hibernate FrameworkJ2EE Struts with Hibernate Framework
J2EE Struts with Hibernate Framework
 
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-20065. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
 
Clase 6 excepciones
Clase 6   excepcionesClase 6   excepciones
Clase 6 excepciones
 
excepciones_java en www.fiec.espol.edu.ec
excepciones_java  en www.fiec.espol.edu.ecexcepciones_java  en www.fiec.espol.edu.ec
excepciones_java en www.fiec.espol.edu.ec
 
2. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-20062. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-2006
 
Unidad 5: Excepciones Ejercicio 3
Unidad 5: Excepciones Ejercicio 3Unidad 5: Excepciones Ejercicio 3
Unidad 5: Excepciones Ejercicio 3
 

Similar a JSP - Introducción a Java Server Pages

Similar a JSP - Introducción a Java Server Pages (20)

Curso Jsp Mas
Curso Jsp MasCurso Jsp Mas
Curso Jsp Mas
 
Practica jsp
Practica jspPractica jsp
Practica jsp
 
JSP
JSPJSP
JSP
 
Sesion06 apuntes
Sesion06 apuntesSesion06 apuntes
Sesion06 apuntes
 
Jsp
JspJsp
Jsp
 
Tema2a Jsp
Tema2a JspTema2a Jsp
Tema2a Jsp
 
Curso Jsp
Curso JspCurso Jsp
Curso Jsp
 
Jsp
JspJsp
Jsp
 
Capa de presentacion jsp
Capa de presentacion jspCapa de presentacion jsp
Capa de presentacion jsp
 
JavaServer Page
JavaServer PageJavaServer Page
JavaServer Page
 
Jsp(java server pages)
Jsp(java server pages)Jsp(java server pages)
Jsp(java server pages)
 
Curso Java Avanzado 3 Js Ps
Curso Java Avanzado   3 Js PsCurso Java Avanzado   3 Js Ps
Curso Java Avanzado 3 Js Ps
 
Java Web Lección 02 - JSP
Java Web Lección 02 - JSPJava Web Lección 02 - JSP
Java Web Lección 02 - JSP
 
Jsp Paginacion
Jsp PaginacionJsp Paginacion
Jsp Paginacion
 
Manual programacion - java - jsp & xml
Manual   programacion - java - jsp & xmlManual   programacion - java - jsp & xml
Manual programacion - java - jsp & xml
 
Introducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaIntroducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en Java
 
Introjsp
IntrojspIntrojsp
Introjsp
 
JSP
JSPJSP
JSP
 
Java web Lección 04 - JSTL
Java web Lección 04 - JSTLJava web Lección 04 - JSTL
Java web Lección 04 - JSTL
 
Jsp directiva page
Jsp directiva pageJsp directiva page
Jsp directiva page
 

Último

Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfTema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfDaniel Ángel Corral de la Mata, Ph.D.
 
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdf
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdfBIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdf
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdfCESARMALAGA4
 
Metabolismo 3: Anabolismo y Fotosíntesis 2024
Metabolismo 3: Anabolismo y Fotosíntesis 2024Metabolismo 3: Anabolismo y Fotosíntesis 2024
Metabolismo 3: Anabolismo y Fotosíntesis 2024IES Vicent Andres Estelles
 
CIENCIAS NATURALES 4 TO ambientes .docx
CIENCIAS NATURALES 4 TO  ambientes .docxCIENCIAS NATURALES 4 TO  ambientes .docx
CIENCIAS NATURALES 4 TO ambientes .docxAgustinaNuez21
 
TEST DE RAVEN es un test conocido para la personalidad.pdf
TEST DE RAVEN es un test conocido para la personalidad.pdfTEST DE RAVEN es un test conocido para la personalidad.pdf
TEST DE RAVEN es un test conocido para la personalidad.pdfDannyTola1
 
PINTURA ITALIANA DEL CINQUECENTO (SIGLO XVI).ppt
PINTURA ITALIANA DEL CINQUECENTO (SIGLO XVI).pptPINTURA ITALIANA DEL CINQUECENTO (SIGLO XVI).ppt
PINTURA ITALIANA DEL CINQUECENTO (SIGLO XVI).pptAlberto Rubio
 
La evolucion de la especie humana-primero de secundaria
La evolucion de la especie humana-primero de secundariaLa evolucion de la especie humana-primero de secundaria
La evolucion de la especie humana-primero de secundariamarco carlos cuyo
 
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxPresentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxYeseniaRivera50
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxOscarEduardoSanchezC
 
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFAROJosé Luis Palma
 
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdfEstrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdfAlfredoRamirez953210
 
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALVOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALEDUCCUniversidadCatl
 
Fundamentos y Principios de Psicopedagogía..pdf
Fundamentos y Principios de Psicopedagogía..pdfFundamentos y Principios de Psicopedagogía..pdf
Fundamentos y Principios de Psicopedagogía..pdfsamyarrocha1
 
Mapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdfMapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdfvictorbeltuce
 
Introducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleIntroducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleJonathanCovena1
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas123yudy
 

Último (20)

Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfTema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
 
VISITA À PROTEÇÃO CIVIL _
VISITA À PROTEÇÃO CIVIL                  _VISITA À PROTEÇÃO CIVIL                  _
VISITA À PROTEÇÃO CIVIL _
 
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdf
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdfBIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdf
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdf
 
Metabolismo 3: Anabolismo y Fotosíntesis 2024
Metabolismo 3: Anabolismo y Fotosíntesis 2024Metabolismo 3: Anabolismo y Fotosíntesis 2024
Metabolismo 3: Anabolismo y Fotosíntesis 2024
 
CIENCIAS NATURALES 4 TO ambientes .docx
CIENCIAS NATURALES 4 TO  ambientes .docxCIENCIAS NATURALES 4 TO  ambientes .docx
CIENCIAS NATURALES 4 TO ambientes .docx
 
TEST DE RAVEN es un test conocido para la personalidad.pdf
TEST DE RAVEN es un test conocido para la personalidad.pdfTEST DE RAVEN es un test conocido para la personalidad.pdf
TEST DE RAVEN es un test conocido para la personalidad.pdf
 
Unidad 3 | Teorías de la Comunicación | MCDI
Unidad 3 | Teorías de la Comunicación | MCDIUnidad 3 | Teorías de la Comunicación | MCDI
Unidad 3 | Teorías de la Comunicación | MCDI
 
PINTURA ITALIANA DEL CINQUECENTO (SIGLO XVI).ppt
PINTURA ITALIANA DEL CINQUECENTO (SIGLO XVI).pptPINTURA ITALIANA DEL CINQUECENTO (SIGLO XVI).ppt
PINTURA ITALIANA DEL CINQUECENTO (SIGLO XVI).ppt
 
La evolucion de la especie humana-primero de secundaria
La evolucion de la especie humana-primero de secundariaLa evolucion de la especie humana-primero de secundaria
La evolucion de la especie humana-primero de secundaria
 
Earth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversaryEarth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversary
 
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxPresentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
 
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
 
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdfEstrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
 
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALVOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
 
Fundamentos y Principios de Psicopedagogía..pdf
Fundamentos y Principios de Psicopedagogía..pdfFundamentos y Principios de Psicopedagogía..pdf
Fundamentos y Principios de Psicopedagogía..pdf
 
Mapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdfMapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdf
 
Introducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleIntroducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo Sostenible
 
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdfTema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas
 

JSP - Introducción a Java Server Pages

  • 1. Samuel Marrero Lorenzo - smarlor@iespana.es 1 J2EE – Java Server Pages JSP
  • 2. 2 Introducción Servlets - JSP En los servltes vistos anteriormente: el texto generado para el aspecto (vista) de la interfaz gráfica (HTML,WML, etc.) está mezclado con código Java No es posible usar herramientas de generación de HTML, etc. directamente La generación del texto necesita ser escrita por una persona con conocimientos de Java => económicamente muy costoso Cambios al aspecto de la interfaz gráfica requieren recompilación, creación de un nuevo fichero .war y rearranque del servidor En una aplicación web, especialmente en Internet, los cambios a la interfaz gráfica son muy frecuentes
  • 3. 3 Introducción Servlets – JSP (2) Situación a la que queremos llegar Separación de roles Personas que realizan el aspecto gráfico => diseñadores gráficos o similares Conocimientos de diseño gráfico y herramientas para generación de HTML y WML Personas que implementan el controlador y el modelo =>programadores Conocimientos de diseño e implementación Se deberían poder usar directamente las herramientas de diseño de páginas web Las actualizaciones al aspecto gráfico no deben provocar un re-arranque del servidor
  • 4. 4 JSP ¿ Qué es JSP ? A modo de ejemplo, una página JSP que genera HTML Tiene el aspecto de una página HTML Puede incluir scriptlets (scripts) para generar HTML dinámicamente Típicamente los scriptlets se escriben en Java En realidad, una página JSP es un tipo especial de servlet (javax.servlet.jsp y javax.servlet.jsp.tagext) orientado a generar el texto de la interfaz gráfica Invocables por GET y POST <<interface>>javax.servlet.Servlet <<interface>> javax.servlet.jsp.JspPage <<interface>>javax.servlet.jsp.HttpJspPage + _jspService(request : HttpServletRequest, response : HttpServletResponse) : void
  • 5. 5 JSP (2) ¿ Qué ocurre cuando se accede a una página JSP ? Si es la primera vez, el servidor de aplicaciones genera un servlet (que implementa javax.servlet.jsp.HttpJspPage) a partir de la página JSP, lo compila y lo carga en memoria Si no es la primera vez, le pasa la petición al servlet (ya compilado y creado en memoria) Si la página se ha modificado desde la última compilación, el servidor se da cuenta, genera el nuevo servlet, lo compila y lo carga de nuevo
  • 6. 6 Primer ejemplo de JSP <%@page language="java"%> directiva <HTML> HTML <HEAD> <TITLE>Primer ejemplo JSP</TITLE> </HEAD> <BODY> <%if(request.getParameter("nombre")==null){%> scriptlet <H1>Hola Mundo</H1> <%}else {%> <H1>Hola <%=request.getParameter("nombre")%></H1> <%}%> Expresión </BODY> </HTML> Código: c:javaJSP1-HolaMundoHolaMundoHolaMundo.jsp
  • 7. 7 Servlet generado por el servidor Tomcat a partir del código JSP package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class HolaMundo_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static java.util.Vector _jspx_dependants; public java.util.List getDependants() { return _jspx_dependants; } public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { JspFactory _jspxFactory = null; PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; try { _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html"); pageContext = _jspxFactory.getPageContext(this, request, response,true, 8192, true);
  • 8. 8 Servlet generado por el servidor Tomcat a partir del código JSP _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("rn"); out.write("rn"); out.write("<HTML>rn"); out.write("<HEAD>rn"); out.write("<TITLE>Primer ejemplo JSP</TITLE>rn"); out.write("</HEAD>rn"); out.write("<BODY>rn"); out.write("rn"); if(request.getParameter("nombre")==null){ out.write("rn"); out.write("rn"); out.write("t<H1>Hola Mundo</H1>rn"); out.write("rn"); }else { out.write("rn"); out.write("rn"); out.write("t<H1>Hola "); out.print(request.getParameter("nombre")); out.write("</H1>rn"); out.write("rn"); } out.write("rn"); out.write(" trn"); out.write("</BODY>rn"); out.write("</HTML>"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) out.clearBuffer(); if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); } } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context); } } }
  • 9. 9 Expresiones Expresión JSP: <%= expression %> La expresión es evaluada y situada en la salida. <%=request.getParameter(“nombre”)%> Escribe en la salida el parámetro ‘nombre’ del objeto petición ‘request’ El equivalente XML es <jsp:expression> expression </jsp:expression>. Las variables predefinidas son request, response, out, session, application, config, y pageContext.
  • 10. 10 Scriptlets Scriptlet JSP: <% código Java %> El código se inserta en el método service del servlet generado El equivalente XML es: <jsp:scriptlet>código</jsp:scriptlet>
  • 11. 11 JSP1-HolaMundo Scriptlets <%if(request.getParameter("nombre")==null) { out.println(“<H1>Hola Mundo</H1>”); }else { out.println(“<H1>Hola”+ request.getParameter("nombre")+”</H1>”); } %> Fíjate que aquí se utiliza en objeto out para escribir la salida, equivalente al PrintWriter usado en servlets El código está disponible en el directorio JSP1-HolaMundo c:javaJSP1-HolaMundoHolaMundoHolaMundo.jsp
  • 12. 12 Declaraciones Declaración JSP: <%! Código Java %> El código se inserta en el cuerpo de la clase del servlet generado, fuera del método service, como un atributo de la clase servlet. El equivalente XML es: <jsp:declaration>código</jsp:declaration>
  • 13. 13 Ejemplo de declaración El siguiente ejemplo implementa un contador de visitas a una página <%! private int accesos = 0; %> Visitas a la página desde el arranque del servidor <%= ++accesos %>
  • 14. 14 Directiva page Directiva page JSP: <%@ page atributo=“valor" %> Dirige al motor servlet sobre la configuración general. El equivalente XML es: <jsp:directive.page language=“java">. Los atributos legales son (con los valores por defecto en negrita): import="package.class" contentType="MIME-Type" isThreadSafe="true|false" session="true|false" buffer="sizekb|none" autoflush="true|false" extends="package.class" info="message" errorPage="url" isErrorPage="true|false" language="java"
  • 15. 15 La directiva page (2) import="paquete.clase1,...,paquete.claseN". Por ejemplo: <%@ page import="java.util.*" %> El atributo import es el único que puede aparecer múltiples veces. contentType="MIME-Type; charset=Character-Set" Esto especifica el tipo MIME de la salida. El valor por defecto es text/html. Por ejemplo, la directiva: <%@ page contentType="text/plain" %> tiene el mismo valor que el scriptlet <% response.setContentType("text/plain"); %> isThreadSafe="true|false". Un valor de true (por defecto) indica un procesamiento del servlet normal, donde múltiples peticiones pueden procesarse simultáneamente con un sólo ejemplar del servlet. Un valor de false indica que el servlet debería implementar SingleThreadModel, con peticiones enviadas serialmente.
  • 16. 16 La directiva page (3) session="true|false". Un valor de true (por defecto) indica que la variable predefinida session (del tipo HttpSession) es la sesión si existe, si no existe, se crea una nueva sesión. Un valor de false indica que no se usarán sesiones, y los intentos de acceder a la variable session resultarán en errores en el momento en que la página JSP sea traducida a un servlet. buffer="sizekb|none". Esto especifica el tamaño del buffer para el JspWriter out. El valor por defecto es específico del servidor, debería ser de al menos 8kb. autoflush="true|false". Un valor de true (por defecto) indica que el buffer debería descargase cuando esté lleno. Un valor de false, raramente utilizado, indica que se debe lanzar una excepción cuando el buffer se sobrecargue. Un valor de false es ilegal cuando usamos buffer="none".
  • 17. 17 La directiva page (4) extends="paquete.superclase". Esto indica la superclase del servlet que se va a generar. Debemos usarla con extrema precaución, ya que el servidor podría utilizar una superclase personalizada. info="message". Define un string que puede usarse para ser recuperado mediante el método getServletInfo. errorPage="url". Especifica una página JSP que se debería procesar si se lanzará cualquier Throwable pero no fuera capturado en la página actual. isErrorPage="true|false". Indica si la página actual actúa o no como página de error de otra página JSP. El valor por defecto es false. 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 opción legal.
  • 18. 18 Ejemplo JSP2 - TablaHTML En el siguiente ejemplo se muestra la construcción en JSP de una tabla de los valores trigonométricos Código TablaHTML.jsp: c:javaJSP2- TablaHTMLTablaHTMLTablaHTML.jsp Claves: <%@ page import="java.io.*,java.text.*,java.util.*" %> <%! private static final DecimalFormat FMT1 = new DecimalFormat("#0");%> <% for (double gdo = 0; gdo <= 45; gdo += 1.0) { %> …
  • 19. 19 Directiva include Directiva include JSP: <%@ include file="url" %> Un fichero del sistema local se incluirá cuando se traduce de JSP a servlet. El equivalente XML es: <jsp:directive.include file="url">. La URL debe ser relativa. Usamos la acción jsp:include para incluir un fichero en el momento de la petición en vez del momento de la tradución.
  • 20. 20 Comentarios Comentario JSP: <%-- comment --%> Comentario ignorado cuando se traduce la página JSP en un servlet. Si queremos un comentario en el HTML resultante, usamos la síntaxis de comentario normal del HTML <-- comment -->.
  • 21. 21 Objetos implícitos en páginas JSP Objeto application Se corresponde con el ServletContext obtenido mediante getServletConfig().getContext(). Objeto request HttpServletRequest, objeto proveniente de la petición del cliente o de una redirección Objeto response HttpServletResponse, objeto que representa la respuesta Objeto session HttpSession asociado con el request (si existe una sesión) Objeto out el PrintWriter (una versión con buffer del tipo JspWriter) usada para envíar la salida al cliente (navegador).
  • 22. 22 Convenciones en JSP Surge la siguiente cuestión: "¿Cómo estructuramos el código JSP para que sea fácil de leer, de escribir y de mantener? “
  • 23. 23 Ficheros y su localización Tipo de Fichero Extensión Localización Recomendada JSP .jsp <contexto>/<subsystem path>/ Fragmento JSP .jsp <contexto>/<subsystem path>/ Fragmento JSP .jspf <contexto>/WEB-INF/jspf/<subsystem path>/ CCS .css <contexto>/css/ javascript .js <contexto>/js/ página HTML .html <contexto>/<ruta>/ fuente web .gif, .jpg, etc. <contexto>/images/ TLD .tld <contexto>/WEB-INF/tld/
  • 24. 24 Acceso a base de datos desde JSP JSP utiliza JDBC para acceder a base de datos. No necesita etiquetas especiales para acceder a base de datos.
  • 25. 25 JSP con el código de acceso a BD incrustado Uso de scritplets que utilizan JDBC para acceder a la BD. No es necesaria la captura de excepciones, JSP hace el trabajo automáticamente. Cuando recuperamos resultados de una consulta aparecerá código HTML dentro del bucle para ir mostrando cada fila.
  • 26. 26 Ejemplo JSP4-JDBC Esta aplicación crea una conexión con la base de datos ‘agenda’ y lista todos los contactos de la tabla ‘Contactos’ MostrarTodos.jsp: Código: c:javaJSP4-JDBCMostrarTodos.jsp El driver JDBC de la base de datos tiene que estar incluído en el directorio <contexto>/WEB-INF/lib Los scriptlets de Java en este ejemplo están mezclados con el código HTML haciendo difícil el manejo y mantenimiento de esta aplicación
  • 27. 27 Optimización del diseño de las aplicaciones Objetivo: separar en capas la lógica de las aplicaciones Vista: en páginas JSP Modelo: para el modelo y la lógica de negocio se van a utilizar JavaBeans y clases Java A este modelo se le conoce como Modelo 1, y es el primer paso para llegar al modelo MVC Más adelante veremos el Modelo 2 que además proporciona el control de la aplicación de forma separada. En ocasiones también denominado MVC
  • 28. 28 Modelo 1: Acceso a través de Beans Una forma habitual de utilizar BD con JSP es utilizar componentes JavaBean de apoyo. De esta forma mantenemos independiente la presentación y el acceso a datos, esto es fundamental para facilitar el mantenimiento de la aplicación.
  • 29. 29 Introducción a JavaBeans ¿Qué es un JavaBean? Un JavaBean es una clase Java Representa un objeto del modelo, por ejemplo un cliente Proporciona métodos para leer y modificar sus variables o atributos <tipo> getAtributo () {…} void setAtributo (<tipo> valor) {...}
  • 30. 30 Proceso para recuperar datos a través de un JavaBean El Bean se encarga de conectar con la BD y ejecutar la sentencia deseada. El bean proporciona métodos para posicionarse en cada fila de la consulta. A través de las propiedades del JavaBean podemos acceder a los valores de cada uno de los campos. Las propiedades de un JavaBean se representan muy fácilmente en una página JSP.
  • 31. 31 Acción jsp:useBean Acción jsp:useBean <jsp:useBean at1=val1 at2=val2 …/> <jsp:useBean atri=val*> ... </jsp:useBean> Encuentra o construye un Java Bean. Los posibles atributos son: id="name" scope="page|request|session|application" class="package.class" type="package.class" beanName="package.class"
  • 32. 32 Acción jsp:setProperty Acción jsp:setProperty: <jsp:setProperty atrib=val …/> Modifica las propiedades del bean, bien directamente o designando el valor que viene desde un parámetro de la petición. Los atributos legales son: name=“nombre del bean" property=“propiedad del bean|*" param=“nombre del parámetro" value=“valor"
  • 34. 34 Ejemplo de utilización de <jsp:useBean> Ejemplo de uso: <jsp:useBean id="pool" scope="application" class="Clientes.Pool"/> En este ejemplo se obtiene o crea el objeto ‘pool’, con ámbito de aplicación y a partir del JavaBean Pool del paquete Clientes
  • 35. 35 Estructura del JavaBean para acceso a BD Constructor del JavaBean: conexión con la base de datos. realización de la consulta. Guardar resultados en una estructura local al Bean. establecer los valores de las propiedades. cerrar la conexión. Método para recorrer los resultados. Recargando las propiedades cada vez que cambie. Propiedades se corresponden con los campos de la tabla.
  • 36. 36 Ejemplo Modelo 1. JSP5-JDBC-CliPool Este ejemplo de aplicación web utiliza un JavaBean y clases Java que permiten recuperar resultados de una BD, usando un pool de conexiones. Vista: varias páginas JSP Modelo: clases Java BDClientes: realiza las consultas y acciones en la BD Cliente: JavaBean que representa el objeto Cliente del modelo Pool: Es el objeto que conecta con la base de datos y permite obtener la conexión cuando sea solicitada
  • 37. 37 Ejemplo Modelo 1. JSP5-JDBC-CliPool (2) Clase BDClientes, métodos estáticos: obtenerClientes(): hace la consulta sobre la BD y guarda resultados en un vector interno, para visualizar en JSP. obtenerCliente(): crea un objeto cliente a partir de su identificador para pasarlo a la página JSP. insertarCliente(): inserta un nuevo cliente dado por el usuario en una página JSP. eliminarCliente(): elimina un cliente dado por el usuario en una página JSP.
  • 38. 38 Ejemplo Modelo 1. JSP5-JDBC-CliPool (3) Clase Cliente, JavaBean: Contiene las propiedades de un cliente y los métodos getProp y setProp Clase Pool, JavaBean: Constructor: crea un objeto DataSource para la conexión con la BD ‘agenda’ getConnection: obtiene una conexión a partir de la asociación de conexiones freeConnection: cierra la conexión, devolviéndola a la asociación de conexiones
  • 39. 39 Ejemplo JSP5-JDBC-CliPool Modelo Modelo: código de las clases Java: Clase BDClientes: c:javaJSP5-JDBC- CliPoolCliPoolWEB- INFsrcClientesBDClientes.java Clase Cliente: c:javaJSP5-JDBC- CliPoolCliPoolWEB-INFsrcClientesCliente.java Clase Pool: c:javaJSP5-JDBC- CliPoolCliPoolWEB-INFsrcClientesPool.java
  • 40. 40 Ejemplo JSP5-JDBC-CliPool Vistas (2) Vista: código de las páginas JSP index.jsp: c:javaJSP5-JDBC-CliPoolCliPoolindex.jsp, presenta el formulario para agregar un contacto de cliente InsertarCliente.jsp: c:javaJSP5-JDBC- CliPoolCliPoolInsertarCliente.jsp, inserta un cliente EliminarCliente.jsp: c:javaJSP5-JDBC- CliPoolCliPoolEliminarCliente.jsp, elimina un cliente MostrarClientes.jsp: c:javaJSP5-JDBC- CliPoolCliPoolMostrarClientes.jsp, muestra los clientes VerCliente.jsp: c:javaJSP5-JDBC- CliPoolCliPoolVerCliente.jsp, visualiza un cliente
  • 41. 41 Ejemplo JSP5-JDBC-CliPool Ficheros de configuración web.xml: c:javaJSP5-JDBC-CliPoolCliPoolWEB-INFweb.xml Fragmento de código a insertar en server.xml, entre las etiquetas <Host> <Context path="/JSP5-JDBC-CliPool" docBase="/JSP5-JDBC- CliPool/CliPool" debug="0" reloadable="true" crossContext="true"> <Resource name="jdbc/dsAgenda" auth="Container" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/dsAgenda"> …Parametros… </Context>
  • 42. 42 Ejemplo JSP5-JDBC-CliPool Ficheros de configuración (2) Parámetros de conexión en server.xml <parameter> <name>username</name> <value>curso_java</value> </parameter> <parameter> <name>password</name> <value>curso_java</value> </parameter> <parameter> <name>driverClassName</name> <value>oracle.jdbc.driver.OracleDriver</value> </parameter> <parameter> <name>url</name> <value>jdbc:oracle:thin:@10.1.1.36:1521:DESA</value> </parameter> </ResourceParams>
  • 43. 43 Limitaciones del Modelo 1 Tiene cierta separación entre contenido y presentación, por lo que es buena para pequeñas aplicaciones Web. El hecho que la lógica de presentación normalmente conduzca a una considerable cantidad de código Java embebido en el JSP en el formato de scriptlets, hace que sea una pesadilla para los desarrolladores Java experimentados el mantenimiento de estos sistemas. Fíjate que en el Modelo 1, JSP es responsable de: Procesar la petición y la respuesta al cliente (lógica de presentación) Problema sobretodo para los diseñadores de páginas JSP que no programan código en Java
  • 45. 45 Componentes en el Modelo 2 Se implementa al igual que en el Modelo 1, la vista con páginas JSP el modelo con clases Java o JavaBeans En el Modelo 2 además se implementa un sistema de controladores (MVC) En éste modelo, un controlador maneja las solicitudes del usuario, en lugar de lidiar con otro JSP. El controlador o “controller” es implementado como un servlet.
  • 46. 46 Misión del servlet Controlador Aquí el servlet actúa como el Controlador y está al cargo del procesamiento de las peticiones de la creación de cualquier JavaBean u objeto usado por el JSP así como, dependiendo de las acciones del usuario, a qué página JSP redirigir la petición
  • 47. 47 Pasos en el Modelo 2 Los siguientes pasos son ejecutados cuando el usuario envía una solicitud: 1. El servlet Controlador atiende la solicitud. 2. El servlet Controlador instancia el JavaBeans apropiado, basado en los parámetros de la solicitud. 3. El JavaBeans se comunica con la base de datos para retirar los datos requeridos. 4. El Controlador ajusta el JavaBeans resultante, en uno de los siguientes contextos: request, session o aplicación. 5. El Controlador entonces despacha la solicitud a la siguiente vista basado en la URL solicitante. 6. La vista usa el JavaBeans del paso 3, para desplegar los datos.
  • 48. 48 Ejemplo de Modelo 2 Esta pequeña aplicación ejemplifica el uso del Modelo 2 Descripción: Tienda en Internet de venta de cd’s El usuario dispone de un carrito de compra donde se almacenan, usando una sesión, los cd’s que este compra
  • 49. 49 Ejemplo de Modelo 2 Componentes Los componentes son: Modelo: un JavaBean que representa el objeto del negocio CD.java Controlador: un servlet ServletCompra.java que realiza las redirecciones a las vistas y la creación de los Beans necesarios Vista: varios ficheros .jsp que permiten al usuario interactuar con la aplicación
  • 50. 50 Ejemplo JSP8-Modelo2 Modelo: CD.java Es una clase java que representa un CD de música con las propiedades siguientes: Album, artista, país, precio, cantidad Métodos: como en todo JavaBean se proporcionan los métodos getXXX y setXXX Código: c:javaJSP8-Modelo2WEB- INFsrcshoppingcd.java
  • 51. 51 Ejemplo JSP8-Modelo2 Controlador: ServletCompra.java Comprueba la acción a realizar Realiza la acción insertando los valores necesarios en la sesión, si existe Redirige la salida a la vista adecuada
  • 52. 52 Ejemplo JSP8-Modelo2 Funcionamiento del controlador ServletCompra.java: Acción ‘Agregar’: Añade el cd seleccionado a la sesión y redirige la salida a Tienda.jsp Acción ‘Borrar’: Borra el cd seleccionado de la sesión y redirige a Tienda.jsp Acción ‘Comprar’: Calcula el total y redirige a Comprar.jsp Código: c:javaJSP8-Modelo2WEB- INFsrcServletCompra.java
  • 53. 53 Ejemplo JSP8-Modelo2 Vistas: son las páginas JSP Tienda.jsp: página de entrada, muestra el catálogo de CD’s disponibles c:javaJSP8-Modelo2Tienda.jsp Carrito.jsp: esta página se incluye en la anterior y muestra los cd’s que el usuario ha ido metiendo en el carrito c:javaJSP8-Modelo2Carrito.jsp Comprar.jsp: muestra el contenido del carrito y el total a pagar cerrando la sesión
  • 54. 54 Ventajas del Modelo 2 Como no hay lógica de presentación en el JSP, no hay necesidad de demasiados scriptlets. Se pueden tener múltiples controladores en la aplicación Web, aunque normalmente, se suele usar 1 solo. Las aplicaciones Web son más sencillas de mantener y extender, ya que las vistas no refieren unas a otras, y no hay lógica de presentación en ellas.
  • 55. 55 Acción jsp:include Acción jsp:include: <jsp:include page="relative URL" flush="true"/> Incluye un fichero en el momento en que la página es solicitada. Aviso: en algunos servidores, el fichero incluido debe ser un fichero HTML o JSP, según determine el servidor (normalmente basado en la extensión del fichero).
  • 56. 56 Acción jsp:forward Acción jsp:forward <jsp:forward page="URL relativa"/> Reenvía la petición a otra página.
  • 57. 57 Acción jsp:plugin Acción jsp:plugin: <jsp:plugin attribute="value"*> ... </jsp:plugin> Genera etiquetas OBJECT o EMBED, apropiadas al tipo de navegador, pidiendo que se ejecute un applet usando el Java Plugin.
  • 58. 58 Tags personalizadas En las páginas JSP se usa código HTML, XML, Java e incluso se usan etiquetas que encapsulan parte de la lógica. El uso de la etiqueta <jsp:useBean> en conjunción con los JavaBeans hace que podamos separar la lógica de presentación de la de proceso y consigue unos archivos JSP mas claros, y lo que es mas importante, el que escribe la JSP, no tiene por que tener unos conocimientos avanzados de programación para crear páginas JSP de funcionalidades avanzadas.
  • 59. 59 Tipos de etiquetas Hay dos tipos principales de etiquetas, etiquetas que no tienen cuerpo. Ejemplo: <img src=“canteras.gif”> etiquetas que si lo tienen. Ejemplo: <title>Las Canteras</title> que tiene cuerpo y etiqueta de final. Estos son dos tipos de etiquetas que podemos crear en Java
  • 60. 60 Etiquetas personalizadas JSP JSP sigue una sintáxis XML por lo tanto Etiquetas sin cuerpo: <jsp:etiqueta/> Etiquetas con cuerpo: <jsp:etiqueta> … </jsp:etiqueta> Para crear etiquetas a medida debemos implementar o heredar de otras clases Interface Tag  interface general Clase TagSupport  creación de etiquetas sin cuerpo Clase BodyTagSupport  creación de etiquetas con cuerpo En los ejemplos siguientes trabajaremos extendiendo la clase TagSupport y BodyTagSupport que son simplificaciones del interface Tag
  • 61. 61 Clase TagSupport Las clase TagSupport suministra una serie de métodos que sobreescribiremos para crear una etiqueta. Estos son algunos: doStartTag(): se invoca cuando se encuentra la etiqueta de apertura doEndTag(): se invoca cuando se encuentra la etiqueta de cierre doAfterBody(): se invoca una vez se ha obtenido el contenido del cuerpo, cuando éste existe
  • 62. 62 Primer ejemplo JSP6- HolaMundoTag Diseñaremos una etiqueta sin cuerpo que escribirá el mensaje “Hola Mundo” en el cliente: <JSP6:holamundo/> Siguiendo la sintáxis XML, de documentos bien formateados Código y configuración: Clase de la etiqueta: c:javaJSP6- HolaMundoTagWEB- INFsrcejemplosHolaMundoTag.java
  • 63. 63 JSP6-HolaMundoTag Ficheros de configuración: Definir el descriptor de librería de etiquetas (Tag Library Descriptor) o TLD, en este caso JSP6.tld: c:javaJSP6- HolaMundoTagWEB-INFJSP6.tld web.xml: c:javaJSP6- HolaMundoTagWEB-INFweb.xml
  • 64. 64 Tag Library Descriptor (TLD) JSP6.tld Este fichero de configuración, situado en <contexto>/WEB-INF, describe el formato del conjunto de las etiquetas una librería. En este caso la librería recibe el nombre de ‘JSP6’ y describe una etiqueta de nombre ‘holamundo’ <tag> <name>holamundo</name> <tagclass>HolaMundoTag</tagclass> <bodycontent>empty</bodycontent> <info>Saludo</info> </tag>
  • 65. 65 JSP6-HolaMundo web.xml El descriptor de despliegue de la aplicación JSP6-HolaMundo: web.xml Asigna un uri a la localización de la librería, para poder referirnos a ella en las páginas JSP, en este caso mediante el uri = ‘/JSP6’ <taglib> <taglib-uri>/JSP6</taglib-uri> <taglib-location>/WEB-INF/JSP6.tld </taglib-location> </taglib>
  • 66. 66 JSP6-HolaMundo HolaMundo.jsp HolaMundo.jsp: c:javaJSP6- HolaMundoTagHolaMundo.jsp <!-- HolaMundo.jsp --> <%@ taglib uri="/JSP6" prefix="JSP6" %> <HTML> <HEAD> <TITLE>Tag Hola Mundo</TITLE> </HEAD> <JSP6:holamundo/> </BODY> </HTML>
  • 67. 67 Página HolaMundo.jsp Directiva taglib Una directiva taglib declara las librerías de etiquetas usadas por el JSP. Un directiva corta se declara en una sola línea. Si tenemos varias directivas taglib se deben almacenar juntas en la misma localización dentro del cuerpo JSP: <%@ taglib uri=“/JSP6" prefix=“JSP6" %>, en este ejemplo Sólo deberíamos importar librerías de etiquetas que realmente se van a utilizar en la página JSP. Desde JSP 1.2, esta altamente recomendado utilizar la JSP Standard Tag Library en nuestra aplicación web para reducir la necesidad de scriptlets JSP en nuestras páginas. Las páginas que usan JSTL son, en general, más fáciles de leer y de mantener.
  • 68. 68 Constantes de las etiquetas personalizadas SKIP_BODY : indica en el método que la etiqueta no tiene cuerpo o que no quiere seguir evaluándolo EVAL_PAGE : indica en el método doEndTag() que se procede a evaluar el resto de la página JSP SKIP_PAGE : indica que no se siga evaluando la página JSP EVAL_BODY_AGAIN: indica que se vuelva a evaluar el cuerpo, en caso de bucles
  • 69. 69 Etiquetas personalizadas con parámetros Vamos a ver una etiqueta con parámetros del tipo <JSP6:suma num1=2 num2=3/>, que suma los números 2+3 Por cada parámetro que queremos que soporte la etiqueta, se proporciona un método set como en un javabean El código de la clase SumaTag lo veremos a continuación
  • 70. 70 SumaTag.java Esta etiqueta no tiene cuerpo por lo que será igual que la anterior excepto que se añaden los métodos set Código: c:javaJSP6-HolaMundoTagWEB- INFsrcejemplosSumaTag.java Mediante los métodos set los valores de los parámetros son cargados automáticamente en la clase
  • 71. 71 Modificación del Tag Library Descriptor (TLD) JSP6.tld: c:javaJSP6-HolaMundoTagWEB- INFJSP6.tld Uso de etiquetas para describir parámetros: <attribute> <name>num1</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </attribute> <rtextprvalue> indica si tiene o no que ser evaluada en tiempo de ejecución
  • 72. 72 Etiquetas personalizadas con cuerpo Vamos a crear una etiqueta con cuerpo y parámetro que realice un bucle. <JSP7:bucle veces=“7”> <JSP7:holamundo/> cuerpo </JSP7:bucle> La clase BucleTag extenderá la clase BodyTagSupport
  • 73. 73 Ejemplo JSP7-BucleTag BucleTag.java :c:javaJSP7-BucleTagWEB- INFsrcejemplosBucleTag.java JSP7.tld: c:javaJSP7-BucleTagWEB- INFJSP7.tld <bodycontent>JSP</bodycontent> Indica que el contenido del cuerpo puede ser HTML, texto o etiquetas JSP Bucle.jsp: c:javaJSP7-BucleTagBucle.jsp web.xml: c:javaJSP7-BucleTagWEB- INFweb.xml