sonyxp Δημοσ. 10 Φεβρουαρίου 2014 Δημοσ. 10 Φεβρουαρίου 2014 Δημιουργώ ένα Session και περνάω μερικές τιμές protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //...................... HttpSession session = request.getSession(true); session.putValue("Game", "Diablo 3"); session.putValue("Type", "MMORPG"); session.putValue("Price", "50"); //...................... } Όταν θέλω να τα διαβάσω protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //...................... HttpSession session = request.getSession(false); String[] values = session.getValueNames(); for( int i = 0; i < values.length; i++) { System.out.println( "(" + values[i] + ", " + session.getValue(values[i]) + ")" ); // (Name, Value) } //...................... } Δεν μου τα εκτυπώνει με σειρά όπως τα έβαλα (έστω και με ανάποδη σειρά να μου τα εκτύπωνε) αλλά εκτυπώνει ως εξής: (Price, 50) (Game, Diablo 3) (Type, MMORPG) ή (Game, Diablo 3) (Price, 50) (Type, MMORPG) Κάποια λύση?
ZAKKWYLDE Δημοσ. 10 Φεβρουαρίου 2014 Δημοσ. 10 Φεβρουαρίου 2014 Για δοκίμασέ το και με το setAttribute / getAttributeNames(); 1
nilosgr Δημοσ. 10 Φεβρουαρίου 2014 Δημοσ. 10 Φεβρουαρίου 2014 Λογικά το HttpSession χρησιμοποιεί Map και γιαυτό τα επιστρέφει με άλλη σειρά. Δοκίμασε να βάλεις κάποιο prefix στα keys πχ "1_game", "2_type" κλπ --είναι χαζή λύση, αλλά για κάτι απλό θα δουλέψει μια χαρά
defacer Δημοσ. 10 Φεβρουαρίου 2014 Δημοσ. 10 Φεβρουαρίου 2014 Από τη στιγμή που δεν υπάρχει κάποιο guarantee στο documentation του HttpSession εσύ πρέπει να δουλέψεις χωρίς να κάνεις καμία υπόθεση για το πώς θα σου τα γυρίσει πίσω. Αν θέλεις συγκεκριμένη σειρά τότε αντί να τα βάλεις μέσα ένα ένα θα τα βάλεις πρώτα σ' ένα ordered map (SortedMap αν θέλεις αλβαβητική σειρά, LinkedHashMap αν θέλεις να κρατήσει τη σειρά που χρησιμοποίησες κατά το insert) και μετά θα βάλεις το map μέσα στο session. Πάντως τις περισσότερες φορές που βλέπεις κώδικα του οποίου η σωστή λειτουργία (ο,τι και να σημαίνει αυτό σε κάθε περίπτωση) εξαρτάται από τη σειρά που βγαίνουν τα keys από ένα Map (ή το αντίστοιχο σε άλλες γλώσσες), ο κώδικας μάλλον δεν είναι γραμμένος με το σωστό σκεπτικό. Στην περίπτωσή σου γιατί χρειάζεσαι να βγαίνουν με συγκεκριμένη σειρά; Λογικά το HttpSession χρησιμοποιεί Map και γιαυτό τα επιστρέφει με άλλη σειρά.Δοκίμασε να βάλεις κάποιο prefix στα keys πχ "1_game", "2_type" κλπ --είναι χαζή λύση, αλλά για κάτι απλό θα δουλέψει μια χαρά Map = interface, το οποίο δεν έχει από μόνο του implementation οπότε δε μπορείς να πεις τίποτα για τη σειρά με την οποία τα επιστρέφει. Ίσα ίσα ο λόγος της ύπαρξης του είναι ακριβώς αυτός: να σου δώσει ένα public interface για να δουλέψεις χωρίς να προκαθορίζει περισσότερα από τα απολύτως απαραίτητα. Η λύση με το prefix είναι φυσικά "κακή", αλλά πιο κακό ακόμα είναι το να παίρνει τέτοια πορεία το σκεπτικό γιατί αν αποκτήσει κανείς τέτοιες συνήθειες θα γράφει "κακό" κώδικα από συνήθεια. Το σωστό σκεπτικό είναι το εξής: Θέλω να παίρνω τα keys με συγκεκριμένη σειρά Το HttpSession δεν παρέχει εγγυήσεις για τη σειρά των keys Άρα θα χρησιμοποιήσω κάποια άλλη class η οποία τις παρέχει Και αφού θέλω να τα κρατάει στο session, θα βάλω την παραπάνω μέσα στο session Απλό λιτό κατανοητό.
nilosgr Δημοσ. 10 Φεβρουαρίου 2014 Δημοσ. 10 Φεβρουαρίου 2014 Έχεις ένα point για το Map, πιο σωστό θα ήταν HashMap (ή HashTable ή τέλος πάντων μια υλοποίηση που δεν εξασφαλίζει τη σειρά στα keys). Thanks για τη διόρθωση
sonyxp Δημοσ. 10 Φεβρουαρίου 2014 Μέλος Δημοσ. 10 Φεβρουαρίου 2014 Τα θέλω με σειρά γιατί είναι στα πλαίσια μιας άσκησης... θα πρέπει λοιπόν να εκτυπώσω μετά "Γεια σας τάδε, επιλέξατε το $1[0] τύπου $2[1] και κοστίζει $3[2]" Έχεις ένα point για το Map, πιο σωστό θα ήταν HashMap (ή HashTable ή τέλος πάντων μια υλοποίηση που δεν εξασφαλίζει τη σειρά στα keys). Thanks για τη διόρθωση Δεν έχω ασχοληθεί ποτέ με HashMap & HashTable, ποιος είναι ο σκοπός ύπαρξής τους?
nilosgr Δημοσ. 10 Φεβρουαρίου 2014 Δημοσ. 10 Φεβρουαρίου 2014 Τότε γιατί δεν κανείς session.getValue("name") ;; Όσο για το HashMap και HashTable -νομίζω- οι πιο απλές υλοποίησεις του Map. Δηλαδή μόνο put και get, χωρίς να σου εξασφαλίζει την σειρά στα keys, χωρίς ταξινομημένα keys, χωρίς έλεγχο για null values κλπ κλπ (για το τελευταίο δεν είμαι σίγουρος). Η κυρία διάφορα είναι ότι το HashTable είναι ασφαλές για multithread εφαρμογές
sonyxp Δημοσ. 11 Φεβρουαρίου 2014 Μέλος Δημοσ. 11 Φεβρουαρίου 2014 Τότε γιατί δεν κανείς session.getValue("name") ;; Όσο για το HashMap και HashTable -νομίζω- οι πιο απλές υλοποίησεις του Map. Δηλαδή μόνο put και get, χωρίς να σου εξασφαλίζει την σειρά στα keys, χωρίς ταξινομημένα keys, χωρίς έλεγχο για null values κλπ κλπ (για το τελευταίο δεν είμαι σίγουρος). Η κυρία διάφορα είναι ότι το HashTable είναι ασφαλές για multithread εφαρμογές Έτσι το έκανα...
defacer Δημοσ. 11 Φεβρουαρίου 2014 Δημοσ. 11 Φεβρουαρίου 2014 Έτσι το έκανα... Ο κώδικας που δίνεις στην αρχή πάντως δεν το κάνει έτσι.
Papakaliati Δημοσ. 11 Φεβρουαρίου 2014 Δημοσ. 11 Φεβρουαρίου 2014 Δοκιμασε να τα διαβασεις ξεκινοντας απο την τελευταια τιμη πηγαινοντας στην πρωτη.
sonyxp Δημοσ. 11 Φεβρουαρίου 2014 Μέλος Δημοσ. 11 Φεβρουαρίου 2014 Δοκιμασε να τα διαβασεις ξεκινοντας απο την τελευταια τιμη πηγαινοντας στην πρωτη. Δεν λειτουργεί σαν στοίβα... Ο κώδικας που δίνεις στην αρχή πάντως δεν το κάνει έτσι. import *; // Whatever public class Askisi { /* Δημιουργήστε ένα Session και αποθηκεύστε σε αυτό Α) Το όνομα του παιχνιδιού Β) Την ποσότητα (πόσα κομμάτια θα αγοράσει κάποιος) Εμφανίστε ένα μήνυμα(HTML) που θα λέει "Επιλέξατε ΧΧΧ αντίτυπα του παιχνιδιού ΧΧΧ, το συνολικό κόστος είναι ΧΧΧΧ" * Η τιμή είναι 20 ευρώ (Static, όλα έχουν 20ευρώ), αν κάποιος αγοράσει πάνω από 10 κομμάτια τότε έχει προσφορά 10% * Δηλώστε στον κώδικα τις τιμές (όχι δηλαδή σε HTML και να κάνουμε request.getParameter("name") */ public void doPost(HttpServletRequest request, HttpServletResponse reponse) throw IOException, ServletException { // Create a new session HttpSession session = request.getSession(true); session.putValue("gameTitle", "Diablo 3"); session.putValue("pieces", 15); //HTML - Send "Hello" HTML PrintWrite output = response.getWriter(); output.println("<html><head>"); output.println("<title>Title Here</title></head><body>"); output.println("Hello my friend!"); output.println("<a href='localhost:8080/Askisi'>Click here to continue...</a>"); // This will call doGet output.println("</body></html>"); // Close output stream output.close(); } public void doGet(HttpServletRequest request, HttpServletResponse reponse) throw IOException, ServletException { // Get session HttpSession session = request.getSession(false); // Variables to save Game Title & Pieces String title = ""; int pieces = 0; if (session != null) { title = session.getValueName("gameTitle"); pieces = session.getValueName("pieces"); // getValueName() return only String? idk... this is untested code } // Calculate Price float price = pieces * 20.0f; if (pieces > 10) price /= 1.10f; // 10% Off // Build html for client PrintWrite output = response.getWriter(); output.println("<html><head>"); output.println("<title>Title Here</title></head><body>"); output.println("Epileksate <b>" + pieces + "</b> antitypa tou paixnidiou <b>" + title + "</b>, to syniliko kostos einai " + price +" euros."); output.println("</body></html>"); // Close output stream output.close(); } }
nucleus Δημοσ. 12 Φεβρουαρίου 2014 Δημοσ. 12 Φεβρουαρίου 2014 http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html Η putValue είναι deprecated.H getValueName δεν υπάρχει καν,υπάρχει μόνο η getValueNames() επίσης deprecated. Όπως πρότεινε και ο ZAKKWYLDE πρέπει να χρησιμοποιήσεις τις setAttribute/getAttribute και η πρόσβαση να γίνει με το όνομα της μεταβλητής.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα