Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Δημιουργώ ένα 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)

 

Κάποια λύση?

Δημοσ.

Λογικά το HttpSession χρησιμοποιεί Map και γιαυτό τα επιστρέφει με άλλη σειρά.

Δοκίμασε να βάλεις κάποιο prefix στα keys πχ "1_game", "2_type" κλπ --είναι χαζή λύση, αλλά για κάτι απλό θα δουλέψει μια χαρά

Δημοσ.

Από τη στιγμή που δεν υπάρχει κάποιο 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

Απλό λιτό κατανοητό. :)

Δημοσ.

Έχεις ένα point για το Map, πιο σωστό θα ήταν HashMap (ή HashTable ή τέλος πάντων μια υλοποίηση που δεν εξασφαλίζει τη σειρά στα keys). Thanks για τη διόρθωση ;)

Δημοσ.

Τα θέλω με σειρά γιατί είναι στα πλαίσια μιας άσκησης... θα πρέπει λοιπόν να εκτυπώσω μετά

 

"Γεια σας τάδε, επιλέξατε το $1[0] τύπου $2[1] και κοστίζει $3[2]"


Έχεις ένα point για το Map, πιο σωστό θα ήταν HashMap (ή HashTable ή τέλος πάντων μια υλοποίηση που δεν εξασφαλίζει τη σειρά στα keys). Thanks για τη διόρθωση ;)

 

Δεν έχω ασχοληθεί ποτέ με HashMap & HashTable, ποιος είναι ο σκοπός ύπαρξής τους?

Δημοσ.

Τότε γιατί δεν κανείς session.getValue("name") ;;

 

Όσο για το HashMap και HashTable -νομίζω- οι πιο απλές υλοποίησεις του Map.

Δηλαδή μόνο put και get, χωρίς να σου εξασφαλίζει την σειρά στα keys, χωρίς ταξινομημένα keys, χωρίς έλεγχο για null values κλπ κλπ (για το τελευταίο δεν είμαι σίγουρος). Η κυρία διάφορα είναι ότι το HashTable είναι ασφαλές για multithread εφαρμογές

Δημοσ.

Τότε γιατί δεν κανείς session.getValue("name") ;;

 

Όσο για το HashMap και HashTable -νομίζω- οι πιο απλές υλοποίησεις του Map.

Δηλαδή μόνο put και get, χωρίς να σου εξασφαλίζει την σειρά στα keys, χωρίς ταξινομημένα keys, χωρίς έλεγχο για null values κλπ κλπ (για το τελευταίο δεν είμαι σίγουρος). Η κυρία διάφορα είναι ότι το HashTable είναι ασφαλές για multithread εφαρμογές

 

Έτσι το έκανα...

Δημοσ.

Δοκιμασε να τα διαβασεις ξεκινοντας απο την τελευταια τιμη πηγαινοντας στην πρωτη. 

 

Δεν λειτουργεί σαν στοίβα...

 

 

 

Ο κώδικας που δίνεις στην αρχή πάντως δεν το κάνει έτσι.

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();
		
	
	}


}
Δημοσ.

http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html

 

Η putValue είναι deprecated.H getValueName δεν υπάρχει καν,υπάρχει μόνο η getValueNames() επίσης deprecated.

 

Όπως πρότεινε και ο ZAKKWYLDE πρέπει να χρησιμοποιήσεις τις setAttribute/getAttribute και η πρόσβαση να γίνει με το όνομα της μεταβλητής.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...