# Verständnis Beans und Taglibs



## newBaby (4. Mrz 2007)

Hi @ ll,

ich arbeite grade das Buch Core Sevlets und JavaServer Pages durch. 

Wie greife ich auf in taglibs auf ein Session Objekt (Bean) zu? Ich habe es derzeit über die JSP gelöst, hätte dies aber lieber in der Taglib.

Hier ein simles Beispiel zur Veranschulichung:  

Das Bean was nach MVC Mein Modell darstellt.


```
package de.asdf.test.tagTest;

public class Mybean {
private String sprachschalter;
	
	public String getSprachschalter() {
		return sprachschalter;
	}
	
	public void setSprachschalter(String sprachschalter) {
		this.sprachschalter = sprachschalter;
	}
}
```

Hier die JSP Seite:



```
<%@ page import="de.asdf.test.tagTest.Mybean" %> 
<jsp:useBean 	id		="lrm" 
				class	="de.blassmann.test.tagTest.Mybean" 				
				scope	="session">		 

	<jsp:setProperty 	name		="lrm" 
						property	="sprachschalter" 
						value		="de"					
						/>						

</jsp:useBean>
<%@ taglib uri="/WEB-INF/tagBeanVerbindung.xml" prefix="tagBean" %>



<tagBean:verbindung  tagSprachschalter=<%=lrm.getSprachschalter()%>' />
 //hier findet der Zugriff statt. 


<%=lrm.getSprachschalter()%>
```

Das ist mein tagLib:

```
package de.asdf.test.tagTest;

import java.io.IOException;
import java.math.BigInteger;

import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import coreservlets.Primes;

public class myTaglib extends TagSupport {
	private String tagSprachschalter;
	
		
	/**
	 * @param tagSprachschalter the tagSprachschalter to set
	 */
	public void setTagSprachschalter(String tagSprachschalter) {
		this.tagSprachschalter = tagSprachschalter;
		if(tagSprachschalter.equalsIgnoreCase("de")){
			tagSprachschalter="[b]deutsch[/b]";
		}else{
			tagSprachschalter=null;
		}
	    try {
	    	JspWriter out = pageContext.getOut();
	        out.print(tagSprachschalter);
	        System.out.print("ich bin myTaglib.setTagSprachschalter()");
	    } catch(IOException ioe) {
	        System.out.println("Error generating prime: " + ioe);
	    }	
	   
	}

	  public int doStartTag() {
		    try {
		      JspWriter out = pageContext.getOut();		      
		      out.print(tagSprachschalter);
		    } catch(IOException ioe) {
		      System.out.println("Error generating prime: " + ioe);
		    }
		    return(EVAL_BODY_INCLUDE);
		  }
		  
}
```


Damit es vollständig ist noch die tld:


```
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
 PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
 "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>tagBean</shortname>
  <info>
    A tag library from Core Servlets and JavaServer Pages,
    [url]http://www.coreservlets.com/[/url].
  </info>
  <tag>
    <name>verbindung</name>
    <tagclass>de.blassmann.test.tagTest.myTaglib</tagclass>
    <bodycontent>JSP</bodycontent>
    <info>Outputs servletFeld.</info> 
    <attribute>
      <name>tagSprachschalter</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>  
</taglib>
```



   So, wie muss ich die Taglib Class verandern um aus dem Bean den Sprachschalter zu erhalten?  Mir erscheint es komisch das dies wie bei mir in der JSP passiert. Ist das die richtige Vorhehensweise?


Grüsse newBaby

PS Ich habe schon danach gesucht aber nichts gefunden.



.


----------



## Ralf Ueberfuhr (4. Mrz 2007)

Naja, kommt drauf an. In der JSP ist es doch ok. So ist dein Tag unabhängig von Namen und Ort der Bean. Du kannst da auch gerne Expression Language verwenden (ab JSP 2.0), um XML-komform zu sein.

Wenn du das trotzdem im Tag auslesen möchtest, dann per


```
Mybean mybean = (Mybean)pageContext.getAttribute("lrm", PageContext.REQUEST_SCOPE);
```

EDIT: Du verwendest den Begriff taglib falsch. Du hast einen Custom Tag. Taglib ist die Tag Library, in der deine Custom Tags definiert werden.


----------



## newBaby (5. Mrz 2007)

hi masseur81,



Danke für die schnelle aufschlussreiche Auskunft.

> Naja, kommt drauf an. In der JSP ist es doch ok. So ist dein Tag unabhängig von Namen und Ort der Bean.

Scriptlet in jsp - ich dachte die Tage sind vorbei? Ich habe gelesen das das vermieden werden soll.

Ist es nicht ein Vorteil wenn die Aufbereitung zur Ausgabe in der JavaClasse geschieht, dann habe ich doch die Möglichkeit die im Bean vorgehalten Daten zu jeder Zeit in jeder jsp auszugeben. Wenn ich es in der jsp aufbereite, bin ich an die jsp als Ausgabeseite gebunden und kann es zb nur in der index.jsp und nicht auf der xyz.jsp Seite Ausgeben.

zB mein Bean liefert mir eine Gruppe von Datensätzen die als radio o. checkbox dargestellt werden soll. Ich bin bis jetzt davon ausgegangen, das in der Classe auf die das Tag Zeigt, der HTML code zusammengesetzt wird, Incl. Style Angaben.


Zu dem wollte ich in der JavaClasse festlegen welche teile aus der Modell(Bean) ausgegeben wird, das Bean soll doch nur die Daten bereitstellen und Aufnehmen.






> So ist dein Tag unabhängig von Namen und Ort der Bean.

Ich sehe den Vorteil, einer Aufbereitung in der jsp nicht.  Bzw ich vertehe nicht wie du das meinst, das mit dem Namen und Ort. Ist es nicht so, das ich einfach ein neues tag in der xml festlege und nochmals auf das Bean Zugreife wenn es nochmals verwenden will?






> EDIT: Du verwendest den Begriff taglib falsch. Du hast einen Custom Tag. Taglib ist die Tag Library, in der deine Custom Tags definiert werden.

OK ,  Hab ich das Richtig verstanden, ich wiederhole in meinen Worten?

Custom tags werden in der XML (Descriptor, Tag-Bibliothek =  TagLib) deffiniert, und enthällt ein Sammlesurium der (Custom)Tags. 

Die JavaClasse, auf die aus der XML verwiesen wird - Hat das Kind auch einen Namen? Im Buch heist es Tag-Handler-Klasse, das klingt so eingedeutscht.




Nochmal Danke und 
grüsse newBaby 


PS hehe  $(Expression Language), feine Sache, das habe ich auch nicht gekannt.




.


----------



## newBaby (6. Mrz 2007)

@masseur81

ich versuche jetzt schon seid 3 tagen in der myTaglib auf das bean zuzugreifen 


```
Mybean mybean = (Mybean)pageContext.getAttribute("lrm", PageContext.REQUEST_SCOPE);
```


myBean ist null, logisch woher soll den die klasse/methode auch wissen das ich das bean aus der aktuellen session meine.

Das muss ich irgenwie bekannt machen, und die refferenz auf das bean bekomme ich nicht hin, 

Sei doch so net und  gib mir ein wenig mehr code als die eine Zeile. 

Insbesondere wie ich den bezug myTaglib.class -> Mybean.class herstelle bzw übergebe.


Viele grüsse 
newBabay




.


----------



## newBaby (6. Mrz 2007)

Hat sich erledigt.  Habe die ganze zeit auf ein anders Bean zugegriffen das war null - grrr

Das war mal eine schwere Geburt. 

Grüsse newBabay


----------

