# Iteration: JSP Custom Tag mit Scripting. Variablenübergabe?



## AyKay (19. Sep 2008)

Hallo zusammen

Ich habe gesucht und geflucht. Man muß wohl in ein Buch investieren, um einmal die JSP Custom Tags richtig erklärt zu bekommen. Nicht mal die SUN Tutorials taugen was. 

Wie werden denn nun richtig Variablen in JSP Tags angelegt und Werte übergeben? Hier mein Code:

Das ist die Tag Klasse. 

```
public class ForEachZipAATag extends BodyTagSupport
{
	String group = null;
	
	int index = 0;
	String[] zipActions = new String[] { 
			Constants.cmdAssetActionZip, 
			Constants.cmdAssetActionZipMacOS };
	
	public void setGroup(String group)
	{
		this.group = group;
	}
	
	public String group()
	{
		return group;
	}
	
	@Override
	public int doStartTag() throws JspException
	{
		if (index == 0)
		{
			pageContext.setAttribute(group, zipActions[index++]);
			return (EVAL_BODY_AGAIN);
		}
		
		return super.doStartTag();
	}
	
	@Override
	public int doAfterBody() throws JspException
	{
		if (index < zipActions.length) 
		{
			pageContext.setAttribute(id, zipActions[index++]);
			return (EVAL_BODY_AGAIN);
		} 

		index = 0;
		return SKIP_BODY;
	}
	
	@Override
	public int doEndTag() throws JspException
	{
		index = 0;
		return super.doEndTag();
	}
}
```

Hier ist die TEI Klasse dazu.


```
public class ForEachZipAATei extends TagExtraInfo
{
	public ForEachZipAATei()
	{
	}
	
	public VariableInfo[] getVariableInfo(TagData data) 
	{
	    Object groupAttribute = data.getAttribute("group");
	    if (groupAttribute == null || groupAttribute == TagData.REQUEST_TIME_VALUE)
	    	return null;

	    String group = (String)groupAttribute;
		String type = data.getAttributeString("group");
		
//		if (type == null)
			type = "java.lang.String";
		
		VariableInfo groupVariableInfo = new VariableInfo(group, type, true, VariableInfo.NESTED);
		VariableInfo[] variableInfos = new VariableInfo[] { groupVariableInfo };
		
		return variableInfos;
	}	
}
```

Das ist meine TLD:


```
<taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>ForEachZipAA</shortname>

  <tag>
    <name>ForEachZipAA</name>
    <tagclass>[PACKAGE-NAME].ForEachZipAATag</tagclass>
	<teiclass>[PACKAGE-NAME].ForEachZipAATei</teiclass>
    <bodycontent>jsp</bodycontent>
    <attribute>
      <name>group</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>
```

Und das ist schließlich meine JSP:


```
<select id="assetActionList">
							<dam:ForEachZipAA group="zipFormat">
								<option>{$zipFormat}</option>
							</dam:ForEachZipAA>
						</select>
```

Leider kann ich keine Fehlermeldung präsentieren. Die Software, auf der wir aufsetzen, fängt grandios alles ab. Es funzt halt nicht. 

Das ist ja Standard, deshalb hoffe ich auf eine Lösung. Daß das mit dem 'zipFormat' komisch aussieht, kann ich auch noch sehen. Ich habe aus dem üblen Tutorials und Code-Snipsel im Inet diverses Pattern-Matching betrieben. Klappt alles nicht.

Irgendeine Idee? 

Lieben Gruß
André


----------



## AyKay (19. Sep 2008)

Einen Fehler habe ich schon entdeckt:
Zeile 37 erste Klasse:
       pageContext.setAttribute(id, zipActions[index++]); 
muß natürlich heißen
       pageContext.setAttribute(group, zipActions[index++]);


----------



## AyKay (19. Sep 2008)

Das Ding läuft jetzt sogar durch und bricht nicht mehr ab.

Leider: Die Checkboxen werden nicht gefüllt.

Irgendwo ist ein Denkfehler. Ich weiß auch nicht, ob der Term 'zipFormat' rein symbolischen Wert hat und nur der Referenzierung innerhalb des JSPs dient.

Der Debugger sagt mir, daß das hier
VariableInfo groupVariableInfo = new VariableInfo(group, type, true, VariableInfo.NESTED); 
wie folgt gefüllt wird:

group = "zipFormat"
type = "java.lang.String" (natürlich


----------



## AyKay (22. Sep 2008)

Okay, da waren einige Tippfehler im Code. Hier eine funktionierende Version. Vielleicht dient das ja einigen als Muster beim Entdecken der JSP Custom Tag Technologie mit Variablen. Gute Beispiele habe ich im Inet kaum gefunden. 

Ich benutze als Variable einen simplen java.lang.String. Kann aber alles möglich Komplexe sein. Zugriff im JSP dann mit bekannter Punkt-Notierung: ${KLASSE.METHODE}
Datencontainer ist hier auch nur ein primitives Array (String[]). Im real Life wohl eher eine Collection mit Iterator, etc.

Die Variable wird mit pageContext.setAttribute der Seite verfügbar gemacht, sobald das Body-Tag bearbeitet ist.

Die Tag Klasse:


```
public class ForEachZipAATag extends BodyTagSupport
{
	String group = null;
	
	int index = 0;
	String[] zipActions = new String[] { 
			Constants.cmdAssetActionZip, 
			Constants.cmdAssetActionZipMacOS };
	
	public void setGroup(String group)
	{
		this.group = group;
	}
	
	public String getGroup()
	{
		return group;
	}
	
	@Override
	public int doStartTag() throws JspException
	{
		if (index == 0)
		{
			pageContext.setAttribute(group, zipActions[index++]);
			return EVAL_BODY_AGAIN;
		}

		return SKIP_BODY;
	}
	
	@Override
	public int doAfterBody() throws JspException
	{
		if (index < zipActions.length) 
		{
			pageContext.setAttribute(group, zipActions[index++]);
			return EVAL_BODY_AGAIN;
		} 

		return SKIP_BODY;
	}
	
	@Override
	public int doEndTag() throws JspException
	{
        BodyContent body = getBodyContent();
        try
        {
            if (body != null)
            {
                JspWriter out = getPreviousOut();
                out.print(body.getString());
                body.clearBody();
            }
        }
        catch (IOException ex)
        {
        	ex.printStackTrace();
        	throw new JspException(ex.getMessage());
        }

        return SKIP_BODY;
	}
}
```

Die TEI Klasse:


```
public class ForEachZipAATei extends TagExtraInfo
{
	public ForEachZipAATei()
	{
	}
	
	public VariableInfo[] getVariableInfo(TagData data) 
	{
	    Object groupAttribute = data.getAttribute("group");
	    if (groupAttribute == null || groupAttribute == TagData.REQUEST_TIME_VALUE)
	    	return null;

      String group = (String)groupAttribute;
		String type = "java.lang.String";
		
		VariableInfo groupVariableInfo = new VariableInfo(group, type, true, VariableInfo.AT_BEGIN);
		VariableInfo[] variableInfos = new VariableInfo[] { groupVariableInfo };
		
		return variableInfos;
	}	
}
```

Und die JSP:



```
<select id="assetActionList">
							<dam:ForEachZipAA group="zipFormat">
								<option>${zipFormat}</option>
							</dam:ForEachZipAA>
						</select>
```

Und zur Vollständigkeit nochmal die Verknüpfung in der TLD:


```
<tag>
    <name>ForEachZipAA</name>
     <tagclass>[PACKAGE-NAME].ForEachZipAATag</tagclass>
	  <teiclass>[PACKAGE-NAME].ForEachZipAATei</teiclass>
    <bodycontent>jsp</bodycontent>
    <attribute>
      <name>group</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
```

Frohes Schaffen
André


----------

