JSP: Java Server Pages - Universidad Complutense de Madrid

58
JSP: Java Server Pages Luis Fernando Llana D´ ıaz Departamento de Sistemas Inform´ aticos y Computaci´on Universidad Complutense de Madrid 29 de abril de 2013 Luis Fernando Llana D´ ıaz Departamento de Sistemas Inform´ aticos y Computaci´onUniversidad Complutense de Madrid JSP: Java Server Pages

Transcript of JSP: Java Server Pages - Universidad Complutense de Madrid

Page 1: JSP: Java Server Pages - Universidad Complutense de Madrid

JSP: Java Server Pages

Luis Fernando Llana Dıaz

Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

29 de abril de 2013

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 2: JSP: Java Server Pages - Universidad Complutense de Madrid

Java Server Pages

Java empotrado dentro de HTML.< %@ page pageEncoding="utf -8" %>

< %

String name = request.getParameter("name");

if (name==null) {

name = "World";

}

%>

<html>

<body>

<p>Hello < %=name %></p>

<form action="hello.jsp">

<input name="name"/>

<button >Send</button >

</form>

</body>

</html>

Marcas espciales:

< % Java code %>

< %= expression %>

Variable predefinida request.Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 3: JSP: Java Server Pages - Universidad Complutense de Madrid

Traduccion a servlet I

Fichero:

${catalina.home}/work/Catalina/localhost/

hello-jsp/org/apache/jsp/jsp/hello_jsp.java

/*

* Generated by the Jasper component of Apache Tomcat

* Version: Apache Tomcat /7.0.37

* Generated at: 2013 -04 -17 07:12:55 UTC

* Note: The last modified time of this file was set to

* the last modified time of the source file after

* generation to assist with modification tracking.

*/

package org.apache.jsp.jsp;

import javax.servlet .*;

import javax.servlet.http .*;

import javax.servlet.jsp.*;

.....................

.....................

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 4: JSP: Java Server Pages - Universidad Complutense de Madrid

Traduccion a servlet II

public void _jspService(final javax.servlet.http.HttpServletRequest request , final javax.servlet.http.HttpServletResponse response)

throws java.io.IOException , javax.servlet.ServletException {

final javax.servlet.jsp.PageContext pageContext;

javax.servlet.http.HttpSession session = null;

final javax.servlet.ServletContext application;

final javax.servlet.ServletConfig config;

javax.servlet.jsp.JspWriter out = null;

final java.lang.Object page = this;

javax.servlet.jsp.JspWriter _jspx_out = null;

javax.servlet.jsp.PageContext _jspx_page_context = null;

...................

..................

try {

response.setContentType("text/html;charset=utf -8");

pageContext = _jspxFactory.getPageContext(this , request , response ,

null , true , 8192, true);

_jspx_page_context = pageContext;

application = pageContext.getServletContext ();

config = pageContext.getServletConfig ();

session = pageContext.getSession ();

out = pageContext.getOut ();

_jspx_out = out;

..................................

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 5: JSP: Java Server Pages - Universidad Complutense de Madrid

Traduccion a servlet III

..................................

..................................

} catch (java.lang.Throwable t) {

if (!(t instanceof javax.servlet.jsp.SkipPageException )){

out = _jspx_out;

if (out != null && out.getBufferSize () != 0)

try { out.clearBuffer (); } catch (java.io.IOException e) {}

if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);

else throw new ServletException(t);

}

} finally {

_jspxFactory.releasePageContext(_jspx_page_context );

}

}

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 6: JSP: Java Server Pages - Universidad Complutense de Madrid

Traduccion a servlet IV

Traduccion de la pagina

out.write("\n");

out.write("\n");

out.write("\n");

out.write("<html >\n");

out.write("<body >\n");

String name = request.getParameter("name");

if (name==null) {

name = "World";

}

out.write("\n");

out.write("<p>Hello ");

out.print(name);

out.write("</p>\n");

out.write("<form action =\" hello.jsp\">\n");

out.write(" <input name =\" name \"/>\n");

out.write(" <button >Send </button >\n");

out.write("</form >\n");

out.write("</body >\n");

out.write("</html > \n");

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 7: JSP: Java Server Pages - Universidad Complutense de Madrid

Sensible al codigo spaghetti I

< %@ page pageEncoding="utf -8" %>

< %

String strNum = request.getParameter("number");

if (strNum !=null) {

int num = Integer.parseInt(strNum );

%>

<table>

< %

for (int i=0; i<10; i++){

%>

<tr><td> < %= num %> </td><td>x < %= i %></td><td>= < %= num*i %></td></tr>

< %} %>

</table>

< % } %>

<form action="mult1.jsp">

<label>Number:</label ><input size="2" name="number">

<button >Submit </button >

</form>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 8: JSP: Java Server Pages - Universidad Complutense de Madrid

Sensible al codigo spaghetti II

< %@ page pageEncoding="utf -8" %>

< %

String strNum = request.getParameter("number");

if (strNum !=null) {

int num = Integer.parseInt(strNum );

%>

<table>

< %

for (int i=0; i<10; i++) {

out.println(String.format("<tr><td> %d</td><td>x %d =</td><td> %d</td>",

num , i , num*i));

}

%>

</table>

< % } %>

<form action="mult2.jsp">

<label>Number:</label ><input size="2" name="number">

<button >Submit </button >

</form>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 9: JSP: Java Server Pages - Universidad Complutense de Madrid

Directivas: < %@ directiva atributos %>

<html>

<body>

< %@ page import="java.util.Date" %>

< %@ page import="java.text.DateFormat" %>

< %@ page import="java.text.SimpleDateFormat" %>

< %

Date date = new Date ();

DateFormat df = new SimpleDateFormat("dd’ de ’MMMM ’ de ’yyyy");

%>

<p>Hoy es < %=df.format(date) %></p>

</body>

</html>

< %@ include file="jsp/cabecera.jsp" %>

<h1>ıCaptulo 1</h1>

< %@ include file="html/capitulo1.html" %>

<h1>ıCaptulo 2</h1>

< %@ include file="html/capitulo2.html" %>

<h1>ıCaptulo 3</h1>

< %@ include file="html/capitulo3.html" %>

<h1>ıCaptulo 4</h1>

< %@ include file="html/capitulo4.html" %>

< %@ include file="html/pie.html" %>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 10: JSP: Java Server Pages - Universidad Complutense de Madrid

Habichuelas Java: JavaBeans

<body>

<jsp:useBean id="valor" scope="request" class="valores.Valor"/>

<jsp:setProperty name="valor" property="*"/>

< %

if (valor.getNombre ()== null || valor.getIbex_id ()== null ||

valor.getUrl ()== null || valor.getTipo ()==0 ) {

String nombre = valor.getNombre ()== null?"":valor.getNombre ();

String ibex_id = valor.getIbex_id ()== null?"":valor.getIbex_id ();

String url = valor.getUrl ()== null?"":valor.getUrl ();

int tipo = valor.getTipo ()==0?0: valor.getTipo ();

%>

<form action="pr5.jsp" method="get">

<p>

<label>Nombre:</label ><input name="nombre" value="< %=nombre %>"><br>

<label>ibex_id:</label ><input name="ibex_id" value="< %=ibex_id %>"><br>

<label>URL: </label><input name="url" value="< %=url %>"><br>

<label>Tipo </label>

<select name="tipo">

<option value="< %=Valor.ACCIONES %>">Acciones </option >

<option value="< %=Valor.FONDOS %>">Fondos </opcion >

</select >

<button type="submit">Enviar </button >

</p>

</form>

< % } else { %>

<jsp:getProperty name="valor" property="datos"/>

< % } %>

</body>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 11: JSP: Java Server Pages - Universidad Complutense de Madrid

Etiquetas personalizadas I

<body>

< %

String nombre = request.getParameter("nombre");

String ibex_id = request.getParameter("ibex_id");

String url = request.getParameter("url");

String strTipo = request.getParameter("tipo");

int tipo = strTipo ==null? 0: Integer.parseInt(strTipo );

if (nombre ==null || url==null || tipo ==0) {

%>

<form action="pr6.jsp" method="get">

<p>

<label>Nombre:</label ><input name="nombre" value="< %=nombre ==null?"":nombre %>"><br>

<label>Ibex ID:</label><input name="ibex_id" value="< %=ibex_id ==null?"":ibex_id %>"><br>

<label>url:</label><input name="url" value="< %=url==null?"":url %>"><br>

<label>Tipo:</label>

<select name="tipo">

<option value="< %=Valor.ACCIONES %>">Acciones </option >

<option value="< %=Valor.FONDOS %>">Fondos </opcion >

</select >

<br>

<button type="submit">Enviar </button >

</p>

</form>

< % } else { %>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 12: JSP: Java Server Pages - Universidad Complutense de Madrid

Etiquetas personalizadas II

< % } else { %>

< %@ taglib uri="/WEB -INF/valores.tld" prefix="valores" %>

<valores:repite ini="5" fin="8">

< % if (ibex_id ==null || ibex_id.equals("")) { %>

<valores:entrada nombre="< %=nombre %>" url="< %=url %>" tipo="< %=tipo %>" />

< % } else { %>

<valores:entrada nombre="< %=nombre %>" ibex_id="< %=ibex_id %>" url="< %=url %>" tipo="< %=tipo %>" />

< % } %>

</valores:repite >

< % } %>

</body>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 13: JSP: Java Server Pages - Universidad Complutense de Madrid

Variables Predefinidas

request El HttpServletRequest asociada con esta peticion.

response El HttpServletResponse asociada con estapeticion.

out El PrintWriter usado para mandar la salida alusuario.

session El HttpSession asociada con esta peticion. Lassesiones estan activadas por defecto. Recordemos elmetodo response.encodeURL.

application El ServletContext del servlet.

config El ServletConfig del servlet.

pageContext Un objeto de clase PageContext para encapsularciertas caracterısticas de los JSP.

page El objeto que respresenta al sevlet: this.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 14: JSP: Java Server Pages - Universidad Complutense de Madrid

Sesion

<body>

< %

if (request.getParameter("borrarSesion")!= null) {

session.removeAttribute("num");

}

Integer num=( Integer)session.getAttribute("num");

if (num==null) {

num = new Integer (0);

}

num = new Integer(num.intValue ()+1);

session.setAttribute("num",num);

%>

<p>Has accedido < %=num.intValue() %> veces a la apgina </p>

<form action="pr7.jsp">

<p><button name="borrarSesion" type="submit">Borrar oSesin </button ></p>

<p><button name="continuarSesion" type="submit">Continuar oSesin </button ></p>

</form>

</body>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 15: JSP: Java Server Pages - Universidad Complutense de Madrid

Directivas page

Atributos:

import Las clausulas import debe haber en el servlet.

< %@ page import="java.util.*" %>

< %@ page import="java.text.DateFormat" %>

< %@ page import="java.text.SimpleDateFormat" %>

contentType Especifica el tipo MIME:

< %@ page contentType="text/html; charset=utf -8" %>

session Valor true (por defecto) usa sesiones,valor false no.

extends La clase que debe extender el servlet.

info La cadena que se obtiene a traves del metodogetServletInfo.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 16: JSP: Java Server Pages - Universidad Complutense de Madrid

Directivas page

Atributos:

isThreadSafe Valor true (por defecto) es un servlet normal,el valor false indica que el servlet implementaSingleThreadModel.

buffer Especifica el tamano del JspWriter. Por defectotoma el valor que se especifica en el servidor.

autoflush Valor true (por defecto) indica que el buffer esflushed cuando esta lleno,si tiene el valor false se provoca una excepcion.

errorPage Pagina JSP que procesa las exceptions.

isErrorPage Indica si la pagina es de error o no.

language El unico valor posible el Java

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 17: JSP: Java Server Pages - Universidad Complutense de Madrid

Directivas include

Incluye una pagina en tiempo de compilacion

< %@ include file="jsp/pie.jsp" %>

Pueden incluir HTML estatico y marcas JSP.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 18: JSP: Java Server Pages - Universidad Complutense de Madrid

Acciones JSP

Las acciones JSP usan sintaxis XML para controlar elcomportamiento del servlent:

jsp:include Incluye una pagina en tiempo de ejecucion.

jsp:useBean Usa una habichuela de Java.

jsp:setProperty Pone una propiedad de una habichuela deJava.

jsp:getProperty Consulta una propiedad de una habichuela deJava.

jsp:forward Dirige la peticion a otra pagina.

jsp:plugin Genera las etiquetas para el plugin de JAVA para elnavegador.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 19: JSP: Java Server Pages - Universidad Complutense de Madrid

Accion jsp:include I

<jsp:include page="jsp/cabecera.jsp" />

<h1>ıCaptulo 1</h1>

<jsp:include page="html/capitulo1.html" />

<h1>ıCaptulo 2</h1>

<jsp:include page="html/capitulo2.html" />

<h1>ıCaptulo 3</h1>

<jsp:include page="html/capitulo3.html" />

<h1>ıCaptulo 4</h1>

<jsp:include page="html/capitulo4.html" />

< %@ include file="jsp/pie.jsp" %>

out.write("<!-- $Id: transparencias.tex ,v 1.3 2007 -05 -14 17:14:33 luis Exp $ -->\n");

JspRuntimeLibrary.include(request , response , "html/cabecera.html", out , false);

out.write("\n");

out.write("<h1>ıCaptulo 1");

out.write("</h1 >\n ");

JspRuntimeLibrary.include(request , response , "html/capitulo1.html", out , false);

out.write("\n");

out.write("<h1>ıCaptulo 2");

out.write("</h1 >\n ");

JspRuntimeLibrary.include(request , response ,

"html/capitulo2.html", out , false);

/* Resto de la otraduccin */

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 20: JSP: Java Server Pages - Universidad Complutense de Madrid

Accion jsp:include II

Date date = new Date ();

DateFormat df = new SimpleDateFormat("dd’ de ’MMMM’ de ’yyyy");

out.write("\n ");

out.write("<p>");

out.print(df.format(date ));

out.write("</p>\n ");

out.write("</body >\n");

out.write("</html >\n");

out.write("\n");

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 21: JSP: Java Server Pages - Universidad Complutense de Madrid

Las habichuelas Java I

Un JavaBean es un objeto de una clase cuyos metodos publicosson de la forma getXXXX o setXXXX.

public class Valor extends TagSupport {

public final static int ACCIONES =1;

public final static int FONDOS =2;

public final static String strAcciones="acciones";

public final static String strFondos="fondos";

private String nombre=null;

private String ibex_id=null;

private int tipo =0;

private String url=null;

public Valor () {

super ();

}

public void setNombre(String _nombre) {

nombre = _nombre;

}

public String getNombre () {

return nombre;

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 22: JSP: Java Server Pages - Universidad Complutense de Madrid

Las habichuelas Java II

public void setIbex_id(String _ibex_id) {

ibex_id = _ibex_id;

}

public String getIbex_id () {

return ibex_id;

}

public void setUrl(String _url) {

url = _url;

}

public String getUrl () {

return url;

}

public void setTipo(int _tipo) {

tipo = _tipo;

}

public int getTipo () {

return tipo;

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 23: JSP: Java Server Pages - Universidad Complutense de Madrid

Las habichuelas Java III

public String getDatos () {

StringBuffer out = new StringBuffer ();

out.append("<dl >\n");

out.append(" <dt >Nombre <dd ><a href=\""+url+"\">"+nombre+"</a>");

out.append(" <dt >Apellidos <dd>"+ibex_id );

out.append(" <dt >Tipo <dd>"+(tipo ==1?"acciones":"fondos"));

out.append("</dl >\n");

return out.toString ();

}

public static int parse(String s) {

if (s.equals(strAcciones )) {

return ACCIONES;

} else if (s.equals(strFondos )) {

return FONDOS;

} else {

throw new TipoValorException("La cadena ’"+s+"’ no representa un tipo de valor");

}

}

public final int doStartTag () throws JspException {

..........................

}

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 24: JSP: Java Server Pages - Universidad Complutense de Madrid

Las habichuelas Java IV

Indicar que se va a usar un JavaBean

<jsp:useBean id="valor" scope="request" class="valores.Valor"/>

id El nombre que le damos al objeto

scope El ambido donde vive el objeto

request Valido para el request. Valor pordefecto

session Valido para la sesion.application Valido para todas paginas que

comparten el ServletContext.

class La clase que define el JavaBean

type El tipo estatico (la clase o una superclase suya).

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 25: JSP: Java Server Pages - Universidad Complutense de Madrid

Las habichuelas Java

Dar valores a los campos del JavaBean. El normal, pone el valorque se indique

<jsp:useBean id="nombre" ... />

...

<jsp:setProperty name="nombre"

property="propiedad" ... />

Solo da el valor si construye el objeto.

<jsp:useBean id="myName" ... >

...

<jsp:setProperty name="myName"

property="someProperty" ... />

</jsp:useBean >

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 26: JSP: Java Server Pages - Universidad Complutense de Madrid

Las habichuelas Java

El jsp:setProperty puede tener los siguientes atributos:

name Usa el JavaBean cuyo id se indique.

property Indica el nombre de la propiedad que se quiera poner.El valor * indica los parametros del request que casecon algun setXXXX del JavaBean.

value (Opcional) el valor que se da la propiedad.

param (Opcional) el valor se toma del parametro de requestque se indica. Si no existe tal parametro no se hacenada.

Se pueden omitir tanto value como param, entonces el valor setoma del parametro del request cuyo nombre es property.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 27: JSP: Java Server Pages - Universidad Complutense de Madrid

Las habichuelas Java

Invoca al metodo elAgenda.setNombre("Patata").

<jsp:setProperty name="valor" property="nombre" value="Patata"/>

Si request.getParameter("patata") no es null, llama avalor.setNombre(request.getParameter("patata")).

<jsp:setProperty name="valor" property="nombre" value="patata"/>

Si request.getParameter("nombre") no es null, llama avalor.setNombre(request.getParameter("nombre")).

<jsp:setProperty name="valor" property="nombre"/>

Rellena los el JavaBean con los parametros del request, si no hayno hace nada.

<jsp:setProperty name="valor" property="*"/>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 28: JSP: Java Server Pages - Universidad Complutense de Madrid

Las habichuelas Java

Acceder valores a los campos del JavaBean.

<dl>

<dt>Nombre </dt>

<dd><a href=’<jsp:getProperty name="valor" property="url"/>’>

<jsp:getProperty name="valor" property="nombre"/></a></dd>

<dt>Ibex ID</dt>

<dd><jsp:getProperty name="valor" property="ibex_id"/></dd>

<dt>Tipo</dt><dd><jsp:getProperty name="valor" property="strTipo"/></dd>

</dl>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 29: JSP: Java Server Pages - Universidad Complutense de Madrid

Las habichuelas Java

<body>

<jsp:useBean id="valor" scope="request" class="valores.Valor"/>

<jsp:setProperty name="valor" property="*"/>

< %

if (valor.getNombre ()== null || valor.getIbex_id ()== null ||

valor.getUrl ()== null || valor.getTipo ()==0 ) {

String nombre = valor.getNombre ()== null?"":valor.getNombre ();

String ibex_id = valor.getIbex_id ()== null?"":valor.getIbex_id ();

String url = valor.getUrl ()== null?"":valor.getUrl ();

int tipo = valor.getTipo ()==0?0: valor.getTipo ();

%>

<form action="pr5.jsp" method="get">

<p>

<label>Nombre:</label ><input name="nombre" value="< %=nombre %>"><br>

<label>ibex_id:</label ><input name="ibex_id" value="< %=ibex_id %>"><br>

<label>URL: </label><input name="url" value="< %=url %>"><br>

<label>Tipo </label>

<select name="tipo">

<option value="< %=Valor.ACCIONES %>">Acciones </option >

<option value="< %=Valor.FONDOS %>">Fondos </opcion >

</select >

<button type="submit">Enviar </button >

</p>

</form>

< % } else { %>

<jsp:getProperty name="valor" property="datos"/>

< % } %>

</body>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 30: JSP: Java Server Pages - Universidad Complutense de Madrid

Taglibs definidas por el usuario

1 La sintaxis de las acciones jsp es XML

<jsp:useBean id="valor" scope="request" class="valores.Valor"/>

<jsp:setProperty name="valor" property="*"/>

2 El XML mola mucho

3 La implementacion de los servlets es Software Libre

Por que no puedo hacerlo yo para mis propias aplicaciones?Por que no puedo definir algo como?

<valores:entrada nombre="< %=nombre %>"

idex_id="< %=apellidos %>" tipo="< %=tipo %>"/>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 31: JSP: Java Server Pages - Universidad Complutense de Madrid

Taglibs definidas por el usuario

¿Que hace falta?

Fichero de descripcion de las etiquetas .tld.

Un manejador que implementa lo que quiero hacer con misetiquetas.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 32: JSP: Java Server Pages - Universidad Complutense de Madrid

Ficheros tld

Es un fichero XML

<?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>Valor </short -name>

<tag>

<name>entrada </name>

<tag -class>valores.Valor</tag -class>

<body -content >empty</body -content >

<attribute >

<name>nombre </name>

<required >true</required >

<rtexprvalue >true</rtexprvalue >

</attribute >

<!-- ams atributos -->

</tag>

<!-- ams marcas tag -->

</taglib >

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 33: JSP: Java Server Pages - Universidad Complutense de Madrid

Ficheros tld

Las etiquetas de la cabecera son todas opcionales, menos:

tlib-version Version de la librerıa.

jsp-version Version de JSP de la que depende.

short-name Nombre corto. Puede ser usado por las aplicacionescomo prefijo preferido.

El resto de las marcas son uri, display-name, small-icon,large-icon, description, validator, listener. Luego puedehaber una o mas marcas tag.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 34: JSP: Java Server Pages - Universidad Complutense de Madrid

Ficheros tld. Marca tag

name nombre de la etiqueta

tag-class la clase (manejador) que implementa la etiqueta.

body-content Puede tomar los valores

JSP El contenido es JSP que se debeinterpretar.

tagdependent El contenido esta en otro lenguaje,por ejemplo SQL.

empty No tiene cuerpo.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 35: JSP: Java Server Pages - Universidad Complutense de Madrid

Ficheros tld. Marca tag

attribute Los atributos que puede tener, Contiene lassiguientes marcas:

name el nombre del atributorequired el el atributo es opcional o no (true o

false).rtexprvalue si el contenido es estatico o no (true

o false).

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 36: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags sin cuerpo I

javax.servlet.jsp.tagext.Tag

javax.servlet.jsp.tagext.TagSupport

1 InicializacionsetPageContext(),setParent(), los setXXXX.

2 doStartTag() que devuelveSKIP_BODY (si no haycuerpo) oEVAL_BODY_INCLUDE.

3 doEndTag() que devuelveEVAL_PAGE o SKIP_PAGE

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 37: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags sin cuerpo II

package valores;

import javax.servlet.jsp.tagext.TagSupport;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import java.io.IOException;

public class Valor extends TagSupport {

private String nombre=null;

private String ibex_id=null;

private int tipo =0;

private String url=null;

public final String getNombre () {

return nombre;

}

public final void setNombre(final String newNombre) {

this.nombre = newNombre;

}

/* ams getters y setters */

public Valor () {

super ();

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 38: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags sin cuerpo III

public final int doStartTag () throws JspException {

JspWriter out = pageContext.getOut ();

try {

out.write("<dl >\n");

out.write(" <dt >Nombre <dd ><a href =\""+url+"\">"+nombre+" </a>");

if (ibex_id !=null) {

out.write(" <dt>Ibex ID<dd>"+ibex_id );

}

out.write(" <dt >Tipo <dd>"+(tipo== ACCIONES?strAcciones:strFondos ));

out.write("</dl >\n");

} catch (IOException e) {

throw new JspException("IO exception "+e.getMessage (),e);

}

return super.EVAL_BODY_INCLUDE;

}

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 39: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags con cuerpo I

javax.servlet.jsp.tagext.BodyTag

javax.servlet.jsp.tagext.BodyTagSupport

1 Inicializacion setPageContext(),setParent(), los setXXXX.

2 doStartTag() que devuelveSKIP_BODY (si no hay cuerpo) oEVAL_BODY_INCLUDE,EVAL_BODY_BUFFERED,

3 doInitBody(),setBodyContent().

4 doAfterBody una o mas veces.Devuelve EVAL_BODY_AGAIN paraevaluar otra vez o SKIP_BODYpara finalizar.

5 doEndTag() que devuelveEVAL_PAGE o SKIP_PAGE

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 40: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags con cuerpo II

< %@ taglib uri="/WEB -INF/valores.tld" prefix="valores" %>

<valores:repite ini="5" fin="8">

< % if (ibex_id ==null || ibex_id.equals("")) { %>

<valores:entrada nombre="< %=nombre %>" url="< %=url %>" tipo="< %=tipo %>" />

< % } else { %>

<valores:entrada nombre="< %=nombre %>" ibex_id="< %=ibex_id %>" url="< %=url %>" tipo="< %=tipo %>" />

< % } %>

</valores:repite >

<tag>

<name>repite </name>

<tag -class>valores.Repite </tag -class >

<body -content >JSP</body -content >

<attribute >

<name>ini</name>

<required >true</required >

<rtexprvalue >true</rtexprvalue >

</attribute >

<attribute >

<name>fin</name>

<required >true</required >

<rtexprvalue >true</rtexprvalue >

</attribute >

</tag>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 41: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags con cuerpo III

package valores;

import javax.servlet.jsp.tagext.BodyTagSupport;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyContent;

import java.io.IOException;

public class Repite extends BodyTagSupport {

private int ini;

private int fin;

private int act;

/* getters and setters */

public final void doInitBody () throws JspException {

act = ini;

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 42: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags con cuerpo IV

public final int doAfterBody () throws JspException {

act ++;

if (act <=fin) {

return EVAL_BODY_BUFFERED;

} else {

return SKIP_BODY;

}

}

public final int doEndTag () throws JspException {

BodyContent body = getBodyContent ();

try {

body.writeOut(pageContext.getOut ());

} catch (IOException e) {

throw new JspException("IOException: "+e.getMessage (),e);

}

return EVAL_PAGE;

}

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 43: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags con cuerpo V

¿Funciona bien con la siguiente?

<valores:repite ini="8" fin="5">

<valores:entrada nombre="< %=nombre %>" ibex_id="< %=ibex_id %>"

tipo="< %=tipo %>"/>

</valores:repite >

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 44: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags con cuerpo VI

<valores:mysql -conexion database="valores" host="localhost"

user="luis" password="patata">

<valores:busca ibex_id="< %=ibex_id %>"/>

</valores:mysql -conexion >

La etiqueta valores:mysql-conexion construye la conexionconnection.

public final int doStartTag () throws JspException {

try {

Class.forName("com.mysql.jdbc.Driver"). newInstance ();

connection = DriverManager.getConnection("jdbc:mysql ://"+host+

"/"+database+"?user="+user+

"&password="+password );

} catch (Exception e) {

throw new JspException("oExcepcin"+e.getClass (). getName ()+

" "+e.getMessage (),e);

}

return EVAL_BODY_BUFFERED;

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 45: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags con cuerpo VII

public final int doEndTag () throws JspException {

try {

BodyContent body = getBodyContent ();

body.writeOut(pageContext.getOut ());

connection.close ();

} catch (Exception e) {

throw new JspException("oExcepcin

"+e.getClass (). getName ()+

": "+e.getMessage (),e);

}

return EVAL_PAGE;

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 46: JSP: Java Server Pages - Universidad Complutense de Madrid

Tags con cuerpo VIII

La clase que implementa valores:mysql-conexion tiene elgetConnection(). La clase que implementa la busqueda debeacceder a ella.

public final int doEndTag () throws JspException {

try {

Conexion conexion = (Conexion)findAncestorWithClass(

this ,

Class.forName("valores.Conexion"));

Connection con = conexion.getConnection ();

String sql = "select * from valores "+

"where ibex_id like ’ %"+ibex_id+" %’";

PreparedStatement psmt = con.prepareStatement(sql);

ResultSet rs = psmt.executeQuery ();

JspWriter out = pageContext.getOut ();

out.write("<p>Resultados </p>");

/* Se muestran los resultado */

} catch (Exception e) {

throw new JspException("oExcepcin "+e.getClass (). getName ()+

": "+e.getMessage (),e);

}

return EVAL_PAGE;

}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 47: JSP: Java Server Pages - Universidad Complutense de Madrid

JSTL Tags

http://docs.oracle.com/javaee/5/jstl/1.1/docs/

tlddocs/index.html

Core Tags

Formatting tags

SQL tags

XML tags

JSTL Functions

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 48: JSP: Java Server Pages - Universidad Complutense de Madrid

Standard tag library I

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

< %@ page import="valores.Valor" %>

<!DOCTYPE HTML PUBLIC " -//W3C//DTD HTML 4.01// EN">

<html>

<head>

<meta http -equiv="Content -Type" content="text/html; charset=utf -8">

<title>Prueba 5 de JSPs</title>

</head>

<body>

<jsp:useBean id="valor" scope="request" class="valores.Valor"/>

<jsp:setProperty name="valor" property="*"/>

<c:choose >

<c:when test="${empty valor.nombre}">

<form action="pr9.jsp" method="get">

<label>Nombre:</label><input name="nombre" value="${valor.nombre}"><br>

<label>ibex_id:</label ><input name="ibex_id" value="${valor.ibex_id}"><br>

<label>URL: </label><input name="url" value="${valor.url}"><br>

<label>Tipo </label>

<select name="tipo">

<option value="< %=Valor.ACCIONES %>">Acciones </option >

<option value="< %=Valor.FONDOS %>">Fondos </opcion >

</select >

<button type="submit">Enviar </button >

</form>

</c:when>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 49: JSP: Java Server Pages - Universidad Complutense de Madrid

Standard tag library II

<c:otherwise >

<dl>

<dt>Nombre:</dt><dd><a href="<c:url value=’${valor.url}’/>">

<c:out value="${valor.nombre}"/></a></dd>

<dt>ID:</dt><dd> <c:out value="${valor.ibex_id}"/></dd>

<dt>Tipo:</dt><dd> <c:out value="${valor.strTipo}"/></dd>

</c:otherwise >

</c:choose >

</body> </html>

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 50: JSP: Java Server Pages - Universidad Complutense de Madrid

Objetos implicitos (lenguage EL) I

pageContext The context for the JSP page. Provides access tovarious objects including:

servletContext The context for the JSP page’sservlet and any web componentscontained in the same application.

session The session object for the client.request The request triggering the execution of

the JSP page.response The response returned by the JSP page.

param Maps a request parameter name to a single value.

paramValues Maps a request parameter name to an array ofvalues.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 51: JSP: Java Server Pages - Universidad Complutense de Madrid

Objetos implicitos (lenguage EL) II

header Maps a request header name to a single value.

headerValues Maps a request header name to an array of values.

cookie Maps a cookie name to a single cookie.

initParam Maps a context initialization parameter name to asingle value.

pageScope Maps page-scoped variable names to their values.

requestScope Maps request-scoped variable names to theirvalues.

sessionScope Maps session-scoped variable names to theirvalues.

applicationScope Maps application-scoped variable names totheir values.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 52: JSP: Java Server Pages - Universidad Complutense de Madrid

Core Tags I

http://docs.oracle.com/javaee/5/jstl/1.1/docs/

tlddocs/c/tld-summary.html

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

catch Catches any Throwable that occurs in its body andoptionally exposes it.

choose Simple conditional tag that establishes a context formutually exclusive conditional operations, marked by<when> and <otherwise>

if Simple conditional tag, which evalutes its body if thesupplied condition is true and optionally exposes aBoolean scripting variable representing the evaluationof this condition

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 53: JSP: Java Server Pages - Universidad Complutense de Madrid

Core Tags II

import Retrieves an absolute or relative URL and exposes itscontents to either the page, a String in ’var’, or aReader in ’varReader’.

forEach The basic iteration tag, accepting many differentcollection types and supporting subsetting and otherfunctionality

forTokens Iterates over tokens, separated by the supplieddelimeters

out Like < %= ... >, but for expressions.

otherwise Subtag of <choose> that follows <when> tags and runs onlyif all of the prior conditions evaluated to ’false’

param Adds a parameter to a containing ’import’ tag’s URL.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 54: JSP: Java Server Pages - Universidad Complutense de Madrid

Core Tags III

redirect Redirects to a new URL.

remove Removes a scoped variable (from a particular scope,if specified).

set Sets the result of an expression evaluation in a ’scope’

url Creates a URL with optional query parameters.

when Subtag of <choose> that includes its body if its conditionevalutes to ’true’

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 55: JSP: Java Server Pages - Universidad Complutense de Madrid

SQL I

http://docs.oracle.com/javaee/5/jstl/1.1/docs/

tlddocs/sql/tld-summary.html

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

setDataSource Creates a simple DataSource suitable only forprototyping.

transaction Provides nested database action elements with ashared Connection, set up to execute all statementsas one transaction.

query Executes the SQL query defined in its body orthrough the sql attribute.

update Executes the SQL update defined in its body orthrough the sql attribute.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 56: JSP: Java Server Pages - Universidad Complutense de Madrid

SQL II

param Sets a parameter in an SQL statement to thespecified value.

dateParam Sets a parameter in an SQL statement to thespecified java.util.Date value.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 57: JSP: Java Server Pages - Universidad Complutense de Madrid

Formato I

http://docs.oracle.com/javaee/5/jstl/1.1/docs/

tlddocs/fmt/tld-summary.html

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

requestEncoding Sets the request character encoding

setLocale Stores the given locale in the locale configurationvariable

timeZone Specifies the time zone for any time formatting orparsing actions nested in its body

setTimeZone Stores the given time zone in the time zoneconfiguration variable

bundle Loads a resource bundle to be used by its tag body

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages

Page 58: JSP: Java Server Pages - Universidad Complutense de Madrid

Formato II

setBundle Loads a resource bundle and stores it in the namedscoped variable or the bundle configuration variable

message Maps key to localized message and performsparametric replacement

param Supplies an argument for parametric replacement toa containing ¡message¿ tag

formatNumber Formats a numeric value as a number, currency, orpercentage

parseNumber Parses the string representation of a number,currency, or percentage

formatDate Formats a date and/or time using the supplied stylesand pattern

parseDate Parses the string representation of a date and/or time

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JSP: Java Server Pages