Jsp die mehrere Servlets aufruft erzeugt Fehler

Status
Nicht offen für weitere Antworten.

tec1

Aktives Mitglied
Hallo Leute,

ich habe eine Strutsanwendung, welche in einer jsp mehrere Bilder darstellt. Diese Bilder(jfreecharts) werden dynamisch durch Servlets erzeugt. Soweit funktioniert alles sehr gut.

Das Problem ist, dass die Erzeugung der Servlet-Bilder mehrere Sekunden dauern kann. Wenn der Benutzer jetzt mittendrin, in der Erzeugung der Bilder, den "zurück-button" des Browsers klickt. Kommt es manchmal zur Fehlermeldung "Cannot forward after response has been committed", wenn der benutzer dann eine andere Action mittels Link ausführt.

Wie kann ich so etwas verhindern? Bilder kann ich ja nur über Servlets erzeugen.

Gruß
 

Robt

Mitglied
Ich raff nicht 100%ig wie du dein Programm aufgebaut hast, aber ich hätte vielleicht eine Idee:

Während des ersten Klicks wird ja schon etwas verarbeitet und ggf auch Variablen verändert, die durch den "züruck-Button" nicht zurückgeschrieben werden. Klickst du nun zum zweiten Mal, sind die Ausgangsbedingungen nicht mehr hergestellt und er kann die neue Anforderung eventuell nicht mehr richtig bearbeiten.
So einen ähnlichen Fehler hatte ich mal, vielleicht liegt es ja daran.....falls es nicht die Lösung sein sollte, bin ich an der richtigen auch interessiert.

Gruß Robt
 

tec1

Aktives Mitglied
Ich habe eine action welche auf eine jsp forwarded.
In dieser jsp is folgender code:
Code:
<c:forEach begin="1" end="${fn:length(chartForm.chartList)}" var="num">
      <html:img page="/chartServlet?idx=${num}"/>

      <p style="padding-bottom: 10px;"></p>
    </c:forEach>

Wenn nun mitten im Aufrufen eines Servlets in der for-schleife der Zurückbutton gedrückt wird oder im Navigationsmenü der Anwendung ein anderer action-link geklickt wird kommt es zu der Meldung.
Mein Problem ist, dass ich nicht weiss wie ich das verhindern kann.
 

Bleiglanz

Gesperrter Benutzer
die Servlet ham damit nix zu tun

client schickt anfrage

server schickt html

browser sucht sich die img-tags und holt sich die bilder

dein problem dürfte woanders liegen: funktioniert der zurückbutton noch richtig? und wie machst du die forwards??
 

tec1

Aktives Mitglied
Wie sollte denn der Zurück-button nicht richtig funktionieren?
Ich bin mir sicher, dass es im Servlet zum Fehler kommt, da es auch mehrere IO-Exceptions gibt, welche ich aber mit try catch abgefangen habe.
 

tec1

Aktives Mitglied
Hier mal das Servlet welches in der jsp mehrmals aufgerufen wird. Vielleicht hat ja jemand eine Idee.

Code:
package de.tec.charts;



import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;

public class ChartServlet extends HttpServlet{
    private static Log log = LogFactory.getLog(ChartServlet.class.getName());
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response){
        try {
            doPost(request, response);
        } 
        catch (ServletException e) {
            if (log.isErrorEnabled()) log.error(e.getLocalizedMessage());
            return;
        }
        catch (IOException e) {
            if (log.isErrorEnabled()) log.error(e.getLocalizedMessage());
            return;
        }
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	if (null==request.getSession().getAttribute("chartForm") || null == request.getParameter("idx"))
	    return;
	
	ChartForm form = (ChartForm) request.getSession().getAttribute("chartForm");
	
	// --- servlet parameter 'idx' ---
	int idx = Integer.parseInt((String) request.getParameter("idx"));
	idx--;
	if (log.isDebugEnabled()) log.debug("idx="+idx);
	JFreeChart chart = form.getChartList().get(idx);
	
	OutputStream out=null;
	try{
	    out = response.getOutputStream();
	} catch (IOException e){
	    // --- leave this method in case of a user wich click the back button ---
	    if (log.isErrorEnabled()) log.error(e.getLocalizedMessage());
	    out.close();
	    return;
	}
	
	try{
	    response.setContentType("image/png");
	    
	    if(null!=cashflowChart)
	    {  
		// --- chart picture as png ..., ..., width, height ---
		try{
		    ChartUtilities.writeChartAsPNG(out, chart, 1100, 700);
		} catch (IOException e){
		    // --- leave this method in case of a user wich click the back button ---
		    if (log.isErrorEnabled()) log.error(e.getLocalizedMessage());
		    return;
		}
	    }
	}
	finally{
	    try{
		out.close();
	    } catch (IOException e){
		// --- leave this method in case of a user wich click the back button ---
		if (log.isErrorEnabled()) log.error(e.getLocalizedMessage());
		return;
	    }
	}
	
    }

}
 

Bleiglanz

Gesperrter Benutzer
das wird nicht in der jsp aufgerufen sondern vom browser...

schreib mal einfach return in die erste Zeile, so dass im Browser kleine rote Kreuzchen kommen: hast du dann das gleiche Problem?

wieviele Bilder sinds denn eigentlich?

und: du darfst auf keinen Fall eine ServletException catchen! deinem doGet feht die richtige throws Klausel!!

und keine returns in catch-Klauseln...
 

tec1

Aktives Mitglied
Wenn ich in der ersten Zeile eine return schreibe, dann werden die servlets so schnell geladen, dass ich es nicht mehr schafffe mittendrin den "Zurück-button" zu klicken.

Ich habe ca. 12 Bilder 1100 * 700 groß.

Mein Code sieht jetzt folgendermaßen aus. Der Fehler tritt weiterhin auf.

Code:
public class ChartServlet extends HttpServlet{
    private static Log log = LogFactory.getLog(ChartServlet.class.getName());
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
	doPost(request, response);
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	if (null==request.getSession().getAttribute("chartForm") || null == request.getParameter("idx"))
	    return;
	
	ChartForm form = (ChartForm) request.getSession().getAttribute("chartForm");
	
	// --- servlet parameter 'idx' ---
	int idx = Integer.parseInt((String) request.getParameter("idx"));
	idx--;
	if (log.isDebugEnabled()) log.debug("idx="+idx);
	JFreeChart chart = form.getChartList().get(idx);
	
	OutputStream out=null;
	try{
	    out = response.getOutputStream();
	} catch (IOException e){
	    // --- leave this method in case of a user wich click the back button ---
	    if (log.isErrorEnabled()) log.error(e.getLocalizedMessage());
	}
	
	try{
	    response.setContentType("image/png");
	    
	    if(null!=chart)
	    {  
		// --- chart picture as png ..., ..., width, height ---
		try{
		    ChartUtilities.writeChartAsPNG(out, chart, 1100, 700);
		} catch (IOException e){
		    if (log.isErrorEnabled()) log.error(e.getLocalizedMessage());
		}
	    }
	}
	finally{
	    try{
		out.close();
	    } catch (IOException e){
		if (log.isErrorEnabled()) log.error(e.getLocalizedMessage());
	    }
	}
	
    }

}
 

Bleiglanz

Gesperrter Benutzer
kannst du mal den fehler genauer beschreiben

du rufst die Seite mit den Bildern auf

wenn du während des Ladens den Zurückbutton wählst kriegst du die Seite vorher

die stimmt soweit? oder??

dann willst du wieder eine Aktion machen: dann kommt der Fehler

und das ganze passiert NUR, wenn du während des Ladens der Bilder auf den zurückbutton klickts? wenn die vollständig geladen werden, dann ist alles OK??
 

tec1

Aktives Mitglied
Jupp, genau so ist der Verlauf. Die Seite auf die ich zurückk gehe ist korekt, bei der nächsten Aktion (z.B. klick auf einen struts link, welcher eine action aufruft) kommt der Fehler.

Gruß
 

tec1

Aktives Mitglied
Ich habe das jetzt so gelöst, dass ich die Erzeugung der Charts in einer anderen Klasse erledige und im Servlet dann nur noch ein byte array mit einem fertigen Bild in den ServletOutputStream packe. Das geht so schnell, dass der Benutzer keine Zeit mehr hat den Zurückbutton zu klicken. Es sollte aber trotzdem kein Fehler auftreten.

Code:
public class ChartServlet extends HttpServlet{
    private static Log log = LogFactory.getLog(ChartServlet.class.getName());
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
	doPost(request, response);
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	if (null==request.getSession().getAttribute("chartForm") || null == request.getParameter("idx"))
	    return;
	
	ChartForm form = (ChartForm) request.getSession().getAttribute("chartForm");
	
	// --- servlet parameter 'idx' ---
	int idx = Integer.parseInt((String) request.getParameter("idx"));
	idx--;
	if (log.isDebugEnabled()) log.debug("idx="+idx);
	
	OutputStream out=null;
	try{
	    out = response.getOutputStream();
	    
	} catch (IOException e){
	    // --- leave this method in case of a user wich click the back button ---
	    if (log.isErrorEnabled()) log.error(e.getLocalizedMessage());
	}
	
	try{
	    response.setContentType("image/png");
	    
	    if(null!=form.getChartPicList().get(idx))
	    {
		byte[] aChartPic = form.getChartPicList().get(idx);
		// --- chart picture as png from a bytearray ---
		out.write(aChartPic, 0, form.getChartPicList().get(idx).length);
	    }
	}
	finally{
	    try{
		out.flush();
		out.close();
	    } catch (IOException e){
		if (log.isErrorEnabled()) log.error(e.getLocalizedMessage());
	    }
	}
	
    }

}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Mehrere Probleme mit Servlets/Java Allgemeines EE 15
R Mehrere Bilder gleichzeitig bzw. dynamisch eines Objektes speichern Allgemeines EE 2
F Mehrere Bilder aus MySQL DB via Servlet darstellen. Allgemeines EE 1
N JAAS login() mehrere Parameter an LoginModul übergeben Allgemeines EE 2
T Mehrere gleiche Jars im Classpath Allgemeines EE 7
A JMS: Mehrere Durable Subscriber dynamisch zur Laufzeit erzeugen - setClientID() Allgemeines EE 2
MQue ein Rechner - mehrere BrowserFenster Allgemeines EE 3
K mehrere Datenbanken mit JBoss 4.2 und EJB3 Allgemeines EE 3
A Mehrere User gleichzeigig, wie mach ich das? Allgemeines EE 14
A Annotation "ID: Primary Key über mehrere Spalten möglic Allgemeines EE 3
M Mehrere Webanwendungen über einen Webserver? Allgemeines EE 2
B JSF - Mehrere Message-Bundles verwenden Allgemeines EE 17
E bei struts inhalte über mehrere seite verteilen Allgemeines EE 6
S mehrere Message Resources in Struts ansprechen Allgemeines EE 7
clemson HTML Taglib - mehrere Submit-Buttons & Internationalisie Allgemeines EE 4
M MVC in J2EE: mehrere JSPs über ein Servlet kontrollieren Allgemeines EE 7
clemson mehrere Mail Attachments - JSP Struts Allgemeines EE 7
W Mehrere Applikationenen mit einer Anmeldung möglich? Allgemeines EE 11
B mehrere submit-buttons in einer jsp Allgemeines EE 11
K Servlets Allgemeines EE 1
B Intellij + WebSphere, Servlets aufrufen Allgemeines EE 1
S JSP, JSF Servlets etc. Empfehlung Allgemeines EE 13
aze Eclipse Java EE Web Project:Wo liegen die Servlets ? Allgemeines EE 4
c_sidi90 Gute Bücher/Tutorials für Einstieg in JSP/Servlets Allgemeines EE 3
A Startseite bei Servlets Allgemeines EE 2
R Sourcen einbinden von J2EE bzw auch für Servlets in Eclipse Allgemeines EE 8
W Übliche Art "lokale" Parameter an Servlets zu über Allgemeines EE 2
D AJAX oder Servlets Allgemeines EE 6
J Sicherheit von Servlets Allgemeines EE 3
G Response bei Servlets Allgemeines EE 5
K Sriplets & Servlets: Offline Projekt auf Server realisie Allgemeines EE 2
M Servlets und Webcrawler Allgemeines EE 4
D JSP/Servlets Buchempfehlung Allgemeines EE 11
C Servlets in Eclipse ausführen Allgemeines EE 5
D Servlets richtig verstehen Allgemeines EE 23
A Servlets: Service-Methoden generell Allgemeines EE 2
I JBOSS IDE EJB 3.0 Servlets JSP Applikation --> JSF sinnvo Allgemeines EE 2
M Servlets | work - Klassen nicht im WAR File Allgemeines EE 5
J Bean in der init-Methode des Servlets instanzieren Allgemeines EE 9
T Servlets: doGet, doPost und service Allgemeines EE 4
M Hosting (inkl. Servlets) Allgemeines EE 25
P JSP Servlets/ Java Klassen für FTP FileUpload (Bilder) + DB Allgemeines EE 3
D Controller-Klassen eines Servlets testen mit JUnit Allgemeines EE 3
M Kommunikation zwischen zwei Servlets Allgemeines EE 5
S gibts ne spezielle möglichkeit applets mit servlets auszugeb Allgemeines EE 3
S aufrufende url bei servlets herausfinden Allgemeines EE 4
I Zusammenspiel Portlets, Servlets und JSPs Allgemeines EE 3
Z Property Datei in Servlets Allgemeines EE 2
S Fragen zu: Servlets, Struts & Hibernate Allgemeines EE 9
S Umlaute und Servlets Allgemeines EE 5
F Servlets und JSP Allgemeines EE 6
P E-mails alias über Servlets einrichten bei Strato- Allgemeines EE 16
G Verständnisfrage zu EJB vs. Servlets Allgemeines EE 3
A Servlets bei Tomcat-Startup starten Allgemeines EE 5
L SVG & Servlets Allgemeines EE 9
J Buchempfehlung: Servlets, JSP, Struts, JSTL Allgemeines EE 3
P Wie Log4J in JSP's, Beans und Servlets am besten einbinden Allgemeines EE 2
M Probleme beim Performancetuning des Servlets Allgemeines EE 2
C JSP funzt in Tomcat, Servlets nicht Allgemeines EE 5
G Servlets und Bilder Allgemeines EE 13
G JSP und Servlets (einfaches MVC-Modell) Allgemeines EE 2
T Grundlegendes Verständnis - Beans, JSP und Servlets Allgemeines EE 3
F Servlets aufrufen Allgemeines EE 5
thE_29 Allg. Frage zu JSP/Servlets Allgemeines EE 2
F relativer Pfad in Servlets für Dateien Allgemeines EE 2
R Servlets in ECLIPSE programmieren Allgemeines EE 3
X servlets und character encoding Allgemeines EE 4
A Frage zu Servlets Allgemeines EE 5
M Cookies mit Servlets Allgemeines EE 6
J Servlets und PrintWriter Allgemeines EE 5
H Servlets nacheinander abarbeiten Allgemeines EE 3
B Servlets werden gemappt --- aus und schluß, so ist es! Allgemeines EE 4
M Fragen zu Servlets Allgemeines EE 5
T Zwei Buttons in derselben FORM rufen unterschied. Servlets a Allgemeines EE 10
K Sun Application Server - Servlets laufen nicht Allgemeines EE 2
J Connectionpools mit BEA und Servlets Allgemeines EE 4
T Servlets und Dateizugriff auf dem Server Allgemeines EE 5
T Servlets in eclipse schreiben !! Allgemeines EE 5
S Servlets zum laufen bringen mit J2EE Allgemeines EE 3
A Leerzeilen in HTML-Seite, nach Erzeugen des Servlets Allgemeines EE 3

Ähnliche Java Themen

Neue Themen


Oben