# Objekte an Taglib übergeben



## TheSunToucher (2. Nov 2006)

Hi,

ich habe angefangen angefangen mich mit taglibs zu beschäftigen. Mit Java, Html, servlet und Jsps kenne ich mich schon ein wenig aus. So, hier die Frage:

Wie kann ich in der Seite vorhandene Objekte an meine Tags übergeben? Ein simples Beispiel:


```
<%
Object obj = new MyObject();

<mytld:MyTag param="foo"/>

%>
```

Innerhalb der MyTag-Klasse hätte ich das Objekt "obj" gern zur Verfügung. Am liebsten ohne es als Attribut oder Parameter in das Tag aufzunehmen, also irgendwie bei der Initialisierung oder in den Konstruktor.

Ich hoffe ich konnte mein Anliegen verständlich formulieren. Bin für jeden Tipp Dankbar.

Gruß,
Tim


----------



## SlaterB (2. Nov 2006)

z.B.

<%
Object obj = new MyObject();
pageContext.setAttribut("foo",obj);
%> 
<mytld:MyTag param="${pageScope.foo}"/>

wenns es sichlich auch nicht all deinen Anforderung entspricht
(falls es überhaupt läuft)


----------



## TheSunToucher (2. Nov 2006)

hmmm, würde gehen, wobei ich es besser finden würde wenn ich es nicht übergeben muss, also ungefähr so:


```
<%
Object obj = new MyObject();
pageContext.setAttribut("foo",obj);
%>
<mytld:MyTag />
```

und in der Klasse dann einfach mit "getAttribute("foo")" holen. Aber bietet die Taglib-Technik da keine andere Möglichkeit?

Dann hab ich gleich noch eine passende Frage, was ist der Vorteil von Taglibs? Ich kann doch auch einfach folgendes schreiben:


```
<%
Object obj = new MyObject();
MyTag myTag = new MyTag(obj);
%>
<%= myTag.doit() %>
```

Dann hätte ich den Vorteil, dass ich im Constructor übergeben kann was ich will, eine tld-Datei erstellen muss, meine web.xml nicht anpassen usw.
Also irgendwie glaube ich, das ich irgendwas grundsätzliches nicht verstanden habe...


----------



## TheSunToucher (4. Nov 2006)

Irgendwie hab ich das noch nicht hinbekommen. Ich habe mir mal eine Test-Jsp und ein Test-Tag erstellt. Diesem Tag möchte ich ein TextObject übergeben, dabei erhalte ich stets den Fehler:


```
org.apache.jasper.JasperException: jsp.error.beans.property.conversion
	org.apache.jasper.runtime.JspRuntimeLibrary.getValueFromPropertyEditorManager(JspRuntimeLibrary.java:885)
	org.apache.jsp.test2_jsp._jspx_meth_os_test_0(test2_jsp.java:93)
	org.apache.jsp.test2_jsp._jspService(test2_jsp.java:68)
```

Meine JSP:

```
<%@ taglib uri="/os" prefix="os" %>
<%@ page import ="de.xyz.taglib.TestObject" %>
<%
	TestObject testObject = new TestObject("Test");
	pageContext.setAttribute("testObject", testObject);
%>
<html>
<body>
	<os:test testObject="${testObject}"/>
</body>
</html>
```

Hab's auch mit ${pageScope.testObject} probiert.
Das Tag sieht so aus:


```
public class TestTag extends TagSupport {

	TestObject testObject = null;

	public int doStartTag() throws JspException {
		try {
			
			JspWriter out = pageContext.getOut();
			out.write(testObject.toString());
			
		} catch (IOException e) {
			throw new JspException(e);
		}
		return SKIP_BODY;
	}

	public TestObject getTestObject() {
		return testObject;
	}

	public void setTestObject(TestObject testObject) {
		this.testObject = testObject;
	}
}
```

Und im Tld habe ich das so gemacht:

```
<tag>
        <name>test</name>
        <tag-class>de.xyz.taglib.TestTag</tag-class>

        <attribute>
            <name>testObject</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
	</tag>
```

Was mache ich bloß falsch...?


----------



## SlaterB (4. Nov 2006)

kannst du das Objekt in der JSP ausgeben (also ist es überhaupt vorhanden):
<cut value="xx ${testObject} yy"/> 

evtl. mal toString()-Operation überschreiben mit "Hello World"

---------

alternativ mit einem TestObjekt in der Session versuchen,
dass in einem Servlet sicher gesetzt wird (auch wieder mit Ausgabe testen)

------

im Tag den Typ TestObject durch Object ersetzen und schauen was dort ankommt (Ausgabe),
vielleicht ein String?


----------



## TheSunToucher (4. Nov 2006)

SlaterB hat gesagt.:
			
		

> kannst du das Objekt in der JSP ausgeben (also ist es überhaupt vorhanden):
> <cut value="xx ${testObject} yy"/>
> 
> evtl. mal toString()-Operation überschreiben mit "Hello World"



Jo, ist vorhanden. ToString hatte ich bereits überschrieben...



			
				SlaterB hat gesagt.:
			
		

> im Tag den Typ TestObject durch Object ersetzen und schauen was dort ankommt (Ausgabe),
> vielleicht ein String?



Das ist ein guter Tipp, werd' ich mal probieren. Ich habe das jetzt erstmal so umgebaut, dass ich mit pageContext.setAttribute das objekt setze und mir im Tag wieder raushole... Nicht so elegant.

Was mir noch fehlt (wie ich bereits geschrieben hatte) ist herauszufinden, wann und wie es von Vorteil ist ein CustomTag stat einen einfachen Methodenaufruf zu verwenden. Ich höre und lese überall das es besser sei, warum das so ist und besser in welchen Fällen steht da nicht... Irgendwie ist die Versuchung groß das mit einem Scriptlet reinzupacken und fertig, da habe ich keine Probleme Objekte zu übergeben.


----------



## SlaterB (4. Nov 2006)

Tags erzeugen doch HTML-Code?, Scriptlets nicht..

wenn du natürlich JSPs nur aus Java-Code schreibst wird dich sicher jeder Tag und jede sonstige unterbrechende HTML/ JSP-Zeile stören,
aber so geht man ja auch nicht vor,

normalerweise hat man nur HTML, JSP-Tags usw,
sowas wie "new MyObject();" habe ich noch nie in einer JSP gemacht


----------



## TheSunToucher (4. Nov 2006)

Naja, das hier:


```
<html>
<body>
<%for(...)%>
Text
<% } %>
</body>
</html>
```

ist doch genau wie:


```
<html>
<body>
<customtag:forEach param="...">
Text
</customtag:forEach>
</body>
</html>
```

Also bevor es Taglibs gab, irgendwann zwischen Servlets und jetzt, war das legitim...


----------

