# 1. ContrBean + Image zurück, 2. DB-Zugriff per utilityklasse



## Squall83 (2. Jan 2008)

Hallo!

Sorry für den Titel, mir ist nichts sinnvolleres eingefallen.
Ich arbeite grad mit an einem Semesterprojekt, bei dem wir EJB zum 1. Mal verwenden. Wir haben jsp-Dateien für die grafische Oberfläche, die über ne lookuptable auf die ControllerBeans zugreifen, welche per Entitymanager auf die MySQL-Datenbank zugreifen. Der Server ist JBoss.

Jetzt bin ich erst mal auf folgendes Problem gestoßen (Problem 1):
Objekte aus java.awt (z.B: BufferedImage oder Graphics) kann meine ControllerBean nicht zurückgeben, weil dann der Server sagt, dass das Objekt nicht serialisierbar ist. Jetzt würde ich gerne wissen:
1. Wie kann man eine ControllerBean so ein nicht-serialisierbares Objekt zurückgeben lassen?
2. Was ist Serialisierbarkeit überhaupt?

Ich hab dann das Problem umgangen, indem ich alles in eine Utilityklasse gepackt habe, die sich die jsp-Leute nicht über ne Lookuptable holen müssen, sondern direkt in der jsp einfach importieren und mit new anlegen können. Dann war wieder alles super, so lange bis ich in einer Methode meiner Utilityklasse einen DB-Zugriff gebraucht habe. Ich dachte erst "naja, leg ich einfach in der Methode der Utilityklasse ein Objekt von der Controllerbean an, die diesen Zugriff bereits realisiert hat und ruf dann ihre Methode auf". Denkste. Es gab ne NullPointerException, weil der EntityManager (die Variable "private EntityManager manager" in der ControllerBean) nicht initialisiert wurde (Problem 2). Jetzt zu meinen Fragen:
1. Warum wird der EntityManager nicht inititalisiert? Ich dachte das geschieht immer automatisch über Annotations und wenn man in ner jsp sich von der Bean ein Objekt anlegt, geschieht das auch und die DB-Zugriffe klappen alle.
2. Kann man von einer Utilityklasse aus überhaupt irgendwie auf eine DB zugreifen, ohne die EJB-Architektur zu brechen?

Fazit:
Ich möchte eine Methode, die ein BufferedImage zurück geben und auf die DB zugreifen kann im Rahmen der EJB-Architektur und hab keinen Plan, wie so was geht.

Viele Grüße,
Squall83


----------



## maki (2. Jan 2008)

Was zum Teufel machst du in einer JSP mit einem Graphics, BufferedImage oder sonstigem AWT Objekt???   :shock:  :shock:  :shock:


----------



## Squall83 (2. Jan 2008)

Ich generiere Bilder gemäß der Anleitung hier:
http://www.galileocomputing.de/open...17_009.htm#mj90e9f6527123edd5f3ad596c2e65e8f2
Kapitel 17.9.3.

Der Code-Abschnitt der jsp sieht dann so aus:


```
BufferedImage image = MethodeZumDasBildHolen();
ServletOutputStream sos = response.getOutputStream(); 
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder( sos ); 
encoder.encode( image );
```

edit: Btw ich bekomm an der Stelle vom JBoss immer die Exception, dass getOutputStream bereits gerufen wurde, aber weil trotzdem alles funktioniert hat, hab ich's so gelassen. Aber mich würde trotzdem interessieren, woran das liegt und wie man es beheben kann.


----------



## maki (2. Jan 2008)

JSP ist eine Template Technologie die auf Text basiert.
In einer JSP sollten solche Dinge nicht gemacht werden, Servlets sind das Mittel der Wahl


----------



## Squall83 (2. Jan 2008)

Weißt du da ein gutes Tutorial für?
Ich hab mal ne Weile gegoogelt. Zuerst bin ich hier hin und hab nicht durchgeblickt, welche der über 10 Dateien für was gut ist und welche Funktionalitäten ich brauche.

Dann hab ich gelesen, dass das alles schon von JAVA EE unterstützt wird, also hab ich das neueste JAVA EE SDK bei sun runtergeladen und installiert (da war wohl noch ein Server oder so dabei, weil ich da ein Adminpasswort angeben musste), aber die Bibliothek javax.servlet findet mein Eclipse immernoch nicht.

Mich würde aber wirklich mal interessieren, wieso es ein Problem gibt, grafische Objekte von einer ControllerBean aus einer jsp-Datei zurückzugeben und was Serialisierung eigentlich bedeutet.

Und kann man innerhalb eines Servets auch nach Belieben Objekte von ControllerBeans mit new anlegen, ohne dass dabei der EntityManager vergessen wird? Das würd ich nämlich reichlich komisch finden, weil der Quellcode innerhalb von doPost und doGet ist genauso JAVA-Code wie der aus meiner Utiliyklasse.


----------



## Squall83 (3. Jan 2008)

Also es funktioniert jetzt in der Utilityklasse, wenn ich die ControllerBean nicht mit new anlege, sondern über

```
InterfaceName i = (InterfaceName) Lookup.lookup(Lookup.JBOSS_ENV, "ControllerBeanName/remote");
MeinObjekt a = i.holeMeinObjektDetails(ID); // die Methode, die nen DB-Zugriff beinhaltet
```

InterfaceName steht dabei für das Interface, das die Controllerbean "ControllerBeanName" implementiert, aber wer sich mit der EJB-Architektur auskennt, für den ist das denk ich ein alter Hut. 

Das Problem ist zwar gelöst, aber hier stehen noch so viele offene Fragen drin, für die ich gerne eine Antwort wissen würde. Insb. für die, wie man es richtig macht, weil ich hab das Gefühl, dass diese Lösung sehr unelegant ist. Aber der Einzeiler "verwende Servlets" hilft mir (und jedem anderen, der keine Ahnung davon hat) ehrlich gesagt nicht viel, wie man aus meinem letzten Post sicher rauslesen konnte.


----------

