2011-11-01 18 views
10

Me gustaría escribir una etiqueta JSP personalizada cuyo resultado incluya otras etiquetas JSP que también deberían ser evaluadas dinámicamente. Pero aparentemente todo lo que escribe mi subclase TagSupport en pageContext.getOut() va directamente al cliente sin ninguna evaluación adicional.¿Cómo puedo crear una etiqueta JSP personalizada que use otras etiquetas JSP?

Tengo la sensación de que esto debería ser muy simple, ya que parece ser una de las primeras cosas que querría usar etiquetas personalizadas para: encapsular y reutilizar otras etiquetas personalizadas, evitando la duplicación de código.

¿Cómo puedo hacer el siguiente código hace lo que obviamente quiere hacer ?:

public class MyTag extends TagSupport { 
    public int doStartTag() throws JspException { 
     try { 
      pageContext.getOut().println(
       "The output from this tag includes other tags " + 
       "like <mypackage:myOtherTag>this one</mypackage:myOtherTag> " + 
       "which should themselves be evaluated and rendered." 
      ) 
     } catch (IOException e) { 
      throw new JspException(e); 
     } 
     return SKIP_BODY; 
    } 
} 

Editar: Algunos antecedentes en mi caso en particular, si ayuda. Tengo una etiqueta personalizada <user> que representa dinámicamente un nombre de usuario de una manera que es útil para mi aplicación (mouse-hover para el nombre, apellido, número de teléfono, etc.). Ahora estoy escribiendo otra etiqueta <comment> para mostrar los comentarios de los usuarios, y me gustaría utilizar mi etiqueta <user> existente para representar nombres de usuario en el resultado de la etiqueta <comment>.

+0

Esto debería ayudar: http://stackoverflow.com/ questions/2502282/custom-jsp-tag-how-do-i-get-the-body-of-the-tag –

Respuesta

5

Puede dividir sus clases en una clase de etiqueta y una clase tagRenderer.

En su situación, habría dos nuevas clases llamadas CommentTagRenderer y UserTagRenderer.

Aquí es un ejemplo de la nueva CommentTag

public int doStartTag() throws JspException { 
    JspWriter out = pageContext.getOut(); 
    Comment comment = getComment(); 
    User user = getUser(); 

    CommentTagRenderer commentRenderer = new CommentTagRenderer(out); 
    UserTagRenderer userRenderer = new UserTagRenderer(out); 

    try { 
     commentRenderer.renderComment(comment); 
     userRenderer.renderUser(user);   
    } catch (IOException e) { 
     //some error handling 
    } 
    return SKIP_BODY; 
    } 

Y aquí es un ejemplo de la CommentTagRenderer

private Writer out; 
public CommentTagRenderer(Writer out) { 
    this.out = out; 
} 

public void renderComment(Comment comment) throws IOException { 
    out.write("<div>"); 
    out.write(comment.getComment()); 
    out.write("</div>"); 
} 
+0

Terminé haciendo algo similar - un método getHTML() que la etiqueta misma usaba para generar su salida y qué otras etiquetas podrían usar para insertar ese mismo resultado en su propia salida. Supongo que es bueno saber que realmente no hay otra manera (sin entrar en los archivos de etiquetas). –

14

La forma más fácil es escribir su etiqueta de atención al cliente al como un archivo de etiquetas JSP, en vez que en Java. De esta forma, la nueva etiqueta puede usar otras etiquetas personalizadas fácilmente. Crear un archivo en myTag.tag/WEB-INF/tags, y use el siguiente código:

<%@ tag %> 
<%@ attribute name="value" required="true" rtexprvalue="true" type="java.lang.String"%> 
<%@ taglib prefix="mypackage" uri="mypackage.tld" %> 
The output from this tag includes other tags 
like <mypackage:myOtherTag>${value}</mypackage:myOtherTag> 
which should themselves be evaluated and rendered. 

Más información acerca de archivos de etiquetas aquí: http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html

+0

Esto es bueno saberlo, aunque no mencioné en mi pregunta que el uso de archivos de etiquetas no era una opción en mi caso particular (en realidad estoy agregando características a un proyecto grande y preexistente que tiene que ejecutarse en un JDK sin soporte de archivos de etiquetas). Sin embargo, te votaré porque esta es una solución válida en general. –

Cuestiones relacionadas