Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich habe folgende Struktur.
Ich habe einen ImageService, ein Imagerepository und einen ImageController.
Der ImageService erzeugt in regelmäigen Abständen Images (diese werden im Repository abgespeichert).
Im Controller kann ich über den Endpoint localhost:8080/images die Bilder anzeigen.
Ich verwende Thymleaf um die Gui zu erzeugen.
Nun möchte ich gerne wenn neue Images erzeugt werden, den Controller dazubringen die Seite neu zu laden.
Kann mir jemand einen Hinweis geben, wie man das macht
Das Problem ist erst einmal, dass der Server bei http ja in erster Linie auf Requests antwortet. Der Client muss also eine Anfrage machen und der Server antwortet dann.
Daher ist eine Lösung, dass der Client einfach pollt. Also regelmäßig Anfragen sendet um nach Updates zu fragen.
Man könnte diese Lösung noch anpassen, so dass der Server bei so Anfragen verzögert antwortet. Damit hält der Server aber viele offene Requests und das dürfte schlecht skalieren. Aber sobald sich etwas ändert, dann könnte der Server halt die offenen Requests direkt beantworten.
Eine weitere Idee kann sein, dass man ein Protokoll wählt, das eine Kommunikation in beide Richtungen zulässt. Da kann es viele Ideen geben. Wenn der "Client" ein eigenständiger Server ist, dann könnte man z.B. Web-Hooks verwenden. Dann kann dein Server die Informationen einfach per Web Request an den Client (der ein eigener Server ist) weiter geben. Das wäre dann wie z.B. bei den GitHub Web-Hooks.
Wenn Clients aber wirklich Clients sind (im sinne von beliebige Rechner mit einem Webbrowser oder so), dann könnte man z.B. Web-Sockets nutzen. Dann baut der Client eine entsprechende Verbindung auf und der Server kann auf dieser Verbindung den Client über Updates informieren.
Das nur um ein paar kleine Ideen zu nennen. Generell ist es natürlich wichtig, dass man mehr über die Gegebenheiten erfährt. Ohne genaue Details (z.B. wie groß die "regelmäßigen Abstände" sind, was für Clients daran Interesse haben, wie viele Clients gleichzeitig aktiv sind, ....) ist es auch unmöglich, hier Ratschläge zu geben.
Erst einmal danke für deine Anregungen.
Ja da habeich wohl vie vergssen zu erzählen. Also das ganze läuft als Monolith. Innerhalb von 60s scannt der Image Service ein oder mehrere Verzeichnisse nach neuen JPEG Dateie und liest daraus die Metadaten aus und speichert alle Informationen in einer Datenbank.
Über die web Oberfläche soll es dann möglich sein, nach Bilder zu filtern. Z.B nach dem Aufnahmedatum - solche Daten stehen ja in den MetaDaten.
Da nun aber im Verzeichnis auch neue Bilder hinzugefügt werden können, muss die webSeite sich regelmäßig aktualisieren.
Meine erste Idee war das ganz über das Observerpattern zu realisieren.
D.h
Controller registiret sich beim ImageService und wird dann beim Speichern von einem neuen Bild benachrichtigt
Das Problem ist nicht, dass die Information zu dem Controller kommt. Das Problem ist, dass der Controller ja nur bei einem Request angesprochen wird.
Der Ablauf ist ja:
Der Client sendet einen HTTP Request. Also ein GET/POST/... Request mit einem Pfad wie /images
Das Framework stellt ja den Web Server, da kommt also der Request an. Das Framework prüft dann den Pfad und die Methode und stellt dann Fest: Da muss der ImageController mit der Methode showAll ran.
Jetzt wird die Methode aufgerufen. In der Methode des Controllers hast du dann das Model aufgebaut und gibst dann zurück "showAll" oder so.
Da greift das Framework wieder ein. "showAll" wird dann ausgewertet. Das showAll Template wird also genommen und mit dem Model ausgewertet.
Das Ergebnis der Auswertung ist die HTML Seite und die wird dann an den Client zurück gesendet.
Damit ist der Request erledigt. Da ist also kein Platz für irgend einen Callback oder so. Das ist auch unnötig an der Stelle, denn in dem Punkt, bei dem der Controller mit der spezifischen Methode aufgerufen wurde, musst Du den aktuellen Stand ermitteln. Ein laufendes Update ist also egal.
Wichtig ist: Es macht keinen Sinn, diese Seite immer ganz aufzubauen. Hier solltest Du mit AJAX, also asynchronem Javascript arbeiten. Die eigentliche Seite kann also im Hintergrund immer wieder neue Requests absenden an einen Webservice. Da wäre die Idee, das klein zu halten. Also alle 60 Sekunden oder so fragt der Browser beim Server: Gibt es etwas Neues? (Das kann z.B. über die letzte ID gehen oder so).
Wenn es etwas neues gibt, dann solltest Du lediglich die Differenz abfragen. Also keine ganze Seite sondern nur Teile, die Du dann per Javascript einfügst in der bestehenden Seite.
Ein erster Schritt kann aber auch einfach etwas sein, was Du hier im Forum findest: Du blendest dann einfach ein: "Es gibt neue Bilder, bitte aktualisieren." oder so und da kann der Anwender drauf klicken und die ganze Seite lädt neu. Dann hast Du es relativ einfach gehalten in einem ersten Schritt. (Und Du hast etwas, das man dann nach und nach ausbauen kann!)
Das einfach einmal, um eine einfache Lösung etwas mehr im Detail zu erläutern.