2017-05-20 4 views
0

Von meiner Webseite aus mache ich eine GET-Anfrage an ein Servlet über eine Schaltfläche. Mein Servlet liest von einer Webcam und speichert eine Bilddatei (gespeichert in 'img/frame.jpg'). Meine Webseite enthält dann ein Skript, das jede Sekunde aus dieser Datei liest. Es wird also auf der Webseite aktualisiert.Java Servlet-Logik aufrufen, ohne auf neue Seite zu verweisen

Webseite:

<html> 
<body> 
    <img id='feed' src="img/frame.jpg" /> 
    <form method="GET" 
     action="startCCTV.do"> 
     <br><br> 
     <center> 
      <input type="SUBMIT"? value='Start'/> 
     </center> 
    </form> 
    <script src='https://code.jquery.com/jquery-3.1.0.min.js'></script> 
    <script src="js/main.js"></script> 
</body> 

JavaScript (aktualisiert, da die Frage beantwortet wurde):

window.setInterval(function updateFrame() { 
    invokeServlet(); 
}, 1000); 

// Preload images. 
function refreshImage() { 
    var image = new Image(); 
    image.src = "img/frame.jpg?" + new Date().getTime(); 
    image.onload = function() { 
     // Image exists and is loaded. 
     $("#feed").attr('src', "img/frame.jpg?" + new Date().getTime()); 
    }  
} 

// Send a GET request to the Servlet, to write a new image from the webcam. 
function invokeServlet() { 
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (this.readyState == 4) { 
      refreshImage(); 
     } 
    }; 

    xhttp.open("GET", "startCCTV.do", true); 
    xhttp.send(); 
} 

Ich habe habe eine Endlosschleife in meinem Servlet, um kontinuierlich einen neuen schreiben Bild, so würde das Bild auf der Webseite aktualisiert werden. Es scheint jedoch keine gute Möglichkeit zu sein (das Bild wurde alle 3 oder 4 Sekunden aktualisiert und manchmal gar nicht angezeigt). Ich denke, der beste Weg wäre, meine GET-Anfrage in einer Schleife in meiner updateFrame()-Funktion zu haben, und das Servlet würde ein Bild pro Anfrage schreiben.

Allerdings weiß ich nicht, wie ich diese Anfrage in meinem Javascript stellen kann, ohne auf die Servlet-Antwort umgeleitet zu werden, sobald das Servlet seinen Schreibprozess abgeschlossen hat.

Wie kann ich intermittierende Anfragen an mein Servlet stellen, ohne auf eine neue Seite umgeleitet zu werden (d. H. Einfach das Bild auf meiner Seite aktualisieren)?

+0

Wie wäre es mit Ajax Call? –

+0

@Yohannes Können Sie mir bitte ein Beispiel geben? – petehallw

Antwort

0

Wie vorgeschlagen, bestand die Lösung darin, einen AJAX-Aufruf zu verwenden. Ich implementiert dies wie folgt:

// Send a GET request to the Servlet, to write a new image from the webcam. 
function invokeServlet() { 
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (this.readyState == 4) { 
      refreshImage(); 
     } 
    }; 
    xhttp.open("GET", "startCCTV.do", true); 
    xhttp.send(); 
} 

ich dieses invokeServlet Methode von meinem setInterval Methode aufgerufen. Ich habe das JavaScript in der Frage aktualisiert, um dies zu berücksichtigen.

0

Um Flimmern zu vermeiden, Bild beim Laden fehlt, können Sie das neue Bild laden und anzeigen, wenn die Ladung abgeschlossen ist.
Wie das geht, ist in anderen answers verfügbar.

+0

Ich habe jetzt meinen vollständigen JavaScript-Code gezeigt - ich überprüfe, ob die Bilder in meiner Methode 'refreshImage()' über 'image.onload' geladen werden. Das Bild verschwindet jedoch manchmal immer noch ... Weißt du, was falsch sein könnte? Vielen Dank! – petehallw

+0

In Ihrem Code hat newDate() .getTime() einen anderen Wert, wenn der Ladevorgang später abgeschlossen wird. Sie können die zu ladende URL in einer Variablen speichern und dieselbe anzeigen, die geladen wurde. – TopReseller

Verwandte Themen