t6 - jps(i) - aulavirtual.um.es · jsp (i) aplicaciones distribuidas. 2 contenido • limitación...
Post on 20-Sep-2018
229 Views
Preview:
TRANSCRIPT
JSP (I)
Aplicaciones Distribuidas
2
Contenido
• Limitación Modelo Servlets
• Definición.
• Elementos de Script
• Expresiones y declaraciones.
• Directivas.
• JavaBeans.
• Otros aspectos de interés
• Etiquetas de Extensión
• Estructura
• Modelo Básico de Programación.
• Ejemplo.
• Librería de etiquetas
• Uso.
• Modelo Extendido de Programación.
• Iteraciones.
• Anidamiento.
• Etiquetas: conclusiones
3
Limitación Modelo
Servlets
• Motivación:
• Las aplicaciones web se construyen sin conocer al usuario final.
• � Cambios frecuentes
• Problema:
• La generación del interfaz HTML se realiza utilizando código Java � out.println(“...”)
• No podemos usar editores HTML.
• Costoso tener diseñadores gráficos con conocimientos Java.
• Consecuencia:
• El mantenimiento (evolución) de la aplicación está limitado.
4
Limitación Modelo
Servlets � JSP
• Objetivo:
• Separación roles: Diseñador Gráfico y Desarrollador.
• Nuevo modelo de desarrollo de contenidos dinámicos en el que
la lógica de la aplicación se encapsule en componentes
portables y reutilizables.
• Solución: JSP (Java Server Pages)
• “Una página HTML normal que puede incluir scripts para
generar HTML dinámicamente”.
• En general, puede generar cualquier tipo de contenido dinámico:
XML, WML, etc.
• Código script, por defecto Java (scriptlets).
5
Ciclo de vida
• No representan una nueva tecnología:
• Semánticamente equivalen a los servlets.
• Sólo facilitan el desarrollo y mantenimiento.
• Ciclo de vida:
• El contenedor de servlets traduce la página JSP a su
equivalente servlet la primera vez que se accede.
• El servlet es compilado y cargado en memoria siguiendo
su ciclo de vida convencional.
• Si la página es modificada, el contenedor detecta el
cambio y vuelve a repetir el proceso.
• � Ventaja: no se hace necesario reiniciar el servidor
Web.
6
Ejemplo
<html>
<body>
<jsp:useBean id="cliente" class="Cliente" scope="session">
<form method="POST" action=“clienteActualizacion.ctrl">
<p><b> Nombre: <input type="text" name="nombre" size="39"
value="<jsp:getProperty name=\"cliente\" property=\"nombre\“/>">
NIF:<input type="text" name="nif" size="12"
value="<jsp:getProperty name=\"cliente\" property=\"nif\“/>">
...
</form>
</body>
</html>
7
Elementos de Script
• Incluir código Java:
• <% ... %>
• Objetos implícitos:
• request, response, out, session, application, config, ...
• Durante la traducción el código se inserta en el mismo orden
• � Podemos usar declaraciones anteriores.
• No es necesario que el código contenga sentencias completas en
Java:
<% if (session.getAttribute(“accesos”) == null) { %><B>Bienvenido a nuestra web</B>
<% } %>
8
Expresiones y
Declaraciones
• Expresiones:
• <%= ... %>
• Evalúa la expresión en tiempo de ejecución, la convierte a Stringy la saca por la salida.
• Equivale a: out.println(“...”);
• Ejemplos:
• <%= request.getParameter(“Nombre”) %>
• <%= i++ %>
• Declaraciones:
• <%! ... %>
• Declarar métodos y atributos:
• <%! private int numeroAccesos; %>
9
Directivas
• <%@ ... %>
• Afectan a la estructura de la clase del Servlet.
• Directiva page: <%@ page ...
• import: paquetes y clases separados por comas
• <%@ page import=“java.util.*” %>
• contentType:
• <%@ page contentType=“text/xml” %>
• errorPage: página que trata las excepciones no capturadas
• <%@ page errorPage=“error.jsp” %>
• isErrorPage: indica si actúa como página de error
• <%@ page isErrorPage=“true” %>
• ...
• Directiva include: <%@ include file=“URL” %>
• Incluye código JSP en el momento de la traducción.
10
JavaBeans
• Componentes Java reutilizables.
• Se utilizan para facilitar el acceso a los objetos Java.
• Están caracterizados por un conjunto de propiedades y de eventos quedisparan.
• Ejemplo: componentes AWT/Swing en programación gráfica.
• Se definen siguiendo unas guías de estilo:
• En JSP sólo nos interesan las propiedades.
• Declaración:
• Clase serializable con un constructor público sin argumentos.
• Un propiedad ab tendrá métodos de acceso y/o modificación
• public Tipo getAb() y public void setAb(Tipo valor)
• Multivaluada: public Tipo[] getAb() y public void setAb(Tipo[])
• Tipo: tipos básicos o String.
11
JavaBeans - Declaración
• Manejamos los javabeans haciendo uso de acciones estándaresJSP.
• Declaración:
• <jsp:useBean id=“carro” class=“portal.CarroCompra”scope=“session” />
• scope: indica dónde se guarda el objeto
• page: equivalente a una variable local
• request
• session
• application
portal.CarroCompra carro = new portal.CarroCompra();session.setAttribute(“carro”, carro);
12
JavaBeans - Propiedades
• Establecimiento de propiedades:
• <jsp:setProperty name=“carro” property=“...” value= “...” />
• name ha de coincidir con el id de la declaración.
• Sin value: toma el valor de un parámetro de la petición cuyo
nombre sea igual a la propiedad.
• property=“*”: establece las propiedades del bean cuyo nombre
coincida con algún parámetro de la petición.
• Para asignar un parámetro concreto: param=“...”
• Recuperación de propiedades.
• <jsp:getProperty name=“carro” property=“...” />
• Recupera la propiedad y la inserta en la salida.
13
Otros aspectos de interés
• Acción forward:
• <jsp:forward page=“URL” />
• Equivalente al forward de RequestDispatcher.
• Acción include:
<jsp:include page=“URL” flush=“true”>
<jsp:param name=“login” value=“Marcos” />
</jsp:include>
• Equivalente al include de RequestDispatcher.
• En cualquier caso, la URL puede ser un valor calculado mediante una
expresión.
• Comentarios:
• <%-- comentario --%>
14
Etiquetas de Extensión
• Alternativa a los JavaBeans para encapsular la lógica de negocio.
• Limitaciones JavaBeans:
• Ejecución de métodos: uso de scriptlets.
• Dificultad para acceder al contexto de la página (petición, sesión, etc.)
• Objetivos:
• Disponer del concepto de “componente” para la edición de páginas Web � Disponible en una paleta
• Ejecutar la lógica de negocio de un modo declarativo.
• Ejemplo:
• <jsp:forward page=“error.jsp” />
15
Estructura
• Otro ejemplo:
• Una etiqueta se identifica por un prefijo (“ad”) y por un sufijo (“enlace”).
• Puede tener parámetros al estilo XML (“URL”).
• Las etiquetas pueden tener cuerpo (body).
• También puede tener etiquetas anidadas.
• Ejemplo: “jsp:param” en la etiqueta “jsp:include”.
• Las etiquetas se organizan en librerías (TagLib)
• Contiene información sobre las etiquetas.
• Necesaria para el contenedor y las herramientas de edición.
<ad:enlace URL=“index.jsp” texto=“Inicio” />
Modelo de Programación: Interface Tag
16
• int doStartTag()
• EVAL_BODY_INCLUDE
• SKIP_BODY
• int doEndTag()
• EVAL_PAGE
• SKIP_PAGE
• void setParent(Tag)
• Tag getParent()
• PageContext:
• Acceso a los objetos implícitos
• getOut(), getRequest(), …
• Clase de apoyo: TagSupport
j:Pagina JSP t : Tag
setPageContext(PageContext)
setParent(Tag)
setAtributo1( )
setAtributo2( )
doStartTag()
doEndTag( )
release( )
17
Ejemplo de Etiqueta
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class EnlaceTag extends TagSupport
{ ...
public void setURL(String url) {
this.url = url;
}
...
public int doEndTag() throws JspTagException {
try {
HttpServletResponse respuesta =
(HttpServletResponse) pageContext.getResponse();
pageContext.getOut().write("<a href=\""
+ respuesta.encodeURL(url) + "\">" + texto + "</a>");
} catch (java.io.IOException e) {
throw new JspTagException(e.getMessage());
}
return EVAL_PAGE;
}
}
18
Librería de Etiquetas
<taglib><tlibversion>1.0</tlibversion><jspversion>1.1</jspversion><shortname>ad</shortname><info> Libreria de etiquetas de AD</info><tag>
<name>enlace</name><tagclass>EnlaceTag</tagclass><bodycontent>JSP</bodycontent><info>Crea un enlace con reescritura de URL</info><attribute>
<name>URL</name><required>true</required><rtexprvalue>true</rtexprvalue>
</attribute><attribute>
<name>texto</name><required>true</required><rtexprvalue>true</rtexprvalue>
</attribute></tag>...
19
Uso de una etiqueta
• Para utilizar una librería hay que declararla en el descriptor
de la aplicación (web.xml):
• Para hacer uso de ella en la página JSP usamos una
directiva:
<taglib><taglib-uri>/ad</taglib-uri><taglib-location>/WEB-INF/tlds/ad.tld</taglib-location>
</taglib>
<%@ taglib uri=”/ad" prefix=“ad" %>
20
Cuerpo de la Etiqueta
• Motivación: Iteraciones
• Ejemplo: Listar Usuarios registrados
<ad:listaUsuarios usuarios="<%= usuarios %>“ >
<b><%= identificador %> <%= nombre %></b>
</aadd:listaUsuarios>
• El manejador debe controlar:
• El número de veces que se evaluará el cuerpo.
• Las nuevas variables que ofrece a la página.
• Extensión del modelo de programación:
• Interface BodyTag
• Clase de apoyo: BodyTagSupport
Modelo de Programación – Interface
BodyTag
21
• BodyContent:
• Acceso al cuerpo de la etiqueta.
• getString()
• getEnclosingWriter()
• clearBody()
• void doInitBody()
• int doAfterBody()
• EVAL_BODY_TAG
• SKIP_BODY
j:Página JSP t :BodyTag pc : PageContext
Iteración
doStartTag()
doInitBody( )
doAfterBody( )
doAfterBody( )
doEndTag( )
setBodyContent(BodyContent)
pushBody()
popBody( )
22
Ejemplo de Iteración
public int doAfterBody() throws JspTagException {
BodyContent bodyContent = getBodyContent();
if (bodyContent != null) {
try {
bodyContent.getEnclosingWriter().print(bodyContent.getString());
bodyContent.clearBody();
} catch (Exception e) {
throw new JspTagException(e.getMessage());
}
}
if (it.hasNext()) {
Cliente c = (Cliente) it.next();
pageContext.setAttribute("identificador", c.getUsuario());
pageContext.setAttribute("nombre", c.getNombre());
return EVAL_BODY_TAG;
} else
return SKIP_BODY;
}
23
Declaración de Variables
• Si una etiqueta ofrece objetos a la página, debe
declararlos con una clase TagExtraInfo:
• Declaración de la clase dentro de la librería:
import javax.servlet.jsp.tagext.*;
public class VarUsuariosTagTEI extends TagExtraInfo
{
public VariableInfo[] getVariableInfo(TagData data) {
return new VariableInfo[] {
new VariableInfo("identificador", "java.lang.String", true, VariableInfo.NESTED),new VariableInfo("nombre", "java.lang.String", true, VariableInfo.NESTED) };
}
}
<tag><name>listaUsuarios</name><tagclass>UsuariosTag</tagclass><teiclass>VarUsuariosTagTEI</teiclass>
...
24
Anidamiento de Etiquetas
• Motivación:
• Una etiqueta puede acceder al contexto proporcionado por otra etiqueta:
colaboración.
• Relaciones entre etiquetas usando interfaces Java (tipos)
• Localizar etiqueta envolvente:
public interface EtiquetaCliente
{
Cliente getCliente();
}
EtiquetaCliente etiquetaCliente =
(EtiquetaCliente)TagSupport.findAncestorWithClass(
this, EtiquetaCliente.class);
25
Etiquetas - Conclusiones
• Usos habituales:
• Generación de código HTML: poco recomendable.
• Exponer datos complejos: listas, tablas, árboles.
• Manejar iteraciones.
• Consejos de uso:
• Definir etiquetas configurables utilizando atributos: reutilización.
• Evitar código HTML en el manejador.
• No romper el flujo del procesamiento: evitar redirecciones.
• JSP Standard Tag Library (JSTL).
• http://jstl.java.net/
• Otras librerías de etiquetas:
• Jakarta: http://jakarta.apache.org/taglibs/
top related