Interactuar con el contenido de un tag

2057 vistas

Puede ser interesante interactuar con el cuerpo de una etiqueta. Por ejemplo, en el caso de un tag iterativo, podemos necesitar el número de iteración en el body.

Para ello, bastará con almacenar algunos elementos en algún scope (página, consulta, sesión, aplicación)...

Vamos a retomar el ejemplo de [iurl=90&all=0&fs=1129#1136]Crear un tag iterativo[/iurl] y pondremo el número de línea en el scope "page".

Nuestro código será ahora:



java
  1. public class IterateTag extends TagSupport {
  2.  
  3.   private int count = 0;
  4.   private int current = 0;
  5.  
  6.   public void setCount(int i) {
  7.       count = i;
  8.   }
  9.  
  10.   public int doStartTag() throws JspException {
  11.       current = 0;
  12.       if (current < count) {
  13.           pageContext.setAttribute("line", new Integer(current) );
  14.           return Tag.EVAL_BODY_INCLUDE;
  15.       }
  16.       return Tag.SKIP_BODY;
  17.   }
  18.  
  19.   public int doAfterBody() throws JspException {
  20.       current++;
  21.       if (current < count) {
  22.           pageContext.setAttribute("line", new Integer(current) );
  23.           return IterationTag.EVAL_BODY_AGAIN;
  24.       }
  25.       return Tag.SKIP_BODY;
  26.   }
  27.  
  28.   public int doEndTag() throws JspException {
  29.       pageContext.removeAttribute("line");
  30.       return Tag.EVAL_PAGE;
  31.   }
  32. }



Explicación:

  • Antes de cada evaluación del cuerpo, ponemos en el scope "page" un atributo "line" que contiene un Integer con el número de línea en curso.
  • En doEndTag(), borramos este atributo para no 'containar' inutilmente el resto de la página.

Uso:



html4strict
  1. <p:iterate count="3">LÃnea número <%=pageContext.getAttribute("line")%></p:iterate>



Resultado:



dos
  1. LÃnea número 0
  2. LÃnea número 1
  3. LÃnea número 2