# Session Problem



## evildrno (18. Dez 2010)

Hi leute,
ich hab ein Problem mit der Session bei Servlet:
Kann es sein dass man mit session (request.getSession()) und session.setAttribute(String, Object) nur Integer und Strings o.ä. speichern, bzw übergeben und wieder auslesen kann?

Als ich das ganze nur mit nem String gemacht hab, wars kein Problem den Wert wieder rauszulesen.
Aber als ich versuchte eine Instanz einer selber geschriebenen Klasse zu laden hab ich nur n null
zurückbekommen.

Hier mal der Code von doGet (in doPost steht halt doGet(request,response drin ^^ )) :

```
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session= request.getSession(false);
		if(session==null){
			session=request.getSession(true);
		}
		//SessionCont sCont = (SessionCont)session.getAttribute("sCont");
		String sCont= (String)session.getAttribute("sCont");
		
		PrintWriter aus = response.getWriter();
		//if(sCont == null);
		//	sCont=new SessionCont("hallo");
		if(sCont==null)
			sCont="hallo";
		
		aus.println("<html><body>");
		if(request.getParameter("link")!=null){
			//sCont.setDatei(request.getParameter("link"));
			sCont=(request.getParameter("link"));
		}
		
		//String pressedLink=sCont.getDatei();
		String pressedLink=sCont;
		aus.println(pressedLink+"  V:7 ");
		
		aus.println("<a href=\"SessionTest?link=1\">Link 1</a>  ");
		aus.println("<a href=\"SessionTest?link=2\">Link 2</a>  ");
		aus.println("<a href=\"SessionTest\">Link ohne Parameter</a>  ");
		aus.println("</body></html>");
		session.setAttribute("sCont", sCont);
	}
```

und noch meine andere Class :


```
public class SessionCont{
	private String welcher;
	
	SessionCont(String a){
		this.welcher=a;
	}
	
	public void setDatei(String a){
		this.welcher=a;
	}
	public String getDatei(){
		return this.welcher;
	}
	
}
```
Also eig. Sollte ja nun das Auskommentierte das selbe machen wie das direkt darunter, machts aber nicht.

Also bitte bitte helft mir, bzw sagt mir was ich da falsch mach.
Ich fänds nämlich voll geschickt einfach sone SessionContainer klasse zu machen, damit ich net alle Werte einzeln speichern muss.
Das hier is ja nur n Test obs tut, des eigentliche Prog is halt etwas größer.

Also Danke!!!


----------



## SlaterB (20. Dez 2010)

speichere gleichzeitig einen String sowie ein Objekt und prüfe, ob danach der String noch da ist, das Objekt aber nicht mehr,
also ob dieses einzelne Objekt ein Problem in der Speicherung verursacht oder gar eine ganz neue Session angelegt wird,

allgemein empfiehlt es sich, das Interface Serializable zu implementieren, String tut dies,
aber ohne Fehlermeldung ist das nicht besonders einsichtlich und ich kann mich auch nicht erinnern dass das zwingend wäre



> First, ensure that all of your objects stored in the HttpSession implement the java.io.Serializable interface. This is a best practice for HttpSession development that you should follow because not implementing Serializable can lead to loss of data. However, doing this is crucial to the next part of the best practice.


Best Practice: Improving HttpSession Performance with Smart Serialization


----------



## pizza1234 (20. Dez 2010)

Hi,
wo wird denn dein Objekt SessionCont ininitalisiert? Ich sehe nirgends ein " = new SessionCont("test")", bzw, ist das auskommentiert! Abgesehen müßtest du nicht auch ein "implements Serializable" an SessionCont schreiben? Abgesehen davon kann man ja so ein Servlet auch prima debuggen...

Grüße
Peter


----------



## evildrno (20. Dez 2010)

@piza1234

das objetct wird nach dem laden aus der session, falls es null ist neu instanziiert (zeile 10 und 11).
deshalb merk ich ja auch das es eben immer null zurückgiebt, da später in der Ausgabe immer hallo erscheint (da ja Hallo im Konstruktor in diesen zeilen übergeben wird).

ALso ich versuche das ncohmal mit serializable, hab ich aber schon mal versucht, ging aber irwie dann auch net...

Aber allg. ist es also möglich auch so ein Objekt zu speichern???


----------



## SlaterB (20. Dez 2010)

allgemein sicherlich,
hier eine Seite sowohl mit Bestätigung also auch interessanter im unteren Bereich Untersuchungsmethoden zur Session
Session-Verwaltung in Servlets mit HttpSession | tutego

kannst ja mal ausprobieren falls schon JSPs oder ähnliches möglich bzw. geht ja auch im Servlet in OutputStream, 
ich frage mich immer noch ob nicht eine komplett neue Session angelegt wird,
auch wenn ich bei Beantwortung dieses Punktes, ob ja oder nein, nicht wirklich noch was neues zu sagen hätte


----------



## evildrno (20. Dez 2010)

mh ok ich hab grad nochmal n bissle rumgespielt, und bin jetzt total verwirrt:
Ich hab in SessionCont Serializable implementiert, dass ich des schon mal ausschliesen kann.
Hab überprüft ob immer ne neue Session angelegt wird: nein, also soweit so gut.
Wenn ich mit session.getAttribute("sCont").getClass überprüf was für ne Class er in Session gespeichert hat sagt er mir auch dass es ne SessionCont class is, also soweit auch so gut, aber warum zur hölle meint er dann mit:

sCont=session.getAttribute("sCont");
if(sCont==null){
   aus.println("null bekommen");
}

dass er n null bekommen hat?

@SlaterB danke für den Link ;-)
aber irgendiw kann ich keinen unterschied zu dem was ich grad geprogt hab sehen und bei mir tuts immernoch net ;(


----------



## SlaterB (20. Dez 2010)

rufst du 
> session.getAttribute("sCont").getClass()
beim Abspeichern auf oder genau an der Stelle an der du null herausliest?

ersteres wäre ja kein Wunder, direkt nach dem Abspeichern wird dann das Auslesen auch noch klappen oder?
nur was beim nächsten Request passiert ist die Schwierigkeit

> Hab überprüft ob immer ne neue Session angelegt wird: nein, also soweit so gut.

ohne Begründung den Punkt abgeschlossen?, na wie du meinst, aber wäre schade wenn es daran liegt..


----------



## evildrno (20. Dez 2010)

ok wie gesagt des ding verwirrt mich einfach nur total!
Habs grad nochmal neu geschriebne, wüsste jetzt aber net was ich anders gemacht hab...
Aber jetzt tuts soweit.
Aber danke an euch!!!

ps: ja ne ich habs schon direkt am Anfang abgefragt, nicht nach dem Speichern, wär ja sonst blöd, aber dann wäre ich ja auhc nicht verwirrt^^.

Hier mal den code der jetzt soweit tut:

[Java]
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String debug="";
		HttpSession session= request.getSession(false);
		if(session==null){
			session=request.getSession(true);
			debug="session nicht geladen";
		} else {

			//hier ausgabe was für ne Klasse
			debug+="</br> "+session.getAttribute("sCont").getClass();
		}
		PrintWriter aus = response.getWriter();



		SessionCont sCont=(SessionCont) session.getAttribute("sCont");
		if(sCont==null){
			sCont= new SessionCont("123");
			debug+=" </br> aus Session nur null bekommen </br>";
		}

		sCont.setDatei(sCont.getDatei()+"l");

		aus.println("<html><body>");
		aus.println(sCont.getDatei()+" </br> ");
		aus.println(debug);
		aus.println("</body></html>");
		session.setAttribute("sCont", sCont);
	}

[/Java]

So in etwa war auch des prinzip vorhin, als .getClass() das richtige ausgegeben hatt, aber ich doch nurn null bekommen hab.

Ich hab grad irgendwie die befürchtung dass es daran lag, dass der Tomcat die SessionCont Klasse nicht neugeladen hat, nachdem ichs auf serializable gestellt hab oder sowas...


----------



## SlaterB (20. Dez 2010)

falls vielleicht der String-Identifer "sCont" falsch geschrieben war, 
bietet sich eine notfalls statische gemeinsame Variable an, statt jedesmal den String direkt hinzuschreiben

auch ist es nützlich, einfach mal komplett alle Objekte in der Session anzuschauen,
da gibts auch ne Methode, getAttributeNames()


----------



## pizza1234 (20. Dez 2010)

Hi,
ich enpfehle dir für die Zukunft auch das:
Debugging a servlet with tomcat and Eclipse tutorial - WikiJava, Eclipse, Tomcat, Debug, Servlet
und/oder das:
Debugging Tomcat Remotely Using Eclipse - WG: Programmer's Cafe - Confluence

Das kann dir die Arbeit deutlich erleichtert...

Grüße
Peter


----------

