# Ladeseite anzeigen lassen während das Servlet noch arbeitet?



## Guest (15. Mrz 2007)

Hi Leute,

ich habe folgendes Problem:
Mein Servlet wird von einer JSP aufgerufen. Das Servlet führt einen Prozess aus, der mehrere Sekunden dauern kann. Nun möchte ich eine Ladeseite anzeigen lassen (einfache HTML-Seite), bis der Prozess beendet ist. Wenn der Prozess beendet ist, soll das Servlet an eine andere JSP weiterleiten.

Hat jemand eine Idee wie sich das geschickt umsetzen lässt?

Danke schonmal! 

Gruß Nova


----------



## HaBaLeS (15. Mrz 2007)

Ich kann mir da zwei Möglichkeiten vorstellen die aber auf dem gleichen prinzip basieren.

1. Request kommt an Servlet_1
2. Servlet_1 startet die Berechnung im Hintergrund und liefert eine Seite aus die ....
3. eine Meldung "Bitte warten" anzeigt. diese Seite hat im Header ein refirect auf Servlet_2
4. Servlet 2 Checkt ob die Daten berechnet sind. Wenn nicht weiter bei Schritt 3. Sind die Daten bereit, können die ergebnisse ausgeliefert werden.

Das kannst du nun auch mit AJAX machen dann kannst du das ganze etwas schöner aufbereiten, aber prinzipiell funktioniert es genaus:
1. Berechnung im Hintergrund
2. Status abfragem
3. Wenn fertig ausliefern



Grüße 
HaBaLeS


----------



## Guest (16. Mrz 2007)

Hm, also momentan komm ich überhaupt nicht weiter.
Ich habe auch noch ein Problem damit eine Seite anzuzeigen und gleichzeitig den Prozess im Hintergrund abarbeiten zu lassen. Egal ob ich die Seite vor oder nach dem Prozess generieren lasse, die Seite ist immer erst sichtbar nachdem der Prozess durchgelaufen ist.
Wie macht man das denn idealerweise? Startet man den Prozess in einem neuen Thread (Runnable) oder wie? Und wenn ja, wie soll dann geprüft werden wann der Prozess zuende gelaufen ist, weil eine Schleife im Servlet oder in der JSP würde dann ja auch wieder den Seitenaufbau "blockieren"...

Danke schonmal.

Gruß Nova


----------



## HaBaLeS (16. Mrz 2007)

ja du musst mit Threads arbeiten. Am besten baust du dir einen backroundthread, der anfragen dieser art bearbeiten kann.  Dazu noch eine queue  in die du die ganzen requests reinpackst, damit sie sequenziell abgearbeitet werden.


----------



## Guest (16. Mrz 2007)

Hm, aber an irgendeiner Stelle muss ich die Threads dann ja auch wieder joinen. Und wenn ich die Threads dann joine, hängt die Seite an der Stelle doch wieder, weil die JSP dann erst vollständig aufgebaut wird, sobald die Threads gejoined sind... Oder wie soll ich das machen?

Gruß Nova


----------



## HaBaLeS (22. Mrz 2007)

Was meinst du mit Thread Joinen? Einfach einen Thread starten der im Hintergurnd eine Queue abarbeitet. An diese Queue gibst du nen Job, und desn status von dem Job kannste dann in servlet2 abfragem wenn der job erledigt ist  ergebniss anzeigen


----------



## Novanic (25. Mrz 2007)

Hi,

also ich hatte mir jetzt das hier überlegt. Theoretisch sollte das ja klappen, aber leider funktioniert die Weiterleitung (theDispatcher.forward(...)) nicht. Wie krieg ich das denn funktionsfähig? 


```
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Loading...</title>
    </head>
    <body bgcolor=#000000>
    <%
        final HttpServletRequest theRequest = request;
        final HttpServletResponse theResponse = response;
        final Thread theJobThread = (Thread)theRequest.getAttribute("jobthread");

        Thread theWaitingThread = new Thread(new Runnable()
        {
            public void run() {
                try {
                    theJobThread.join(); //waiting...
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                RequestDispatcher theDispatcher = theRequest.getRequestDispatcher("next.jsp");
                try {
                    theDispatcher.forward(theRequest, theResponse);
                } catch (ServletException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        theWaitingThread.start();
    %>
    </body>
</html>
```

Danke schonmal! 

Gruß Nova


----------

