# Beim Aufruf von einer JSF Seite eine Methode ausführen



## freez (14. Dez 2007)

Hallo,

ich habe eine JSF Seite, die direkt aufgerufen werden kann (also ohne ein Action oder ActionListener von einer anderen JSF Seite). Nun möchte ich beim Aufruf der Seite eine bestimmte Methode in meiner Bean ausführen, um gewisse Daten in der Bean aus der Datenbank zu aktualisieren, BEVOR die Getter in der Bean angesprochen werden.

Hintergrund: gewisse Daten können erst nach der Datenbankabfrage zur Verfügung stehen (zum Beispiel die Anzahl der gefunden Datensätze, die ich in der Seite ausgeben will). Realisiere ich die Datanbankabfrage in einem Getter, habe ich keine Kontrolle darüber, wann sie ausgeführt wird. Ich muss also sicherstellen, das die Datenbankabfrage vor allen Getter Aufrufen geschieht. 

Welchen Mechanismus kann ich dafür verwenden?


----------



## number8 (19. Dez 2007)

Wenn ich das richtig verstehe müsstest Du doch einfach bloß ein JSF-Tag einbauen, daß aufgerufen wird (und dann diese besagte Methode aufruft) bevor alle anderen JSF-Tags, die auf Getter bzw. Setter zugreifen, aufgerufen werden.  Keine Ahnung, vielleicht <huputText value="#{<beanname>.<getterMethode die einen lerren String zurückgibt>}"/> oder ein Attribut im <h:form> ?


----------



## maki (19. Dez 2007)

Das Shale Framework bietet anscheinend Unterstützung für so etwas: http://shale.apache.org/shale-view/index.html

Ansosnten selbst einen ViewHandler schreiben, der das macht.


----------



## mlange8801 (19. Dez 2007)

Wenn der Bean-Scope "request" ist, kannst du das in dem Konstruktor der Bean ausführen.


----------



## freez (15. Jan 2008)

Hm,

eure Antworten sind schon interessant, 

@mlange8801: Ich arbeite leider viel mit sessions

@maki: hm, einen extra viewhandler erscheint mir zu aufwändig. Das Framework schaue ich mir mal an

@number8: an diese Version habe ich auch schon gedacht. Ich denke ich könnte es wohl schon irgendwie implementieren, aber es kommt mir wie zusammengemurkst vor.

Ich habe gehofft, das Facelets oder JSF eine Möglichkeit bieten, eine Methode beim Aufruf der Seite auszuführen.

Als Alternative könnte ich mir ein Framework vorstellen, welches mir die Datenbankzugriffe managt. Welches Framework könnt ihr für einfache Anwendungen empfehlen?


----------



## maki (15. Jan 2008)

> Als Alternative könnte ich mir ein Framework vorstellen, welches mir die Datenbankzugriffe managt. Welches Framework könnt ihr für einfache Anwendungen empfehlen?


Hibernate oder iBatis, je nachdem was du brauchst (ORM vs. einfache SQL Kapselung), direkt mit JDBC würde ich nix mehr machen.

Übrigen gibt's beim shale Framework ein extra Scope, "Dialog", darin exisiteren Objekte die für einen Dialog gebaucht werden, feiner als Session und grober als Request.


----------



## freez (15. Jan 2008)

@maki: Der Dialog Scope hört sich sehr interessant an. Ich würde mich gern von Sessions distanzieren. Aber Request reicht für mich oft  nicht.

Von JDBC würde ich mich auch gern entfernen. Was ist denn einfacher zu benutzen ... Hibernate oder iBatis?


----------



## maki (15. Jan 2008)

Hibernate ist schwieriger zu lernen, hat seine Implikationen und Auswirkungen auf die Anwednung, echtes ORM eben.
Auch wegen der JPA lohnt sich es lang- und mittelfristig es zu erlernen, auch wenn die Lernkurve sehr steil ist.

iBatis ist ein eher kleines Framework bei dem du die meisten Probleme selbst lösen musst, einige Probleme (Trennung von SQL Code und Java Code, DAO Framework, etc.) sind schon gelöst.

iBatis ist meine erste Wahl für die Erweiterung von alten Anwendungen, Hibernate/JPA kommt zum Einsatz wenn ein neues Projekt entwickelt wird.

Nachtrag: Spring bietet auch einen eigenen Scope an, glaube der hies "Conversation", ist im Prinzip das gleiche wie "Dialog".


----------



## maki (15. Jan 2008)

double post


----------



## freez (15. Jan 2008)

also danke dann erst mal ... ich habe mir gerade das iBatis Tutorial angeschaut. Macht einen guten und einfachen Eindruck. Hoffentlich ist es auch so einfach und problemlos es zu implementieren


----------

