Hi,
ich bin Newbie im Thema JSF und habe ein paar Anfängerfragen zum Thema Managed Beans (Backing Beans). Ich programmiere gerade als Beispielanwendung einen Mini-Shop, der folgende Funktionen haben soll:
- Auf verschiedenen Produkt-Seiten sollen Produkte in den Warenkorb gelegt werden können
- Auf der Warenkorb-Übersichts-Seite soll man Produkte wieder entfernen und Stückzahl verwalten können
- Mini-Kundenverwaltung
- Bestellung abschließen, als bereits bestehender Kunde oder Neukunde
Als erstes interessiert mich, wie ich bzgl. der Managed-Beans vorgehe. Also welche konkreten Managed Beans sind hier sinnvoll? Ich bin gerade bei einer ShoppingCartBackingBean, die eine Liste der aktuell im Warenkorb befindlichen Produkte hat. Diese brauche ich auf der Warenkorb-Übersichts-Seite, um eine Tabelle darzustellen. Aber diese Bean wird auch von allen Produktseiten benutzt, um Produkte in die Liste mit aufzunehmen, also ungefähr so:
Ist das sauber? Ist eine andere Herangehensweise sinnvoll? Ich dachte des Öfteren gelesen zu haben, dass eine Backing Bean pro Seite sinnvoll ist...
Mein zweites konkretes Problem ist die Seitennavigation. Auf der Warenkorb-Übersichts-Seite, soll ganz unten ein Button sein, der zum Abschluss der Bestellung führt, besser gesagt auf einer Zwischenseite, auf der man ganz ähnlich wie bei Amazon angeben kann, ob man schon ein Kundenkonto hat, und sich dann einloggt, oder ob man Neukunde ist. Soweit kein Problem. Diese Abfrage soll allerdings komplett entfallen, also übersprungen werden, wenn der Kunde bereits eingeloggt ist, weil ja dann klar ist, dass er schon ein Kundenkonto hat. Und dieses befindet sich auch schon in der Session.
Diese Logik habe ich jetzt auch versucht in der ShoppingCartBackingBean unterzubringen, weil ich nicht weiß, wo sonst. Soll dann in etwa so aussehen:
Ich finde es hier allerdings etwas holprig, über getELResolver() auf eine andere Backing Bean zuzugreifen, die Idee habe ich von hier: AccessingOneManagedBeanFromAnother - Myfaces Wiki. Allerdings fällt mir spontan kein anderer Weg ein, dieses Login-Verfahren zu realisieren.
Gibt es hier irgendwelche best practices? Also Zugriff von einer Backing Bean auf eine andere. Macht man das überhaupt so?
Vielen Dank!
Stefan
ich bin Newbie im Thema JSF und habe ein paar Anfängerfragen zum Thema Managed Beans (Backing Beans). Ich programmiere gerade als Beispielanwendung einen Mini-Shop, der folgende Funktionen haben soll:
- Auf verschiedenen Produkt-Seiten sollen Produkte in den Warenkorb gelegt werden können
- Auf der Warenkorb-Übersichts-Seite soll man Produkte wieder entfernen und Stückzahl verwalten können
- Mini-Kundenverwaltung
- Bestellung abschließen, als bereits bestehender Kunde oder Neukunde
Als erstes interessiert mich, wie ich bzgl. der Managed-Beans vorgehe. Also welche konkreten Managed Beans sind hier sinnvoll? Ich bin gerade bei einer ShoppingCartBackingBean, die eine Liste der aktuell im Warenkorb befindlichen Produkte hat. Diese brauche ich auf der Warenkorb-Übersichts-Seite, um eine Tabelle darzustellen. Aber diese Bean wird auch von allen Produktseiten benutzt, um Produkte in die Liste mit aufzunehmen, also ungefähr so:
Java:
<h:commandLink action="#{ShoppingCartBackingBean.putProductInShoppingCart}" >Mein Produkt</h:commandLink>
Ist das sauber? Ist eine andere Herangehensweise sinnvoll? Ich dachte des Öfteren gelesen zu haben, dass eine Backing Bean pro Seite sinnvoll ist...
Mein zweites konkretes Problem ist die Seitennavigation. Auf der Warenkorb-Übersichts-Seite, soll ganz unten ein Button sein, der zum Abschluss der Bestellung führt, besser gesagt auf einer Zwischenseite, auf der man ganz ähnlich wie bei Amazon angeben kann, ob man schon ein Kundenkonto hat, und sich dann einloggt, oder ob man Neukunde ist. Soweit kein Problem. Diese Abfrage soll allerdings komplett entfallen, also übersprungen werden, wenn der Kunde bereits eingeloggt ist, weil ja dann klar ist, dass er schon ein Kundenkonto hat. Und dieses befindet sich auch schon in der Session.
Diese Logik habe ich jetzt auch versucht in der ShoppingCartBackingBean unterzubringen, weil ich nicht weiß, wo sonst. Soll dann in etwa so aussehen:
Java:
<h:commandButton action="#{ShoppingCartBackingBean.completeOrderProcess}" > ...
@ManagedBean
@SessionScoped
public class ShoppingCartBackingBean {
...
public String completeOrderProcess() {
// hier soll sich die Kunden Backing Bean besorgt werden, über EL
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
CustomerBackingBean customerBackingBean = (CustomerBackingBean) FacesContext.getCurrentInstance().getApplication()
.getELResolver().getValue(elContext, null, "customerBackingBean");
....
// hier irgendwie entscheiden, ob schon ein Kunde angemeldet ist, und je nachdem ein anderes Ergebnis zurückliefern
if (customerBackingBean.isLoggedIn()) {
return "complete_order_process";
} else {
return "ask_for_customer_login";
}
}
...
}
Ich finde es hier allerdings etwas holprig, über getELResolver() auf eine andere Backing Bean zuzugreifen, die Idee habe ich von hier: AccessingOneManagedBeanFromAnother - Myfaces Wiki. Allerdings fällt mir spontan kein anderer Weg ein, dieses Login-Verfahren zu realisieren.
Gibt es hier irgendwelche best practices? Also Zugriff von einer Backing Bean auf eine andere. Macht man das überhaupt so?
Vielen Dank!
Stefan