# Persistenz aus JSF-Seite ansteuern



## dataframe (1. Jun 2012)

Hallo Java-Forum-Community,

Ich arbeite aktuell an einem Blogging - Service, welcher als Benutzeroberflächenframework / JSF Primefaces nutzt. Da ich aus der Mobilentwicklung (Android & iOS) komme bin ich mit den best practices der Webentwicklung nicht vertraut, sodass sich meine Frage rund um das Verständnis dieser dreht:

*UseCase: *
Als Einstiegspunkt in die Webapplikation biete ich dem Nutzer eine Webseite auf dieser er zwischen "Blogeintrag erstellen" und "Blogeinträge anschauen" wählen kann. Wenn der Nutzer einen Blogeintrag erstellt wird er auf die dementsprechende Seite weitergeleitet, auf dieser Ihm einige Eingabefelder und ein WYSIWYG-Editor angeboten werden. Nun möchte ich, sobald der Nutzer auf den Submit-Button drückt die Persistierung mittels Hibernate ansteuern, sodass der Eintrag in die dahinterliegende MYSQL-DB gespeichert wird.

Nochmal in Kurzform: User besucht Webseite -> erstellt Eintrag -> Eintrag soll als Entität in Datenbank gespeichert werden.

*Frage: Wie stelle ich es am geschicktesten an jeden Blogeintrag in die Datenbank zu speichern?*
Ich möchte hierbei den größten Nutzen aus den aktuell verwendeten Technologien ziehen (also keine komischen XML-Mappings). Hierzu ein Listing der im Einsatz befindlichen Technologien:


Java 6
Apache Tomcat 7
Majorra -> Primefaces 3.3
Hibernate 4
MySQL 5.5

Ich bedanke mich im Vorraus

P.S.: Webseiten, eBooks oder weitere Denkanstöße wären ausreichend.


----------



## oldshoe (1. Jun 2012)

Ich würde EJBs verwenden. Deine JSP-SEite ruft beim Speichern des Blog-Eintrags eine Bean auf, der die Inhalte des Blog-Eintrags übergeben werden. Dann kannst du mit dem String in der Bean alles machen.

Aber was sagen die Experten?


----------



## maki (1. Jun 2012)

Hi,

JSF, Hibernate, aber auch EJBs und Java WebApps im allgemeinen sind ziemlich komplexe Themen.

Wieviel Erfahrung/theoretisches Wissen hast du denn bereits?
Welche Gründe haben dich dazu bewegt Java, JSF & Hibernate auszuwählen?


----------



## JimPanse (1. Jun 2012)

Schau dir mal die Online-Referenz von MyFaces an:
JSFAtWork, JSF 2.0 und Apache MyFaces

Das Beispiel Projekt mygourmet (ist mit spring) - paßt ganz gut zu deinem Use-Case. 

Grüße


----------



## dataframe (1. Jun 2012)

maki hat gesagt.:


> Hi,
> 
> JSF, Hibernate, aber auch EJBs und Java WebApps im allgemeinen sind ziemlich komplexe Themen.
> 
> ...



Ich bin bereits seit einiger Zeit als Entwickler tätig, jedoch nicht im Bereich der Webentwicklung. Ich habe diese Technologien auferlegt bekommen, da diese auch von meinem Arbeitgeber im großen Stil verwendet werden. Dies soll nur eine Einarbeitung in die Themengebiete sein.



JimPanse hat gesagt.:


> Schau dir mal die Online-Referenz von MyFaces an:
> JSFAtWork, JSF 2.0 und Apache MyFaces
> 
> Das Beispiel Projekt mygourmet (ist mit spring) - paßt ganz gut zu deinem Use-Case.
> ...



Werde ich mir ansehen, Danke dafür.


----------



## maki (1. Jun 2012)

Nun, das ist ein sehr guter Grund 

Würde dir empfehlen nicht zu versuchen alles auf einmal erlernen zu wollen, Hiebrnate kann man komplett ohne JSF erlernen, umgekehrt genauso.

Für Hibernate zB. empfehle ich die Hibernate Doku 

Bin mir nicht sicher, ob JSF mit Hibernate/JPA aber ohne EJBs wirklich einfacher ist als mit EJBs...


----------



## dataframe (1. Jun 2012)

maki hat gesagt.:


> Nun, das ist ein sehr guter Grund
> 
> Würde dir empfehlen nicht zu versuchen alles auf einmal erlernen zu wollen, Hiebrnate kann man komplett ohne JSF erlernen, umgekehrt genauso.
> 
> ...



Danke für den Beitrag. Es hapert lediglich, wie ich feststellen musste, an meinen mangelnden JSF Kenntnissen. Die anderen Technologien stellen kein Problem dar, da Ich diese auch schon in anderen Projekten eingesetzt hab.

Dann kann der Thread hiermit beendet werden. Nach ner gewissen Zeit vor der IDE sieht man die Probleme vor dem Rechner nicht mehr.


----------



## chrisbad (4. Jun 2012)

Howdy,

Du muss eine ManagedBean für deinen View (jsp, xhtml) schreiben (einfachster Weg).
In deinem View kannst du dann per Expression Language auf deine ManagedBean zugreifen

In einem DataTable oder ähnlichen kannst du dann mit value="#{myManagedBean.blogEntries}" darauf zugreifen...


```
@ManagedBean
public class MyManagedBean {

private List<BlogEintrag> blogEntries;

private EntityManagerFactory emf = Persistence.getEntityManagerFactory();
private EntityManager           em;

public classMyManagedBean() {
}

public List<BlogBeitrag> getBlogEntries(){
em = emf.createEntityManager();

Query q = "select a from BlogEintrag a";
this.blogEntries = q.getResultList();
em.close;

if (this.blogEntries != null) {
return this.blogEntries;
} else {
this.blogEntries = new ArrayList<BlogEintrag>();
return this.blogEntries;
}

}
```


----------



## JimPanse (4. Jun 2012)

Das ist schlechter Programmierstil - Businesslogik o. Datenbank Abfragen in den getter zu implementieren - zumal JSF den getter 2mal aufruft d.h. gehört sowas in die @PostConstruct- oder in eine action-Methode und warum heißt der Konstruktor anders als die Klasse?

```
public class MyManagedBean {
...
public classMyManagedBean() {
}
```


----------



## chrisbad (4. Jun 2012)

JimPanse hat gesagt.:


> Das ist schlechter Programmierstil - Businesslogik o. Datenbank Abfragen in den getter zu implementieren - zumal JSF den getter 2mal aufruft d.h. gehört sowas in die @PostConstruct- oder in eine action-Methode und warum heißt der Konstruktor anders als die Klasse?
> 
> ```
> public class MyManagedBean {
> ...



Konstruktor ist natürlich ein CopyAndPaste-Fehler gewesen.
Hast du ein Beispiel für eine SessionScopedBean, die automatisch bei jedem Aufruf einen DataTable mit aktuellen Daten füllt? Wenn ich die Persistenz in eine Action-Methode packe muss ich die ja jedes Mal explizit aufrufen, stecke ich die in den Getter (um den Reload-Button zu sparen) wird sie auch zweimal aufgerufen. Bin für jeden Hinweis dankbar, ich habe damals keine Möglichkeit gefunden das effektiver zu realisieren.

In vielen Tutorials und Büchern steht das auch so drinn. Nochmal, ich weiß dass das redundant ist. 

Chris


----------



## JimPanse (4. Jun 2012)

ViewScope statt SessionScope.


----------



## chrisbad (5. Jun 2012)

JimPanse hat gesagt.:


> ViewScope statt SessionScope.



Ok, hab ich ausprobiert (sorry bin noch Anfänger und will lernen).
Die "Halbwertszeit" der Bean ist zwar kürzer, aber das initiale Befüllen ohne explizit einen Knopf zu drücken klappt da auch nicht.


----------



## JimPanse (5. Jun 2012)

@PostConstruct - Methode zur Initialisierung verwenden.


----------

