# Session Problem



## pat270881 (24. Nov 2005)

Hallo,

Ich verwende ein LineChart(wie in einem früheren posting erzählt) in meiner Struts WebApplication in einer jsp-Site. Dazu habe ich ein Servlet geschrieben, das das Chart in den outputstream schreibt. Dafür speichere ich das chart als attribut der session in der jsp-site und extrahiere das chart wieder im servlet aus der session. Das funktioniert ohne Probleme.

Aber wenn jetzt ein neues LineChart erstellt wird und auf der jsp-site angezeigt werden soll, wird für eine kurze Zeit das vorige LineChart angezeigt und nach kurzer Zeit durch das aktuelle LineChart ersetzt.

Ich habe das ganze nach dem folgenden Posting definiert:
http://www.jfree.org/phpBB2/viewtopic.php?t=9621&highlight=png

Ein Experte von JFreeChart hat mir aber erzählt dass das nichts mit JfreeChart zu tun hat sondern mit dem möglicherweise mehrfachen Zugriff auf das session object, aber er wußte den grund auch nicht genau. Ich habe es daher mal versucht das ganze innerhalb eines synchronized statement auszuführen und wie folgt definiert:

In der jsp-site:

```
<%   
     synchronized(session)
     {
        ComputeCreditForm form = (ComputeCreditForm)request.getAttribute("computeCreditForm");
          LineChart demo = new LineChart("");
          CategoryDataset dataset = demo.createDataset(form.getYears(), form.getRate(), form.getAmount(), form.getNumber());
        JFreeChart chart = demo.createChart(dataset);
        session.setAttribute("LineChart", chart);
     }
%>
 
 
[img]BinaryStreamServlet[/img]
```



Und im BinaryStreamServlet in der service method:

```
HttpSession session = req.getSession();
      synchronized (session)
   {
         JFreeChart chart = (JFreeChart)session.getAttribute("LineChart");
         // set the content type so the browser can see this as it is
         res.setContentType( "image/png" );
 
         // send the picture
         BufferedImage buf = chart.createBufferedImage(640, 500, null);
         PngEncoder encoder = new PngEncoder( buf, false, 0, 9 );
         res.getOutputStream().write( encoder.pngEncode() );
   }
```

Aber das Problem ist noch immer da. Hat von euch vielleicht jemand eine Ahnung, was ich noch ausprobieren kann um das Problem zu lösen?? :bahnhof: 

danke

lg
pat


----------



## pat270881 (26. Nov 2005)

Keiner ne Ahnung, warum dieses Problem auftritt??


----------



## bronks (26. Nov 2005)

Tut mir leid es Dir so hart sagen zu müssen, aber diese Technik ist total für den Popo. Leider!

Für jede Handbewegung in Java gibt es Spezifikationen und für jedes Ziel gibt es gründliche dokumentierte BestPractices. Das was Du da machst ist aus meiner Sicht ein Versuch, der das o.g. Ergebnis liefert (Sackgasse)


----------



## pat270881 (26. Nov 2005)

Was ist an dieser Lösung bitte so schlecht? - Ich habe jetzt auch schon eine Lösunge gefunden, hatte was mit dem caching zu tun. Also nochmals meine Frage, was ist an dieser Lösung so für den popo??? (Ich habe übrigends die Lösung aus dem JFreeChart Forum und dort wurde sie als ordentliche Lösung ausgewiesen) Und wie willst du sonst, ein JFreeChart in JSP anzeigen lassen, zuerst in ein file speichern und dann anzeigen?-ist auch umständlich. Und CeWolf wollt ich wirklich nicht verwenden, da die Doku dazu wirklich sehr gering ist.


----------



## bronks (27. Nov 2005)

Ein JFreeChart ist ein riesiges Objekt und man macht es einfach nicht, so ein Monster in die Session reinzuschieben, weil der Server das nicht mitmacht, sobald ein paar Sessions offen sind. Nur das Image in die Session zu drücken, wäre schon eine Erleichterung, aber das ist immernoch nicht die Art, wie man das macht. Ich hab schon viele Lösungsmöglichkeiten gesehen, aber zwichen "ordentliche Lösung" und "best practices" scheint dann wohl ein riesen Unterschied zu sein.

Normalfall wäre: Das Servlet was bei Dir "BinaryStreamServlet" heißt, holt sich die Daten, erzeugt das Diagramm, streamt es und den rest übernimt der normale Lebenszyklus eines Servlets ...

Wenn das Servlet irgendwelche Parameter braucht, dann holt es sich diese aus dem Request oder wenn es irgendwelche globalen Userparameter sind, dann sind diese sowieso in der Session drin. Besondere Parameter, die mit der Darstellung zu tun haben kann die JSP an das Servlet weitergeben.


----------



## Bleiglanz (28. Nov 2005)

die ist popo weil die Graphik ja schon rein logisch nichts in der Session verloren hat?

und weil du sie offenbar nach erfolgreichem Abschicken nicht wieder entfernst??

und wenn ein Benutzer zwei Fenster in der gleichen Session öffnet dann hakelts bei sowas immer


warum löst du das nicht sauber und legst sie in den request-scope

oder noch sauberer: du legst sie nirgendwo hin und streamst sie direkt (siehe bronks Beitrag: Normallfall...)


----------



## pat270881 (28. Nov 2005)

weil in dem link  zu dem posting dass ich im ersten beitrag angeführt hat extra darauf hingewiesen wird den session scope zu verwenden, da request scope nicht funktioniert - ich habe es auch selber ausprobiert und es geht nur mit session scope...


----------



## Bleiglanz (28. Nov 2005)

das liegt daran, dass dein ganzer Ansatz fragwürdig ist

der server schickt das ergebnis der jsp

da drin ein img tag

dieses soll auf ein servlet das die graphik liefert zeigen

soweit so gut, aber in deinem "Wahn" hast du das bild schon in der jsp erzeugen lassen; und jetzt musst du es natürlich in die session legen, damit diese information den roundtrip überlebt

lösung: du lässt das bild erst vom servlet erzeugen(!) und direkt streamen -  dazu musst du im img natürlich alle infos mitgeben

```
[img]streaminServlet?years=<%=years%>&rate=<%=rate%>&amount=<%=amount%>&number=<%number%>[/img]
```
auf diese Art wird nicht nur die jsp schneller ausgeliefert, sondern auch der ganze Zustands-Alptraum entschärft


----------



## pat270881 (28. Nov 2005)

Das hatte ich jetzt eh vor bzw. habe ich eh gemacht, nachdem mir "Bronks" den Tipp gegeben hat, ich soll das JfreeChart erst im Servlet erzeugen. Das posting war nur darauf bezogen, weil du gemeint hast, warum ich es nicht in den request lege....und ich muss dich enttäuschen, ich befinde mich in keinem Wahn oder sonst was..


----------



## Bleiglanz (28. Nov 2005)

schon klar, locker bleiben


----------



## pat270881 (28. Nov 2005)

Immer doch   :wink: 

Wenn wir schon bei Sessions sind, ist ein Objekt das mehrere Daten (Name, Vorname, Addresse, etc.) über einen User enthält auch normalerweise zu groß um es im session scope abzulegen?
lg


----------



## Bleiglanz (30. Nov 2005)

Nein, das ist harmlos und auch so gedacht

IMHO ist es ganz praktisch, wenn man nur ein einziges wohldefiniertes Bean (das serializable sein soll) in die Session legt, d.h. man schreibt sich ein einziges "SessionObject" und legt nur dieses in den Session-Scope. Macht das Handling ggf. einfacher als die Mehtode mit "setAttribute einen Haufen Zeugs reinlegen"...

es soll nicht zu gross sein: da der Server einen Session-Timeout nicht erkennen kann, liegt sowas immer 15Minuten (genauer: bis zum Timeout) auf dem Server: wenn man 5MB in die Session legt dann geht das System schnell in die Knie


----------



## pat270881 (1. Dez 2005)

Hallo,

die Parameterübergabe wie sie Bleiglanz beschrieben hat mit


```
[img]streaminServlet?years=<%=years%>&rate=<%=rate%>&amount=<%=amount%>&number=<%number%>[/img]
```

funktioniert so nicht. Er weist den Parametern years, etc. keine korrekten Werte zu. Weiß jemand was hier falsch definiert wurde??

lg


----------



## bronks (1. Dez 2005)

pat270881 hat gesagt.:
			
		

> ... funktioniert so nicht ...


Ich tip mal auf Programmierfehler. 

Hast Du schon mal im Debugger geschaut, ob die Variablen richtig gefüllt sind?


----------



## Bleiglanz (2. Dez 2005)

war ja nur ein Beispiel:

<%= years %>

funzt natürlich nur, wenn es eine lokale variable "years" gerade gibt!

das dürfte nicht der Fall sein, bei dir wahrscheinlich

<%= form.getYears() %>

(war nur zu faul das voll hinzuschreiben


----------



## pat270881 (2. Dez 2005)

HI,

nein ich habe davor ein scriptlet das folgendermaßen aussieht:


```
<%
ComputeForm compute = (ComputeForm)request.getAttribute("computeForm");
String years= compute.getYears();
 //in der Variable years steht hier der richtige Wert,hab das mit einem System.out. überprüft
%>
```

und dann


```
[img]streaminServlet?years=<%=years%>[/img]
```

Was vergessen?


----------



## Bleiglanz (2. Dez 2005)

a) was steht im erzeugten Quelltext? d.h. im Browser mal Quelltextanzeigen machen

b) wie holst du den ab: request.getParameter("years")

c) im String years keine Sonder/Leer oder sonstige Zeichen

seh eigentlich keinen fehler, wenn years wirklich richtig gesetzt wurde


----------



## pat270881 (2. Dez 2005)

Ja ich hols mit getParamter ab, die Variable years sollte ja schon im 2. sciptlet also dort wo ich das img erzeuge noch gültig sein oder....


----------

