Estas en:

Catálogo de servicios
Autentia (PDF 6,2MB)

tríptico de Autentia
En formato comic...

Acceso de usuarios registrados:

Deseo registrarme

He olvidado mis datos de acceso

Registra tu empresa:

Descubre las ventajas de registrar tu empresa en AdictosAlTrabajo...

Registrar mi empresa

Listado de empresas ya registradas

Google

Últimos tutoriales

+Noticias Destacadas

+Comentarios Cómic

  2009-08-28 - 11:17:42 AM
   rcanales escribío:
    Completamente de acuerdo contigo. Yo no se quien hace las cuentas en tu empresa [...]
  2009-08-28 - 07:01:44 AM
   Anonimo escribío:
    pues yo tengo el cuello rigido como una piedra porque el aire acondicionado esta [...]
  2009-07-23 - 10:32:12 PM
   Jaime escribío:
    definitivamente la parte mas divertida es la de programar, y la explotacion lo v [...]
  2009-05-13 - 11:26:33 PM
   williarim escribío:
    Quiero felicitar al autor de estas historietas! Gracias por compartir con todos [...]
  2009-05-13 - 04:40:59 PM
   rcanales escribío:
    Hola Brunoise: Todo tiene perspectiva. El función de tus forma de ser y ver e [...]

+Enlaces


Tutorial desarrollado por

Roberto Canales Mora

Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia S.L., Ingeniero Técnico de Telecomunicaciones y Executive MBA por el Instituto de Empresa 2007. Perfíl Technorati

Experto en formación en: Dirección de proyectos informáticos, análisis y diseño UML, arquitectura Web, patrones de diseño y JEE a todos los niveles.

Puedes consultar mi CV y alguna de mis primeras aplicaciones (de los 90) aquí

Catálogo de servicios de Autentia

Descargar (6,2 MB)

Descargar en versión comic (17 MB)

AdictosAlTrabajo.com es el Web de difusión de conocimiento de Autentia.

Catálogo de cursos

Fecha de creación del tutorial: 2003-07-18

Comunicación entre elementos en páginas JSP 

Creación de JSPs

Los JSP, ya sabemos que son plantillas donde podemos utilizar distintos tipos de componentes (JavaBeans y TagsLibs) o insertar porciones de Java utilizando Scriplets ....

Aquí es donde debemos aportar nuestro conocimiento y sentido común, definiendo que elementos se deben utilizar en cada caso.

Os vamos a mostrar como, utilizar cada uno de los componentes y como interactúan entre sí y en función de la situación, proporcionaremos distintas directivas.

Vamos a partir de un JSPs que pone datos a la sesión y en la petición y que delega sobre otro, nuestro JSP objeto de estudio.

(Tanto las pantallas como el código están generados desde NetBeans 3.5 y no se han capturado más pasos porque ya existen otros tutoriales en este Web que muestran paso a paso cada una de las tareas realizadas)

Mostramos el código de nuestro BeanBasico

/*
 * rcbean.java
 *
 * Created on July 15, 2003, 12:21 AM
 */

package roberto;

import java.beans.*;

/**
 *
 * @author  Administrator
 */
public class rcbean extends Object implements java.io.Serializable {

    private static final String PROP_SAMPLE_PROPERTY = "PropiedadBasica";

    private String propiedadBasica = "Esta es la propiedad básica";

    private PropertyChangeSupport propertySupport;

    /** Creates new rcbean */
    public rcbean() {
propertySupport = new PropertyChangeSupport( this );
    }

    public String getPropiedadBasica() {
return propiedadBasica;
    }

    public void setPropiedadBasica(String value) {
String oldValue = propiedadBasica;
propiedadBasica = value;
propertySupport.firePropertyChange(PROP_SAMPLE_PROPERTY, oldValue, propiedadBasica);
    }


    public void addPropertyChangeListener(PropertyChangeListener listener) {
propertySupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
propertySupport.removePropertyChangeListener(listener);
    }

}

    

Y creamos un JSP que use este Bean

<%@page contentType="text/html"%>
<html>
<head><title>JSP Page</title></head>
<body>

<jsp:useBean id="beansimple" scope="page" class="roberto.rcbean" />
<jsp:getProperty name="beansimple" property="propiedadBasica" /> 

</body>
</html>

Y vemos que se muestra el valor de la propiedad

Acceder a un Bean desde un Scriptles

Desde cualquier parte de la página podemos acceder al Bean, a traves del id que le hemos asignado.

<%@page contentType="text/html"%>
<html>
<head><title>JSP Page</title></head>
<body>

<jsp:useBean id="beansimple" scope="page" class="roberto.rcbean" />
<jsp:getProperty name="beansimple" property="propiedadBasica" /> 

<% String sCadena = beansimple.getPropiedadBasica();
out.print("<br> <b>Volvemos a mostrar la cadana </b><br>" + sCadena); 
%>


</body>
</html>

Vemos el resultado

Todo tiene su explicación, si vemos el código que genera el JSP

 

Lectura de parámetros desde un Bean

Un Bean, deber ser un componente generico que deberiámos poder reutilizar en muchos tipos de aplicaciones distintas.

Si alguien nos pasa un parámetro (desde un CGI), podemos de un modo sencillo pasárselo a nuestro Bean a través de la propia etiqueta.

<%@page contentType="text/html"%>
<html>
<head><title>JSP Page</title></head>
<body>

<jsp:useBean id="beansimple" scope="page" class="roberto.rcbean" />
<jsp:setProperty name="beansimple" property="propiedadBasica" param="cadenapasada" />

<% String sCadena = beansimple.getPropiedadBasica();
out.print("<b>Volvemos a mostrar la cadena </b><br>" + sCadena); 
%>

</body>
</html>

Si pasamos el parámetro, aparecerá

 

Paso de un parámetro de petición a un Bean

El parámetro los enviamos desde el primer JSP

<%@page contentType="text/html"%>
<html>
<head><title>JSP Page</title></head>
<body>
Este JSP los usaremos como punto de entrada

<% 
request.setAttribute("valorpasado","Parametro enviado desde JSPINICIAL"); 
%>

<jsp:forward page="/jspobjetivo.jsp" /> 

</body>
</html>

Y lo leemos desde el segundobJSP

<%@page contentType="text/html"%>
<html>
<head><title>JSP Page</title></head>
<body>

<jsp:useBean id="beansimple" scope="page" class="roberto.rcbean" />
<jsp:setProperty name="beansimple" property="propiedadBasica" 

value='<%= request.getAttribute("valorpasado") %>' />

<% String sCadena = beansimple.getPropiedadBasica();
out.print("<b>Volvemos a mostrar la cadena </b><br>" + sCadena); 
%>

</body>
</html>

 

TagLibs simples y procesamiento de parámetros

Para simplificar la complejidad de las páginas JSPs, se crean nuevas etiquetas, de tal modo que los diseñadores gráficos no tienen necesidad de  conocer Java para interactuar con los objetos que deben formatear.

Vamos a crear una etiqueta que muestre un mensaje en pantalla, concatenando un valor recogido como parámetro. Es decir, esta etiqueta hace transparente al diseñador como se adquiere, valida o transforma. 

package roberto;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTag;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;

public class RctagsimpleTag extends BodyTagSupport {
    private String parametro;

    public RctagsimpleTag() {
super();
    }

    public void otherDoStartTagOperations()  {
   try
   {
       JspWriter out = pageContext.getOut();
       String sParametro = pageContext.getRequest().getParameter(parametro);

       out.println("El parámetro en la tag es: " + sParametro);
   }
   catch (java.io.IOException ex)
   {
       // do something
   }
     }

   public boolean theBodyShouldBeEvaluated()  {
       return true;

    }

   public void otherDoEndTagOperations()  {

    }

    public boolean shouldEvaluateRestOfPageAfterEndTag()  {
     return true;

    }

public int doStartTag() throws JspException, JspException {
otherDoStartTagOperations();

if (theBodyShouldBeEvaluated()) {
    return EVAL_BODY_BUFFERED;
} else {
    return SKIP_BODY;
}
    }

   public int doEndTag() throws JspException, JspException {
otherDoEndTagOperations();

if (shouldEvaluateRestOfPageAfterEndTag()) {
    return EVAL_PAGE;
} else {
    return SKIP_PAGE;
}
    }

    public String getParametro() {
return parametro;
    }

    public void setParametro(String value) {
parametro = value;
    }

    public void writeTagBodyContent(JspWriter out, BodyContent bodyContent) throws IOException {
bodyContent.writeOut(out);
bodyContent.clearBody();
    }

   public void handleBodyContentException(Exception ex) throws JspException {
// Since the doAfterBody method is guarded, place exception handing code here.
throw new JspException("error in RctagsimpleTag: " + ex);
    }

  public int doAfterBody() throws JspException {
try {

    JspWriter out = getPreviousOut();
    BodyContent bodyContent = getBodyContent();

    writeTagBodyContent(out, bodyContent);
} catch (Exception ex) {
    handleBodyContentException(ex);
}

if (theBodyShouldBeEvaluatedAgain()) {
    return EVAL_BODY_AGAIN;
} else {
    return SKIP_BODY;
}
    }

  public boolean theBodyShouldBeEvaluatedAgain() {
       return false;
    }
}

Creamos el JSP. Como podemos observar, no hay Scriptlet por ningún lado.

<%@page contentType="text/html"%>
<%@taglib uri="rctags.tld" prefix="rc"%>

<html>
<head><title>JSP Page</title></head>
<body>

Vamos a recoger un parametro y pasárselo al Tag
<br>

<b>
<rc:rctagsimple parametro="parametropasado" />
</b>

</body>
</html>

Y la página resultante:

No olvidar que hace falta el descriptor para que funcione el tag ..... rctags.tld

<?xml version="1.0" encoding="UTF-8" ?>

<!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>rctags</short-name>
<uri>/rctags</uri>
<display-name>rctags</display-name>
<small-icon></small-icon>
<large-icon></large-icon>
<description>A blank tag library template. 
</description> 
<!-- Forte4J_TLDX: This comment contains code generation information. Do not delete.
<tldx>
<tagHandlerGenerationRoot>classes</tagHandlerGenerationRoot>
<JarFile></JarFile>
</tldx>
--> <tag>
<name>rctagsimple</name>
<tag-class>roberto.RctagsimpleTag</tag-class>
<body-content>empty</body-content>
<small-icon></small-icon>
<large-icon></large-icon>
<description></description>
<!-- Forte4J_TLDX: This comment contains code generation information. Do not delete.
<tldx>
<packagename>roberto</packagename>
<extendsSupportClass>TRUE</extendsSupportClass>
<supportClass>BodyTagSupport</supportClass>
<implementsTryCatchFinally>FALSE</implementsTryCatchFinally>
<findparent>FALSE</findparent>
<parenttype></parenttype>
<parentvariable></parentvariable>
</tldx>
-->
<attribute>
<name>parametro</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>String</type>
<!-- Forte4J_TLDX: This comment contains code generation information. Do not delete.
<tldx>
<javaVariable></javaVariable>
<IsReferenceID>FALSE</IsReferenceID>
<ReferencesTag>FALSE</ReferencesTag>
<ReferenceScope>Session</ReferenceScope>
<ReferencesTagType></ReferencesTagType>
<ReferencesTagVariable></ReferencesTagVariable>
<ReferencesTagReferentFirst>TRUE</ReferencesTagReferentFirst>
</tldx>
-->
</attribute>
<example></example>
</tag>

<!-- Validators are new in JSP1.2. You may have zero or one validator
in a tag library. They look like this:
<validator>
<validator-class>org.your.web.app.ValidateTaglibUsage</validator-class>
<init-param>
<param-name>aparameter</param-name>
<param-value>value</param-value>
<description>Describe this parameter</description>
</init-param>
</validator>
-->

<!-- listeners are new in JSP1.2. You may have as many listeners as you like
in a tag library. They look like this:
<listener>
<listener-class>org.your.web.app.TaglibListener1</listener-class> 
</listener>
-->
</taglib>

Y tambien hay que incluir un par de lineas en el web.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
<welcome-file>
index.html
</welcome-file>
<welcome-file>
index.htm
</welcome-file>
</welcome-file-list>
<taglib>
    <taglib-uri>rctags.tld</taglib-uri>
    <taglib-location>rctags.tld</taglib-location>
</taglib>

</web-app>

Como sabemos.... todo tiene un porqué ... así que ... si vemos el código del servlet que se genera

// begin [file="/jspcontagsimple.jsp";from=(11,0);to=(11,46)]
/* ----  rc:rctagsimple ---- */
roberto.RctagsimpleTag _jspx_th_rc_rctagsimple_0 = new roberto.RctagsimpleTag();
_jspx_th_rc_rctagsimple_0.setPageContext(pageContext);
_jspx_th_rc_rctagsimple_0.setParent(null);
_jspx_th_rc_rctagsimple_0.setParametro("parametropasado");
try {
    int _jspx_eval_rc_rctagsimple_0 = _jspx_th_rc_rctagsimple_0.doStartTag();
    if (_jspx_eval_rc_rctagsimple_0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
try {
    if (_jspx_eval_rc_rctagsimple_0 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {
      out = pageContext.pushBody();
      _jspx_th_rc_rctagsimple_0.setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);
      _jspx_th_rc_rctagsimple_0.doInitBody();
  }
  do {
  // end
  // begin [file="/jspcontagsimple.jsp";from=(11,0);to=(11,46)]
  } while (_jspx_th_rc_rctagsimple_0.doAfterBody() == javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN);
      } finally {
  if (_jspx_eval_rc_rctagsimple_0 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)
      out = pageContext.popBody();
      }
  }
  if (_jspx_th_rc_rctagsimple_0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE)
      return;
      } finally {
  _jspx_th_rc_rctagsimple_0.release();
      }
  // end
  // HTML // begin [file="/jspcontagsimple.jsp";from=(11,46);to=(16,0)]

    

Para descargarnos los ficheros que hemos manejado hasta ahora pulsar aquí.

 

Comunicación entre un TAG y un JavaBean

Podemos crear variables dentro de nuestros tags  y luego hacerlos accesibles desde nuestro código JSP. 

El procedimiento es bastante simple ....

Creamos nuestro JSP, donde podemos ver que hemos creado un cadena de caracteres como un bean ... y mostramos en pantalla el valor

<%@page contentType="text/html"%>
<%@taglib uri="rctags.tld" prefix="rc"%>

<html>
<head><title>JSP Page</title></head>
<body>

<rc:rctagsimple parametro="parametropasado" />
<br> Y se lo proporcionamos a un Bean, en mayúsculas
<b>
<jsp:useBean id="valorsimple" scope="page" class="java.lang.String" />
<%= valorsimple %>

</b>

</body>
</html>

En nuestro TAG, podemos introducir un nuevo valor con el mismo ID y ámbito ... y ya hemos resuelto el problema

public void otherDoStartTagOperations()  {
   try
   {
       JspWriter out = pageContext.getOut();
       String sParametro = pageContext.getRequest().getParameter(parametro);
       String sParametroMayusculas = sParametro.toUpperCase();

       pageContext.setAttribute("valorsimple",sParametroMayusculas);
       
       out.println("El parámetro en la tag es: " + sParametro);
   }
   catch (java.io.IOException ex)
   {
       // do something
   }
     }
    

Si vemos el código que se genera a partir del servlet .. entenderemos el porqué

// begin [file="/jspcontagybean.jsp";from=(10,0);to=(10,70)]
java.lang.String valorsimple = null;
boolean _jspx_specialvalorsimple  = false;
 synchronized (pageContext) {
    valorsimple= (java.lang.String)pageContext.getAttribute("valorsimple",PageContext.PAGE_SCOPE);
    if ( valorsimple == null ) {
        _jspx_specialvalorsimple = true;
        try {
            valorsimple = (java.lang.String) java.beans.Beans.instantiate(this.getClass().getClassLoader(), "java.lang.String");
        } catch (ClassNotFoundException exc) {
             throw new InstantiationException(exc.getMessage());
        } catch (Exception exc) {
             throw new ServletException (" Cannot create bean of class "+"java.lang.String", exc);
        }
        pageContext.setAttribute("valorsimple", valorsimple, PageContext.PAGE_SCOPE);
    }
 }

Y podemos ver que obtenemos el resultado deseado

¿para que podríamos necesitar esto por ahora? pues supongo que realmente para poco.... si no queremos ser un poco chapuzas.... aunque esta técnica podría sernos útil para otras cosas  ... aunque ya veremos que todo puede ser útil.

Variables de Scripting

Hemos visto en el ejemplo anterior que creamos una variable en nuestro TAG y la hacemos pública (indirectamente a través de un Bean) a nuestro JSP.

Esto se puede mejorar, haciendo directamente pública la variables utilizando una técnica que se llama variables de Scripting.

Si vamos a NetBeans.. podemos hacerlo de un modo automático ... ya que hay que realizar varios pasos.

 

Le damos un nombre

Y decimos al sistema que regenere el código

Vemos que se ha creado una nueva clase .... RCtagsimpleTagTEI .. necesaria para hacer pública esta variable.

Y en nuestra clase principal han aparecido nuevos métodos

Ahora cambiaremos el código de nuestra tag para establecer el valor ...

Y modificamos la página JSP

<%@page contentType="text/html"%>
<%@taglib uri="rctags.tld" prefix="rc"%>

<html>
<head><title>JSP Page</title></head>
<body>

<rc:rctagsimple parametro="parametropasado">
<br> Y se lo proporcionamos a un Bean, en mayúsculas: --
<b>
<%= variableDelTag %>
</b>
--
</rc:rctagsimple>

</body>
</html>

y vemos que somos capaces de recuperar el valor sin necesidad de usar la declaración del bean .....

Podemos recuperar todo el código aquí

Conclusiones

Posibilidades de interacción entre elementos hay muchas.

Lo único que tenemos que tener en cuenta es que debemos proporcionar un juego de componentes, fundamentalmente de TAG, muy básicos y simples y que no requieran que los maquetadores deban saber demasiados tecnicismos.

Sobre el Autor ..

¿Qué te ha parecido el tutorial? Déjanos saber tu opinión y ¡vota!

Muy malo Malo Regular Bueno Muy bueno
 


(Sólo para usuarios registrados)

» Registrate y accede a esta y otras ventajas «

Anímate y coméntanos lo que pienses sobre este tutorial

Puedes opinar o comentar cualquier sugerencia que quieras comunicarnos sobre este tutorial; con tu ayuda, podemos ofrecerte un mejor servicio.


(Sólo para usuarios registrados)

» Registrate y accede a esta y otras ventajas «

Autor Mensaje de usuario registrado

Creative Commons License Esta obra está licenciada bajo licencia Creative Commons de Reconocimiento-No comercial-Sin obras derivadas 2.5

Recuerda

Autentia te regala la mayoría del conocimiento aquí compartido (Ver todos los tutoriales). Somos expertos en: J2EE, Struts, JSF, C++, OOP, UML, UP, Patrones de diseño ... y muchas otras cosas.

¿Nos vas a tener en cuenta cuando necesites consultoría o formación en tu empresa?, ¿Vas a ser tan generoso con nosotros como lo tratamos de ser con vosotros?

Somos pocos, somos buenos, estamos motivados y nos gusta lo que hacemos ...

Autentia = Soporte a Desarrollo & Formación.

info@autentia.com

Tutoriales recomendados

Nombre Resumen
Fecha
Visitas Valoración Votos Pdf
Introducción a RichFaces. RichFaces es una librerí­a de componentes visuales para JSF con soporte para Ajax4JSF. 2010-02-01 460 - -
Tutorial basico de google wave bots En este tutorial crearemos un robot muy simple, que al invitarlo a un Wave sustituye una tag por la fecha y hora actual. 2009-11-18 2302 - -
Migración de JSP a Facelets Si tienes alguna aplicación que mantener basada en JSF y construida en JSPs, este tutorial te servirá para evaluar el coste de su migración a Facelets 2008-10-22 7141 Bueno 1
Jersey: la implemetación de RESTFull de Sun En este tutorial Germán nos enseña cómo usar RESTFull con la tecnología de Sun. 2008-04-05 2615 - -
Metro: pila de webservices de Sun. Integración con Maven 2 En este tutorial Germán nos enseñara a integrar la generación de webservices con Metro y Maven2. 2008-04-05 3232 - -
Genera gráficas como las de Google Chart con Eastwood Si no conoces JFreeChart pero quieres hacer gráficas tan llamativas como las de Google Chart, Eastwood te resultará muy útil 2008-04-03 3828 - -
Introducción a JPivot Nuestro compañero Juan nos enseña la librería JPivot que se utiliza para mostrar tablas dinámicas en Java 2008-03-04 10261 - -
Ejemplo de web con ICEfaces Creación de una web paso a paso con ICEFaces, Tomcat 5.5 y Eclipse 2008-01-16 19237 - -
Integración de JSF 1.2, Facelets e ICEFaces en Tomcat 6 Integración de JSF 1.2, Facelets e ICEFaces en Tomcat 6 2007-12-10 14039 - -
Spring WebFlow Tiles En este tutorial aprenderemos el uso de tiles para usarlo en conjunción con Spring WebFlow. 2007-11-26 5474 - -

Nota:

Los tutoriales mostrados en este Web tienen como objetivo la difusión del conocimiento. Los contenidos y comentarios de los tutoriales son responsabilidad de sus respectivos autores. En algún caso se puede hacer referencia a marcas o nombres cuya propiedad y derechos es de sus respectivos dueños. Si algún afectado desea que incorporemos alguna reseña específica, no tiene más que solicitarlo. Si alguien encuentra algún problema con la información publicada en este Web, rogamos que informe al administrador rcanales@adictosaltrabajo.com para su resolución.