Mit stateful session beans mit servlets
Ich versuche, meine erste EJBs mit Glassfish Server ( Eine einfache shopping cart). Ich soll mit der CartBean für jede Http-Sitzung. Wenn mein Wagen Bean ist folgende-
public interface CartLocal {
public void addItem(String item);
public void removeItem(String item);
}
@Stateful
public class CartBean implements CartLocal {
List<String> item = new java.util.ArrayList<String>();
public void addItem(String item) {
....
}
public void removeItem(String item) {
....
}
}
Habe ich um die oben genannten stateful-session-bean in einer web-servlet client, so dass,
für jeden neuen Http-Session, wir bekommen ein neues stateful-session-bean. So, dass es einen Warenkorb für einen user. Ist mein Verständnis falsch der Verwendung von session-beans im servlet oder der code unten ist falsch, das schafft eine stateful-session-bean für alle Benutzer.
@EJB CartLocal cart;
protected void doGet(....) throws IOException...... {
cart.addItem(....);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den http-servlet wird gemeinsam von allen clients auf das servlet, so dass die Injektion es mit einer stateful session-bean ist nicht korrekt und verursachen unerwünschte Wirkungen. Session beans werden dazu genutzt werden, um pro client und Sie sind in der Regel gespeichert in http-session, so dass alle Anträge für diese Sitzung können Sie haben Zugriff auf session-bean. Sie haben die jndi-lookup innerhalb der
doGet
Methode und speichern Sie die Referenz in der http-session. Einmal gespeichert, müssen Sie das abrufen von http-Sitzung und verwenden.Mehr Info
Bekommen Sie es ein bisschen falsch. Stateful-session-bean-Klasse repräsentiert, wie Sie Ihr Modell stateful Daten, die ein graph von feinkörnigen verwandten Klassen. Fragen Sie für eine statful bean aus dem container
(erstellt/verwaltet/aktiviert/passiviert es).Diese Dienste sind, was wir sind Stateful session-bean für. Aber der container hat keine Kenntnis, dass jedes Objekt, es ist übergabe gehört zu dem client. Damit sind dann die http-Sitzung kommt ins Bild. Dieser Teil ist, was nicht betont, wie viel, wie es sein sollte daher Ihre Verwirrung. Http-Sitzung ist eine perfekte Lagerung Ort, wo alle Anfragen von der gleichen web-client haben Sie Zugriff auf alle gespeicherten Attribute in der http-session. So Sie Fragen, für die es aus dem container und halten Sie es an einem Ort (http-session), von wo es genommen werden kann wieder durch alle Anforderungen für die gleiche Sitzung. Jetzt Stell dir den Fall von nicht-web-clients. Dort haben Sie nicht die http-Sitzung oder ähnlichen Mechanismus. Erstellen Sie eine Speicher-Mechanismus Ihres eigenen zu identifizieren, die verschiedenen Kunden mit Ihren jeweiligen stateful beans.Ein möglicher Weg könnte möglicherweise speichern Sie die stateful bean-Referenz irgendwo ( sagen wir in einer Karte mit den wichtigsten als clientId und Wert als bean-Referenz), und das nächste mal Kunde will, um Zugriff auf die bean übergibt er die clientId und bekommt es von der Karte.
Soweit Präferenz für die http-Sitzung über stateful bean angeht, ist es wichtig zu verstehen, dass die http-Sitzung ist nicht thread-sicher. So im Falle Sie haben eine ajax-heavy-Anwendung, die den Zugriff auf ein Objekt in der session gleichzeitig müssen Sie Ihre eigenen Synchronisations-Mechanismus, die
nicht skalierbar und auf die Leistung auswirkt stark. Im Fall von stateful session beans der container verwaltet die Synchronisierung.
Hier ist eine interessante Diskussion über das Thema http-session für das speichern des Status. Die Diskussion ist auf Brian Goetz sehr informativen Artikel "Sind Alle Stateful-Java-Web-Anwendungen Kaputt?". Leider habe ich nicht finden können, den original-Artikel auf der IBM Seite, aber der Diskussions-thread gibt genug material, um nachzudenken.
Du natürlich kann verwenden stateful bean, aber Sie kann einfach nicht Spritzen, weil einzelne servlet-Instanz standardmäßig geteilt werden können, dienen mehrere Anfragen gleichzeitig, was bedeutet, dass Ihr code ist nicht thread-safe. Aber können Sie immer durchführen
JNDI
lookup in IhremdoGet
- Methode für die InstanzSehen Sie einige Tutorials für Suchvorgänge hier.