2011-11-01 13 views
10

Vorrei scrivere un tag JSP personalizzato il cui output include altri tag JSP che dovrebbero essere anch'essi valutati dinamicamente. Ma a quanto pare tutto ciò che la sottoclasse scrive a pageContext.getOut() va direttamente al client senza ulteriori valutazioni.Come posso creare un tag JSP personalizzato che utilizza altri tag JSP?

Ho la sensazione che questo dovrebbe essere molto semplice, dal momento che sembra una delle prime cose che si vorrebbe usare tag personalizzati per: incapsulare e riutilizzare altri tag personalizzati, evitando la duplicazione del codice.

Come faccio a fare il seguente codice fare ciò che vuole, ovviamente, per fare ?:

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; 
    } 
} 

Edit: Alcuni retroscena sul mio particolare caso d'uso, se aiuta. Ho un tag personalizzato <user> che rende dinamicamente un nome utente in un modo che è utile per la mia applicazione (mouse-hover per nome, cognome, numero di telefono, ecc.). Ora sto scrivendo un altro tag <comment> per visualizzare i commenti degli utenti e vorrei utilizzare il mio tag <user> esistente per il rendering dei nomi utente nell'output del tag <comment>.

+0

Questo dovrebbe aiutare: http://stackoverflow.com/ questions/2502282/custom-jsp-tag-how-do-i-get-the-body-the-tag –

risposta

5

È possibile suddividere le classi in una classe di tag e una classe tagRenderer.

Nella vostra situazione ci sarebbero due nuove classi chiamate CommentTagRenderer e UserTagRenderer.

Ecco un esempio del nuovo 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; 
    } 

E qui è un esempio della 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

Ho finito per fare qualcosa di simile - un metodo getHTML() che il tag stesso usava per generare il suo output e quali altri tag potrebbero utilizzare per incorporare lo stesso output nel proprio output. Immagino sia bello sapere che non c'è davvero altro modo (senza entrare nei file di tag). –

14

Il modo più semplice è quello di scrivere il tag custome come un file di tag JSP, piuttosto rispetto a Java. In questo modo, il nuovo tag può utilizzare facilmente altre etichette personalizzate. Creare un file myTag.tag in/WEB-INF/tag, e utilizzare il seguente codice:

<%@ 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. 

Maggiori informazioni su tag dei file qui: http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html

+0

Questo è buono a sapersi, anche se ho trascurato di menzionare nella mia domanda che l'utilizzo di file di tag non era un'opzione nel mio caso particolare (in realtà sto aggiungendo funzionalità a un progetto grande, preesistente che deve essere eseguito su un vecchio JDK senza supporto file tag). Io ti voterò, però, perché questa è una soluzione valida in generale! –

Problemi correlati