# einen Warenkorb implementieren



## cmtran (19. Dez 2013)

Hallo Gemeinde,

für meine webapp, die auf spring mvc basiert, möchte ich kleines einfaches Webshop bauen. Das Shop bietet nur eine kleine Menge von Produkten in einer einfachen Kategoriestruktur. Besucher können Produkte auswählen und die Bestellungen werden an die Email des Shop-Betreibers geschickt. Die Anzeige der Produkte in Kategorien sollte kein Problem sein. Ich möchte aktuell wissen, wie man einen Warenkorb implementiert. Also Standardstruktur für den Aufbau. Was muss man beachten? Wie werden die selektierten Produkte ermittelt, wenn der Besucher auf Bestellen klickt, usw.

Kennt jemand Tutorials oder Opensource-Lösung dafür?

Vielen Dank für jede Information.


----------



## eMmiE (19. Dez 2013)

???
Wenn du deinen eigenen Webshop programmieren willst, dann musst du die das doch alles selbst zusammenstecken, oder?
Wo ist dann das Problem dabei, dieselben Daten, die du auf die Seiten lädst auch beim Aufrufen der Seite "Warenkorb" so zu übertragen, das alle vorher ausgewählten Produkte (-> Hintergrundarray) mit Stückzahlen angezeigt werden?

Gruß :bahnhof: eMmiE


----------



## Peter-Rene (9. Jan 2014)

Normalerweise sind Warenkörbe wie folgt implementiert:
Die Bestellungen werden in Cookies gespeichert.
Einfach mit dem Hintergrund: Der Benutzer muss sich nicht erst anmelden, bevor er den Einkauf beginnen kann.
Hat er sich bereits registiert, kannst Du die Bestellungen natürlich auch per JPA in einer Tabelle "Bestellung" speichern.
Sobald der Benutzer "zur Kasse geht", muss er sich in jedem Fall anmmelden, damit seine Rechnungsdaten vorliegen.
Spätestens dann muss auch die Bestellung gespeichert werden.
Auf der GUI  - Seite wird oft mit JS gearbeitet. Dazu schreibt man sich ein kleines Widget.
Damit die Seite beim Klick auf "In den Warenkorb" nicht neu geladen werden muss.
Hier gibt es verschiedene Herangehensweisen:
Der Klick auf "In den Warenkorb" löst zwei Aktionen aus:
1. Einen Ajax - Request zum Server mit einer BestellungsID und den Bestellungsangaben
2. Das Aktualisieren des Warenkorbes
bsw. über das Triggern eines Ajax, der PPR ermöglicht und nur den HTML Code für den Warenkorb aktualisiert
Oder:
Reines JS zum Aktualisieren des Warenkorbes client - seitig.
Ersteren Ansatz finde ich persönlich sauberer, aber er erzeugt auch den Overhead zweier unnötiger HTTP - Requests.
Da Du aus JS auch auf Cookies zugreifen kannst, sind die nicht wirklich notwendig.
Dafür hast Du beim ersten Ansatz die Möglichkeit, die Daten für Statistiken auszuwerten, während die beim zweiten ja nur auf dem Server landen, wenn es zu einer Bestellung kommt.


----------



## eMmiE (9. Jan 2014)

Kannst du natürlich auch alles mit Java machen, ist nur ein bisschen komplexer, das einzubinden (-> Appltes)


----------



## Spitfire777 (22. Jan 2014)

Geht mit CDI extrem easy, bin mir aber nicht sicher, ob dir das mit Spring weiterhilft. Hab aber so bisher immer meine Java-Warenkörbe implementiert.

Dein Warenkorb-Bean mit @ConversationScoped annotieren. Der Rest wird dir komplett durch CDI abgenommen. Zum Beenden der Conversation kannst du dir die aktuelle Conversation jederzeit injezieren und mittels end() beenden oder mit begin() eine neue starten.

Das Binden an eine Session würde ich nicht empfehlen, da eine Session unter Umständen mehrere Warenkörbe haben kann (wenn auch meistens zeitlich versetzt) und das Auseinanderhalten und die Kontrolle über den Lifecycle nur unnötige Frickelei und eine mögliche zukünftige Bug-Quelle ist, wenns nicht gut gemacht ist.

Falls du es selber implementieren musst bzw. CDI nicht nutzen kannst, @ConversationScoped funktioniert so:

Über die URL wird eine Conversation-ID mitgeschickt, die nur für eine bestimmte Session gültig ist. 
Das Warenkorb-Bean wird an die Conversation-ID gebunden.
Wird der Warenkorb gelöscht oder die Bestellung aufgegeben, wird die Conversation-ID als ungültig erklärt - Eine neue Conversation wird gestartet und somit ein neuer, leerer Warenkorb erzeugt.

Ansonsten bliebe natürlich noch, dass sich der Browser um den Warenkorb kümmert. Ist aber auf der Serverseite imho sicherer aufgehoben, vor allem wenn man den Browser mal versehentlich beendet und der ganze Warenkorb hin ist.


----------



## cmtran (23. Jan 2014)

Spitfire777 hat gesagt.:


> Geht mit CDI extrem easy, bin mir aber nicht sicher, ob dir das mit Spring weiterhilft. Hab aber so bisher immer meine Java-Warenkörbe implementiert.
> 
> Dein Warenkorb-Bean mit @ConversationScoped annotieren. Der Rest wird dir komplett durch CDI abgenommen. Zum Beenden der Conversation kannst du dir die aktuelle Conversation jederzeit injezieren und mittels end() beenden oder mit begin() eine neue starten.
> 
> ...



ich denke Spring unterstützt auch ConversationScoped, oder? Das werde ich auf jeden Fall noch anschauen. Ist für mich sehr interessant. 

Ich möchte die Aktion "Add To Cart" durch jQuery realisieren, weil ich finde es langsam, wenn jede "Add to Cart" Aktion eine Post-Request an Server schickt und den Java-Warenkorb aktualisiert. Meine Idee ist Folgendes. In dem Warenkorb gibt es ein Input-Hidden-Feld id="selectedProductAmount". Jedes Mal wenn der Kunde auf den Button "Add to Cart" klickt, wird das Input-Hidden-Feld durch jQuery aktualisiert, mit der Id des Produkt und die Anzahl. z.B. "1-2; 2-3;...". Nachdem der Kunde alle seiner gewünschten Produkte ausgewählt hat, klickt er auf "zur Kasse". Jetzt wird eine Post-Request an den Server schickt.

Ist das eine gute Idee?


----------



## cmtran (23. Jan 2014)

Peter-Rene hat gesagt.:


> Normalerweise sind Warenkörbe wie folgt implementiert:
> Die Bestellungen werden in Cookies gespeichert.
> Einfach mit dem Hintergrund: Der Benutzer muss sich nicht erst anmelden, bevor er den Einkauf beginnen kann.
> Hat er sich bereits registiert, kannst Du die Bestellungen natürlich auch per JPA in einer Tabelle "Bestellung" speichern.
> ...



vielen Dank für deine Antwort. Ich habe noch keine Erfahrung mit Cookies. Wo finde ich die besten Tutorials bezüglich Cookies und Warenkorb? Aktuell schaue ich simplecartjs.com an, wie man einen Warenkorb mit jQuery implementiert.


----------

