Session Problem

Status
Nicht offen für weitere Antworten.

pat270881

Bekanntes Mitglied
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:
Code:
<%   
     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:
Code:
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
 

bronks

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Gesperrter Benutzer
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

Bekanntes Mitglied
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

Gesperrter Benutzer
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
Code:
[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

Bekanntes Mitglied
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..
 

pat270881

Bekanntes Mitglied
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

Gesperrter Benutzer
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

Bekanntes Mitglied
Hallo,

die Parameterübergabe wie sie Bleiglanz beschrieben hat mit

Code:
[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
 

Bleiglanz

Gesperrter Benutzer
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

Bekanntes Mitglied
HI,

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

Code:
<%
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

Code:
[img]streaminServlet?years=<%=years%>[/img]

Was vergessen?
 

Bleiglanz

Gesperrter Benutzer
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

Bekanntes Mitglied
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....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Session Problem Allgemeines EE 9
T Session-Problem Allgemeines EE 2
G Session Problem Allgemeines EE 5
Q Tomcat/java-Session-Problem Allgemeines EE 9
F Problem mit Session (Weitergabe an andere JSPs) Allgemeines EE 2
A (EJB)Session abhängige Parameter in POJO lesen Allgemeines EE 3
O JSF / Primefaces Session handling Allgemeines EE 1
I Session löschen in Bean (Session Beans) Allgemeines EE 1
J Hello World mit Stateless Session Bean - Was mache ich falsch? Allgemeines EE 2
H Shared Session in Webmodulen Allgemeines EE 2
J Unterschied zwischen HttpSession und Stateful Session Bean Allgemeines EE 3
R Wie eine stateful session bean erneut "aufgreifen" Allgemeines EE 22
P Unterschied Session Scope / Stateful Session Bean Allgemeines EE 6
F Session zerstören Allgemeines EE 12
A Im PhaseListener auf Stateful Session Bean zugreifen Allgemeines EE 6
G Session Allgemeines EE 6
G Session neu!? Allgemeines EE 7
M Fehler bei Javamail Session mit Glassfish 3 Allgemeines EE 3
Java.getSkill() verbindung / connection in session speichern Allgemeines EE 4
D Frage zum Statefull Session Beans Lebenszyklus Allgemeines EE 3
MQue Session - Cookie Allgemeines EE 27
MQue Session Exception Allgemeines EE 5
M j_security_check Login und Session-ID Allgemeines EE 2
S Session in eine andere Anwendung übergeben Allgemeines EE 2
F Session abgelaufen und direkter Aufruf Allgemeines EE 10
Y myFaces und Hibernate Session Handling Allgemeines EE 7
S tomcat session timeout - und was danach? Allgemeines EE 1
Q Form Based Authentication - Session Attribute ? Allgemeines EE 2
A Session Bean mit Local-Interface nutzen Allgemeines EE 3
G Session Cookies Allgemeines EE 2
Q Session Tracking - Wie macht mans richtig! Allgemeines EE 3
B Session Daten pro User merken Allgemeines EE 9
H [JSP JSF] Session Timeout und Redirekt zur Startseite Allgemeines EE 5
I Session-Attribute von Client zugänglich? Allgemeines EE 6
G session token Allgemeines EE 3
K tomcat: session-unabhängiges speichern Allgemeines EE 3
S Struts und Session Allgemeines EE 2
J Tomcat mit eigener Session-Implementierung Allgemeines EE 15
Y JSF - Session Handling Firefox Allgemeines EE 3
Y JSF - Session invalidate bei outpulink möglich? Allgemeines EE 4
R Session Tracking & Cookies Allgemeines EE 3
B Variablen ausserhalb der session ? Allgemeines EE 2
T Zugriff auf Session-Objekte in JSP Allgemeines EE 2
W Session tracking mit URL rewrite - Session weg! Allgemeines EE 4
G Neue Session bei der Verwendung von Frames Allgemeines EE 3
RaoulDuke EJB 3.0 - Exceptions aus Methoden einer Session Bean Allgemeines EE 2
Z Session aufräumen Allgemeines EE 2
G JBoss - Session / Entity Allgemeines EE 8
S Bild in Session Allgemeines EE 2
F Session Bean -> Daten aus dem Servlet holen Allgemeines EE 11
P Struts Form Bean vs. Session Variable Allgemeines EE 6
A JSF - Daten in Session speichern Allgemeines EE 2
R Formulareingaben gezielt aus Session löschen Allgemeines EE 4
W Session nach Browserschließung erhalten im Tomcat Allgemeines EE 4
R Vernünftige Session-Verwaltung mit Struts Allgemeines EE 4
L Zwei Browserfenster mit unterschiedlicher session - geht das Allgemeines EE 3
flashfactor Logging in einem Session-Bean Allgemeines EE 2
H JSP, Session und Java-Bean Allgemeines EE 4
flashfactor Frage zu Session-Lebensdauer Allgemeines EE 3
J xdoclet session facade + value object Allgemeines EE 2
M Session Bean vers. Entity Bean Allgemeines EE 3
G ResultSet in Session speichern Allgemeines EE 4
P Session Attribute an Klasse übergeben Allgemeines EE 13
G Mit Session-IDs richtig umgehen Allgemeines EE 3
C Mail von einer Session Bean aus senden Allgemeines EE 2
P Session NullPointerException Allgemeines EE 17
H daten in session speichern Allgemeines EE 8
G list in session schreiben Allgemeines EE 4
P String-Array an session Variable übergeben Allgemeines EE 3
P Session Beans importieren Allgemeines EE 2
D Problem mit Update von ApacheHttpClient von 5.2 auf 5.3 Allgemeines EE 10
D Problem mit redundanten Servern Allgemeines EE 7
Azemaria JSF: Problem bei der einfachsten Applikation Allgemeines EE 2
P JPA Internal Problem Nullpointer Allgemeines EE 10
S MessageDrivenBean Problem beim Zugriff auf Stateful EJB Allgemeines EE 2
M Glassfish Deployment-Problem unter Eclipse Allgemeines EE 0
B Problem beim Lesen des Codes... Allgemeines EE 2
R JPA Problem beim Speichern eines Users Allgemeines EE 2
S WebSocket Problem Allgemeines EE 0
F Eclipse/Java EE Debug-Problem Allgemeines EE 1
G Problem: Servlet in JSP einbinden mit <jsp:include> Allgemeines EE 3
Raidri [SEAM] rich:dataTable sortBy Problem Allgemeines EE 6
T Problem mit den Beispielen von Apache Allgemeines EE 5
W JSF Validator Problem HTTP Status 500 Allgemeines EE 2
E JBoss 7.1 Datasource Problem Allgemeines EE 2
M JSP Problem -unbestimmte Anzahl von Werten Transportieren Allgemeines EE 9
S Problem mit EJB Verständnis Allgemeines EE 4
B Problem beim einbinden einer CSS in eine JSP Allgemeines EE 8
F JSP Problem mit Datenbankanbindung über Glassfishserver Allgemeines EE 4
S java Entities Problem Allgemeines EE 19
S Embedded JBoss Problem beim Deployment Allgemeines EE 4
F problem mit nullpointer bei DB zugriff Allgemeines EE 2
A Erste Schritte... Problem mit Hibernate Allgemeines EE 15
ruutaiokwu jboss problem - work-verzeichnis muss manuell gelöscht werden??? Allgemeines EE 5
Stillmatic sendRedirect Problem! Allgemeines EE 3
M Problem mit Lookup auf EJB3 mit Glassfish Allgemeines EE 11
0 Problem mit librarys javax.servlet.http.HttpServletRequest cannot be resolved Allgemeines EE 1
X JBoss InitialContext problem Allgemeines EE 5
LordZed Problem mit dem einbinden von Bibliotheken, die sich gegenseitig verwenden Allgemeines EE 5
H GWT Problem beim Ausführen Allgemeines EE 8

Ähnliche Java Themen

Neue Themen


Oben