2011-11-01 14 views
10

Chciałbym napisać niestandardowy tag JSP, którego wyniki zawierają inne znaczniki JSP, które same również powinny być dynamicznie oceniane. Ale najwyraźniej wszystko, co moja subklasa TagSupport zapisuje na pageContext.getOut(), przechodzi bezpośrednio do klienta bez dalszej oceny.Jak utworzyć niestandardowy tag JSP, który używa innych znaczników JSP?

Mam przeczucie, że to powinno być bardzo proste, ponieważ wydaje się jedną z pierwszych rzeczy, które chciałby używać niestandardowych tagów do: enkapsulacji i ponownego użycia innych niestandardowych tagów, unikając powielania kodu.

Jak mogę zrobić poniższy kod, robić to, co oczywiście chce zrobić ?:

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: Niektóre tła na moim konkretnym przypadku, czy to pomaga. Mam niestandardowy tag <user>, który dynamicznie renderuje nazwę użytkownika w sposób, który jest przydatny dla mojej aplikacji (najeżdżanie kursorem myszy na imię, nazwisko, numer telefonu itp.). Piszę teraz kolejny tag <comment> do wyświetlania komentarzy użytkowników i chciałbym użyć mojego istniejącego znacznika <user> do renderowania nazw użytkowników na wyjściu z tagu <comment>.

+0

To powinno pomóc: http://stackoverflow.com/ pytania/2502282/custom-jsp-tag-how-do-i-get-the-body-of-tag –

Odpowiedz

5

Można podzielić klasy na klasę znaczników i klasę tagRenderer.

W Twojej sytuacji pojawią się dwie nowe klasy o nazwie CommentTagRenderer i UserTagRenderer.

Oto przykład nowego 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; 
    } 

I tu jest przykładem 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

Skończyło się na zrobieniu czegoś podobnego - metodzie getHTML(), której sam tag używał do generowania jej wyników i które inne znaczniki mogłyby wykorzystać do osadzenia tego samego wyjścia w swoich własnych wynikach. Sądzę, że dobrze jest wiedzieć, że tak naprawdę nie ma innej drogi (bez wchodzenia do plików znaczników). –

14

Najprostszym sposobem jest napisać swój tag custome jako plik znaczników JSP, raczej niż w Javie. W ten sposób nowy tag może łatwo korzystać z innych niestandardowych tagów. Tworzenie myTag.tag pliku w katalogu/WEB-INF/tagów i użyć następującego kodu:

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

Więcej informacji o tagu pliki tutaj: http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html

+0

Dobrze o tym wiedzieć, choć nie wspomniałem w swoim pytaniu, że używanie plików znaczników nie było możliwe w moim konkretnym przypadku (w rzeczywistości dodam funkcje do dużego, wcześniej istniejącego projektu, który musi działać na starszym JDK bez obsługi plików znaczników). Wezwę jednak głosowanie, ponieważ jest to ogólnie poprawne rozwiązanie! –