JSF 2.0: Interaktion zwischen mehreren Java-Klassen untereinander (Werteübergabe)

Fools

Mitglied
Hallo Allerseits!


Leider finde ich sowohl im Netz als auch in Büchern nicht wirklich Rat und langsam erschleicht sich mir das Gefühl, dass entweder irgendwas richtig faul ist oder ich bin einfach unfähig! :)


Folgendes Szenario:

Mal angenommen ich habe eine JSF-Seite (.xhtml-Datei), die mehrere Eingabefelder (<h:inputText... />) besitzt, die ihre Werte in verschiedenen Backing Beans/Managed Beans (Java-Klassen) übermittelt. Zum Beispiel ein Feld für den Nachnamen (mit der dazugehörigen Java-Klasse: Personal.java) und ein Feld für den bestellten Artikel (mit der dazugehörigen Java-Klasse: Warenkorb.java). Außerdem besitzt die Seite ein Save-Button, der wenn er betätigt wird die eingegebenen Daten in die Datenbank speichern soll (mit der dazugehörigen Java-Klasse: Jdbc.java).


Code der JSF-Seite:
HTML:
<table>
  <tr>
    <td><h:inputText id="Nachname" value="#{personal.nachname}" /></td>
  </tr>
  <tr>
    <td><h:inputText id="Artikel" value="#{warenkorb.artikel}" /></td>
  </tr>
  <tr>
    <td><h:commandButton action="#{jdbc.insertDataIntoDB}" value="Save" /></td>
  </tr>
</table>

Code der Personal.java-Klasse:
Code:
@ManagedBean (name = "personal")
@SessionScoped
public class Personal
{
   private String nachname;

   public String getNachname()
   {
      return nachname;
   }

   public void setNachname(String nachname)
   {
     this.nachname = nachname;
   }
}

Code der Warenkorb.java-Klasse:
Code:
@ManagedBean (name = "warenkorb")
@SessionScoped
public class Warenkorb
{
   private String artikel;

   public String getArtikel()
   {
      return artikel;
   }

   public void setArtikel(String artikel)
   {
     this.artikel = artikel;
   }
}

Code der Jdbc.java-Klasse:
Code:
@ManagedBean (name = "jdbc")
@SessionScoped
public class Jdbc
{
   public String insertDataIntoDB()
   {
      Connection conn = null;
      Statement  stmt = null;
      
      try
      {
         Class.forName("com.mysql.jdbc.Driver");
         conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_xyz", "username", "pw");
         stmt = conn.createStatement();
         stmt.executeUpdate("INSERT INTO db_xyz.tbl_bestellungen (Nachname, Artikel) VALUES (" + nachname + "," + artikel + ");");
      }
      ...
}


Bitte im Code der Jdbc-Klasse die letzte Zeile (stmt.executeUpdate) ignorieren. Die funktioniert natürlich so nicht, da ich schlecht einfach "nachname" und "artikel" schreiben kann ohne dass die Variablen/Werte der Jdbc-Klasse bekannt sind.

Und genau hier ist eben mein Problem!
Wie komme ich in meiner Jdbc-Klasse an die von mir eingegebenen Daten (Nachname und Artikel)?


Info: Ich möchte ungern all Variablen und all meine Logik in eine einzige Java-Klasse packen.


Ich wär Euch super dankbar, wenn ihr mir diesbezüglich weiterhelfen könntet.



Viele Grüße und vielen Dank im Voraus.
 
Zuletzt bearbeitet:
Also, so hüftsteif kann JSF 2.0 doch nicht sein?!

Bringt mir da z. B. die Annotation @Inject etwas? Oder hat das mit meinem Problem eher weniger zu tun?
 
Hallo Fools,

mit Dependency Injection liegst Du an der Stelle gar nicht so falsch. Als Bordmittel gibt es @ManagedProperty. Ich denke das würde in deinem Fall reichen.

Wie, das kannst Du z.B. in diesem Artikel nachlesen. Die Abschnitte "Using Managed Properties" und "Dependency Injection" solltest Du lesen.

Du müsstest also
  • die Klasse Jdbc um 2 Attribute ergänzen
  • die Attribute mit der Annotation versehen
  • die getter und setter bereitstellen
fertig.
 
Hallo Sentoo,

hab dein Posting leider etwas zu spät gelesen, da ich nicht mehr damit gerechnet habe, dass noch jemand zurück schreibt.

Aber ich kann bestätigen, dass du mit @ManagedPorperty völlig recht hast. Damit hat es funktioniert!

Vielen Dank. :)
 
Zurück