JSP Progress Bar in JSP nur mit Java

Dimax

Top Contributor
Guten Tag,
ich versuche ein Progressbalken in JSP-Seite einbauen,es klappt aber nicht.
Das Balken soll zeigen wie weit das Programm beim Dateianalyse ist.
Auf dieser Seite wird das Balken eingebaut :

MeineJspSeite.jsp
Code:
//Dieser div-Container soll sich die Parameter für Balkenbreite vom Response holen
<div id='myBar' style='background-color:red;width:
 <%=response.getOutputStream() %>;height:30px;'><%=response.getOutputStream() %>
 </div>
 <%  }else{out.print("wird eingelesen");}%>
  </div>

In dieser Datei wird der Parameter gesendet:

MeinJavaFile.java

Code:
@WebServlet("/MeinJavaFile")
@MultipartConfig
public class MeinJavaFile extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

boolean Ergebniss =funktionAufruf1();
if(Ergebniss){
PrintWriter out=response.getWriter();
                    response.setContentType("text/plain");
                    out.write("6%");
                    out.flush();
                    }
else{
System.out.println("Error Funktionaufruf 1);
} usw ..17 fuktionsaufrufe..
Das Problem ist ,dass der response öffnet ein neues Tab im Browser und dort schreibt 6% usw..
Wie kann ich den response als Parameter einsetzen?
 
Ich vermute ich muss mit dem RequestDispatcher den response umleiten ,damit er nicht im neuen Tab geöffnet wird.
Kennt sich jemand damit aus?
mein Versuch ging schief:
Code:
request.getRequestDispatcher("pfad zu meine Datei").include(request, response);
 
Danke an alle die etwas schreiben wollten.Auf ein request mehrere responses senden geht nicht.Und somit können wir diese Thema schlissen.
 
Ich habe es gelöst mit Hilfe von
<meta http-equiv="refresh" content="1">

Also auf der html Seite kleines JavaScript zum Anzeigen von ProgressBar:
Code:
<script>
function demoDisplay() {
  document.getElementById("progress").style.display = "block";
}
</script>
und da ,wo man ProgressBar haben möchte, ein div mit iframe wo als Quelle das Servlet, das mir das Fortschritt zurückliefert.
Code:
<div id="progress" style="width:60%;height:5%;margin:auto;display:none">
    <iframe src="/programmAnalyse" scrolling="no" frameborder="0" style="width:80%;height:100%"></iframe>
</div>

Im Servlet bekomme ich das File per Post-methode und das ProgressBar wird per Get-methode geliefert:
Code:
private long breite=0;//Klassenvariable um von beiden Methoden darauf zugreifen zu können.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String antwort="<meta http-equiv=\"refresh\" content=\"1\"><div style=\"width:100%;height:100%\">"+
                    "Gesamtfortschritt: "+breite+"%<div style=\"width:"+
                        breite+"%;height:100%;background-color:green\"></div></div>";
     OutputStream outs=response.getOutputStream();
     response.setContentType("text/html");
     response.setContentLength(antwort.length());
     outs.write(antwort.getBytes());
     }
Funktioniert..sieht allerdings nicht professionell aus,weil das iframe wird nach eine Sekunde neue geladen,
dafür aber einfach zu implementieren und ohne zusätzlichen Bibliotheken.
 
Was heißt "nur mit Java" und "ohne zusätzliche Bibliotheken"?

Um zu pollen, brauchst Du nicht jedesmal die Seite neu zu laden. Das kannst Du ganz einfach per JavaScript erledigen (über die Fetch API).

Für den Fall wäre long polling eine bessere Alternative. Unter https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/async-servlet/async-servlets.html findest Du ein etwas in die Jahre gekommenes Beispiel.

Auch ließe sich der Spaß mit WebSockets implementieren.

All das ist mit Java EE 7+ ohne zusätzliche Bibliotheken möglich.
 

Zurück
Oben