# Verständnisfrage zu Beans



## Troilus (14. Jun 2005)

Huhu,
wie in nem anderen Post erwähnt arbeite ich mich in JSF ein. Dies ist mein erster Kontakt mit J2EE und somit setze ich zum ersten Mal Java Beans ein. Dazu habe ich nun ein paar Verständnisfragen:

1) Wann und wo wird das Bean erzeugt, also "Bean test = new Bean();" ? In meinem JSF Projekt möchte ich ein Bean nutzen, das meine Eingabedaten nach einem Submit eines JPSs in diesem Bean speichert. 

Ich müsste wissen wann es initialisiert wird, da ich im Standardkonstruktor des Beans eine Cookieabfrage machen möchte, d.h. ich möchte überprüfen, ob ein Cookie mit den benutzerdefinierten Werten des Benutzers schon vorhanden ist. Wenn ja soll mein Bean diese Werte übernehmen und seine Variablen damit initialisieren. Falls nicht werden die Variablen des Beans mit Defaultwerten initialisiert, die danach in einem Cookie abgelegt werden sollen.

Dies soll vor dem Aufruf der "Benutzereinstellungs-JSP" erfolgen, da ich gerne die Eingabefelder des JSP mit den vorher gesetzten Werten aus der Bean "initialisieren" möchte.

Da ich nicht weiss, ob ein Bean wie eine normale Klasse erzeugt wird, und ich mit einem Beanobjekt arbeiten kann, weiss ich auch nicht wie ich dies realisieren kann. Mir kommt es so vor als ob in JSF die Beans immer nur dann erzeugt werden, wenn diese vom JSP erstmalig aufgerufen werden.


2) Was hat es mit dem Scope auf sich? Wenn ich den Scope "session" benutze, woher weiss dann JSF, wann diese Session vorbei ist? Speichert JSF eine Session ID über eine gewisse Zeit ab? (Wobei ich glaub zu scope werd ich ein bissl googlen. )


3) Nochmal zu Beans. Darf ein Bean auch private Methoden enthalten? Oder ist dann das Bean kein Bean mehr? 


4) Kann ich auch in meinen Bean Methoden mit komplexeren Berechnungen implementieren oder sollte man dazu lieber eine extra Klasse erzeugen, die ich dann im Bean aufrufe? (quasi durchreichen von Berechnungsklasse->Bean->View). Ist es generell sinnvoller Berechnungen auszulagern? Oder macht es keinen Unterschied, wenn ich dazu die Beans benutze?


Das wars erstmal
Bis dann


----------



## timomeinen (14. Jun 2005)

Troilus hat gesagt.:
			
		

> 1) Wann und wo wird das Bean erzeugt, also "Bean test = new Bean();" ?


Bei EJBs gibt es kein new Bean(), denn dies wird von dem Applikationsserver erledigt. Man kann EJBs nur "erzeugen" indem man nach ihnen beim Namensdienst sucht. Stichwort JNDI. Aber das ist ja der ganz grosse Vorteil der J2EE Technik: die EJBs müssen nicht erzeugt werden, sondern können dynamsich in einem Pool gehalten werden.

Am besten schaust du dir mal diese State- und Sequenzdiagramme an:

http://www.unix.org.ua/orelly/java-ent/ebeans/appb_01.htm

Sie beschreiben den Lebenszyklus der EJBs und erklären auch die Generierung. Hier wirst du auch sehen, an welcher Stelle man Initialisierungscode einsezten kann.



			
				Troilus hat gesagt.:
			
		

> 2) Was hat es mit dem Scope auf sich? Wenn ich den Scope "session" benutze, woher weiss dann JSF, wann diese Session vorbei ist? Speichert JSF eine Session ID über eine gewisse Zeit ab? (Wobei ich glaub zu scope werd ich ein bissl googlen. )


HTTP ist ein zustandsloses Protokoll, d.h. du hast keine Möglichkeit Informationen über die Session in dem Protokoll zu speichern. Daher verwendet man einige "Tricks", wie z.B. URL-Rewriting. Darutner versteht man, dass alle Informationen in den Links integriert werden. Das kennst du, wenn du oben in die Adressleiste schaust und dort Infos gespeichert werden in der Form ?key=value&key=value
Man kann auch eine SessionID in dem GET- oder POST-Aufruf verstecken und die Informationen auf dem Server speichern. Diese Arbeit nimmt dir aber zum Glück der WebContainer ab. Du kannst also im JSF einfach auf den Scope zugreifen.



			
				Troilus hat gesagt.:
			
		

> 3) Nochmal zu Beans. Darf ein Bean auch private Methoden enthalten? Oder ist dann das Bean kein Bean mehr?


EJBs sind keine JavaBeans! Ich verstehe auch nicht, warum man die Namen so ähnlich gemacht hat. Natürlich kannst du private Methoden verwenden. Allerdings soltle dies nur in SessionBeans geschehen. Die Entity-Beans enthalten, wie JavaBeans, nur private Attribute mit öffentlich getter-/setter-Methoden.



			
				Troilus hat gesagt.:
			
		

> 4) Kann ich auch in meinen Bean Methoden mit komplexeren Berechnungen implementieren oder sollte man dazu lieber eine extra Klasse erzeugen, die ich dann im Bean aufrufe? (quasi durchreichen von Berechnungsklasse->Bean->View). Ist es generell sinnvoller Berechnungen auszulagern? Oder macht es keinen Unterschied, wenn ich dazu die Beans benutze?


Klar kannst du komplexe Berechnungen machen. Dazu sind SessionBeans ja da. Die SessionBeans stellen die Geschäftslogik da und berechnen etwas mit Hilfe der Daten aus EntityBeans. Auslagern wäre nicht sinnvoll, da SessionBeans ja dazu da sind, Berechnungen zu abstrahieren, so dass du sie theoretisch in anderen Programmen wiederverwenden kannst.

Am Besten schaust du dir die Unterschiede und Aufgaben der versch. Bean-Typen (Session, Enttity, Messag-Driven) an.

Glück Auf
Timo


----------



## KSG9|sebastian (14. Jun 2005)

Beans bestehen aus privaten Attributen mit zugehörigen gettern/settern

beans solltest du (wenn du schon jsf benutzt) in der faces-config.xml deklarieren


----------



## Troilus (14. Jun 2005)

KSG9|plak hat gesagt.:
			
		

> Beans bestehen aus privaten Attributen mit zugehörigen gettern/settern
> 
> beans solltest du (wenn du schon jsf benutzt) in der faces-config.xml deklarieren



Das habe ich bereits verstanden gehabt, nur wie man die Beans benutzt ist/war mir unklar 


Ich werd mir den Link oben gleich nachher einmal ansehen.
@Timo: D.h. das die managed-beans und referenced-beans bei JSF EJBs sind? Bzw. wenn in der J2EE von Beans die Rede ist, es sich automatisch im EJBs handelt?
Sind dann mit dem Begriff "Beans", nur die Beans gemeint, die Komponenten in Swing/AWT implementieren? Sowas habe ich nämlich gelesen als ich nach Beans gegooglet habe.

Fragen über Fragen,
bis dann


----------



## timomeinen (14. Jun 2005)

Troilus hat gesagt.:
			
		

> das die managed-beans und referenced-beans bei JSF EJBs sind?



Hoooonk! Genau verkehrt. managed-beans im JSF sind auch nur JavaBeans. Die Attribute der managed-beans werden aber mit den passenden JSP-Tags verknüpft. Stichwort: Value Bindings



			
				Troilus hat gesagt.:
			
		

> Bzw. wenn in der J2EE von Beans die Rede ist, es sich automatisch im EJBs handelt?



Nein nicht automatisch. Also ich gebe mal eine kurze Übersicht:

*JavaBeans* - genannt: Beans, Javabeans
JavaBeans sind gewöhnliche Java-Klassen. Sie besitzen einen öffnetlichen, leeren Konstruktor. Sie haben private Attribute und für diese Attribute haben sie jeweils eine öffentliche getAttribut() und eine öffentliche setAttribut().

Bsp: 

```
class KundeJavaBean {
private String name;
private int alter;

public KundeJavaBean() {}

public String getName() {
return this.name;
}

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

usw. für alter...

Verwendung
Als Datentransferobjekt (DTO) oder für Swing-Anwendungen oder z.B. auch als managed-bean für JSF.


*Enterprise JavaBeans* - genannt: EJBs
EJBs sind nur in einer J2EE Umgebung mit einem Applikaitonsserver einsetzbar. Sie stellen Komponenten einer Software da und können wiederverwendet und beliebig skaliert werden.

Typen

Entity Beans - sind ähnlich JavaBeans und stellen Daten für ein Objekt z.B. Kunde dar - werden durch den App-Server mit einer Datenbank verknüft
Session Beans - realisieren die Geschäftslogik
Message Driven Beans - Bieten eine Möglichkeit für asynchrone Kommunikation

Glück Auf
Timo


----------



## KSG9|sebastian (14. Jun 2005)

ejbs und java beans sind was völlig anderes, und managed beans aus jsf gehören eher zu den java beans


----------



## Troilus (14. Jun 2005)

Danke für die Tipps 
ich glaub ich muss mich da noch n bissl reindenken. Also es spricht ansich nichts dagegen wenn ich Methoden zur Berechnung oder Speicherungen von Daten in mein Managed bean packe?
Ich tu mich schwer irgendwie mich da reinzudenken 

Also:
In meinem alten Servlet Projekt hatte ich eine Klasse "TreeView" die einen Baum gezeichnet hat und eine Klasse "Cookiemanager" die mir die Daten zum zeichnen an meine TreeView Klasse übergeben hat. Mit einer HTML Seite und einem Extra Servlet konnte ich die Cookies für die Benutzereinstellungen des "TreeView"s verwalten bzw. setzen. Auf die hat dann der "Cookiemanager" zugegriffen. Ich konnte in dem Projekt alle Objekte mit new erzeugen und damit arbeiten.

Jetzt mit JSF habe ich ja meine JSP Seite die die Benutzereinstellungen der "TreeView" verwaltet. Schicke ich das Formular der JSP ab, werden die Werte in dem gelinkten managed-bean "TreeViewBean" abgelegt. Und jetzt hab ich das Problem das ich net weiss, wo und in welcher Art ich mein "Cookiemanager" unterbringen kann der dann die Werte aus dem managed-bean "TreeViewBean" ausliest und als Cookie ablegt.

Das ist mein ganz großes Problem zur Zeit. Java programmieren ist ja kein Ding, aber der Umstieg von herkömmlichen Servletprogrammierung auf J2EE bzw JSF geht irgendwie net an einem Tag 


Ah ja noch ne "dumme" Frage: Wird in einem J2EE Projekt (hier JSF als Beispiel) alle Anforderungen mit EJBs gelöst oder hat man auch den Fall, dass man irgendwo ein Objekt einer Klasse explizit erzeugt und benutzt. (zb CookieManager cm = new CookieManager())


Ein etwas verwirrtes 
Bis dann


----------



## timomeinen (14. Jun 2005)

Die managed-beans sind *KEINE* EJBs!!! Und daher solltest du in die managed-beans auch keine Logik packen.

Es lassen sich in einer J2EE Anwendung natürlich auch normale Klassen realisieren.

Für JSF alleine würde man aber nicht unbedingt EJBs benötigen. Da reicht ja ein WebContainer.


----------



## Troilus (14. Jun 2005)

Ah, so langsam blick ich durch 
Ich werd das hier mal abhaken und falls ich net weiterkomme euch wieder "nerven" *g*

Danke für die hilfreichen Tips


----------

