# Bei eine eienen Tag auf einen Parent zugreifen.



## BlackReloaded (15. Dez 2008)

Hallo,

ich versuche mir gerade einen eigene TagLibrary zu schreiben, dabei stoße ich auf folgendes Problem:

Ich benötige in einer Struktur wie dieser, 

```
<myjsp:Template name="ganzneu">
          <myjsp:li name="Google" value="http://www.google.de" />
</myjsp:Template>
```
in der li Struktur die Attribute des Darüberliegenden-Elementes, also TemplateHeader. Die Frage die Sich mir Stellt ist wie soetwas zu bewerkstelligen ist? Es gibt zwar eine Methode getParent(), aber bei dieser bekomme ich ein null zurück.

Mein Code für die beiden Tags sieht wie folgt aus:


```
public class ListItem extends BodyTagSupport {

    private String name;
    private String value;
    private String tar;

    public String getTarget() {
        return tar;
    }

    public void setTarget(String tar) {
        this.tar = tar;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public int doStartTag() throws JspTagException {
        return SKIP_BODY;
    }

    @Override
    public int doAfterBody() throws JspTagException {
        return SKIP_BODY;
    }

    @Override
    public int doEndTag() throws JspTagException {
        StringBuffer buffer = new StringBuffer();
        buffer.append("[*]<a href=\"");
        buffer.append(value);
        buffer.append("\"");
        if (tar != null && !tar.equals("")) {
            buffer.append(" target=\"");
            buffer.append(tar);
            buffer.append("\"");
        }
        buffer.append(">");
        buffer.append(name);
        buffer.append("</a>\n");
        JspWriter jw = this.pageContext.getOut();
        BodyContent out = new BodyContentImpl(jw);
        if (out != null) {
            try {
                out.getEnclosingWriter().write(buffer.toString());
                System.out.println("ListItem:" + buffer.toString());
            } catch (IOException ex) {
                Logger.getLogger(ListItem.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        this.setBodyContent(out);
        return EVAL_PAGE;
    }
}
```

und 


```
public class Template extends BodyTagSupport {

    private String template;
    private String title;

    public String getTemplate() {
        return template;
    }

    public void setTemplate(String template) {
        this.template = template;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public int doStartTag() throws JspTagException {
        return EVAL_BODY_BUFFERED;
    }

    @Override
    public int doAfterBody() throws JspTagException {
        BodyContent bc = this.getBodyContent();
        if (bc != null) {
            try {
                StringBuffer buffer = new StringBuffer();
                buffer.append("<html>\n\t<head>\n\t\t<title>");
                buffer.append(title);
                buffer.append("</title>\n\t</head>\n\t<body>\n");
                buffer.append(bc.getString());
                buffer.append("\n\t</body>\n</html>");
                bc.clearBody();
                bc.getEnclosingWriter().write(buffer.toString());
            } catch (IOException ex) {
                Logger.getLogger(Template.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return SKIP_BODY;
    }

    @Override
    public int doEndTag() throws JspTagException {
        return EVAL_PAGE;
    }

    @Override
    public void setParent(Tag t) {
        super.setParent(t);
        System.out.println("Ich war hier"+t);
    }
}
```

Noch etwas, gibt es eine öglichkeit anzugeben welche Tags folgen müssen? z.B. es müssen 0...1 li Tags in dem Template Tag vorhanden sein?

Gruß
Marc


----------



## gex (15. Dez 2008)

Hi

Du könntest ja mal in den SourceCode der Struts Taglibs reinschauen.

Gruss


----------



## BlackReloaded (15. Dez 2008)

Hallo,

ich hatte schon versuch in die Apache Tag Library zu gucken, leider konnte ich die entprechenden stellen nicht ausfindigachen.

Hast du für die strucs einen Tipp für ich? Welchen Tag man gucken könnte und wo an die Src einsehen kann?

Gruß Marc


----------



## rico (16. Dez 2008)

Hi,

es gibt 2 Hilfsmethoden in der Klasse javax.servlet.jsp.tagext.TagSupport


```
TagSupport.getParent() 
TagSupport.findAncestorWithClass(Tag from, java.lang.Class klass)
```

diese sollten dir weiterhelfen.



> Noch etwas, gibt es eine öglichkeit anzugeben welche Tags folgen müssen?



Sowas gibt es nicht, du könntest höchstens probieren das selbst zu implementieren.
Also z.B. das du den BodyContent prüfst und diesen nur "renderst" wenn er ein [*] enthält.

LG rico


----------

