Es stellt sich die Frage Diese Frage kam auf, als ich Dateidownloads schrieb. Ich verwendete HttpServletResponse, um den Ausgabestream abzurufen, und verwendete dann den Ausgabestream, um Daten direkt zu schreiben. Damals habe ich mich gefragt, ob dieser OutputStream der OutputStream der entsprechenden Socket-Verbindung war. Das heißt, wenn das Programm per Stream schreibt, werden die Daten dann auch gesendet? Wohin schreibt der OutputStream der Antwort die Daten? Also habe ich mir die Methode getOutputStream von HttpServletResponse angesehen, um zu sehen, was in den Kommentaren steht. /** * Gibt einen {@link ServletOutputStream} zurück, der zum Schreiben von Binärdateien geeignet ist * Daten in der Antwort. Der Servlet-Container kodiert die * Binärdaten. * * <p> Durch den Aufruf von flush() im ServletOutputStream wird die Antwort festgeschrieben. * * Entweder diese Methode oder {@link #getWriter} kann * zum Schreiben des Textkörpers aufgerufen werden, nicht beides, außer wenn {@link #reset} * wurde aufgerufen. * * @return a {@link ServletOutputStream} zum Schreiben binärer Daten * * @exception IllegalStateException wenn die Methode <code>getWriter</code> * wurde zu dieser Antwort aufgerufen * * @exception IOException, wenn eine Eingabe- oder Ausgabeausnahme aufgetreten ist * * @siehe #getWriter * @siehe #reset */ öffentliches ServletOutputStream getOutputStream() wirft IOException; Oben heißt es im Kommentar, dass OutputStream zum Schreiben des Inhalts des Antworttexts verwendet wird. Außerdem wird die Methode flush() erwähnt. Dies bedeutet, dass eine Pufferung erfolgen muss, sodass das Schreiben von Daten nicht durch eine direkte Operation auf dem Socket erfolgen sollte. Ich vermute, es sollte ein Byte-Array zur temporären Speicherung vorhanden sein, das dann gleichmäßig geleert wird. Da ich mir aber immer noch nicht sicher war, habe ich mir einfach den Tomcat-Quellcode angesehen. Suchen Sie die Implementierungsklasse von ServletOutputStream, CoyoteOuputStream. Es implementiert die abstrakte Methode „write“ von OutputStream und schreibt die Daten zur Speicherung in das Feld des Typs OutputBuffer. Und dieses OutputBuffer-Objekt stammt von Coyote/Response. Tatsächlich ist dieser OutputBuffer nur eine Schnittstelle und die spezifische Implementierung ist StreamOutputBuffer. Es gibt keine Begrenzung für die Datengröße. Sie werden in einer verknüpften Liste gespeichert, und jeder verknüpfte Listenknoten speichert 8196 Bytes. Wann wird das Antwort-Datagramm an den Client zurückgesendet? Tatsächlich wird dies überprüft, wenn die Flush-Methode von OutputBuffer aufgerufen wird. Ich habe alles Schicht für Schicht durchgesehen und schließlich die Methode finishResponse() des Connectors/Response gefunden. Diese Methode sendet zuerst die Antwortzeile und den Antwortheader. Senden Sie dann den Antworttext. Ich habe nicht viel vom Quellcode von Tomcat gelesen, aber hier ist ein schönes Sequenzdiagramm, das die Verarbeitung einer HTTP-Anfrage beschreibt. Im Folgenden konzentrieren wir uns auf den Servicemethodenaufruf des Servlets und den FinishResponse-Methodenaufruf von Response. Es kann erreicht werden, dass nach der Rückgabe der Servicemethode der Vorgang „finishResponse“ ausgeführt wird. Das heißt, wenn das Servlet-Programm die Anforderung verarbeitet, sendet Tomcat die Antwort an den Client zurück. Hinweis: Das Servlet-Programm beteiligt sich nicht am Senden und Empfangen der zugrunde liegenden Daten und steuert nicht Wo im Diagramm wird die Servicemethode des Servlets aufgerufen? Enthalten in der internalDoFilter-Methode von ApplicationFilterChain. Was bedeutet es, wenn ein Servlet-Programm eine Anforderung verarbeitet? Grundsätzlich besteht die Aufgabe des Servlet-Programms darin, die Antwortinformationen auf Grundlage der Anforderungsinformationen auszufüllen. Welche Beziehung besteht zwischen Servlet-Programmen und Spring MVC? Die zugrunde liegende Schicht von Spring MVC ist weiterhin Serlvet, das alle Anfragen mit einem Servlet namens DispatcherServlet verarbeitet, das die Anfragen wiederum zur Verarbeitung an die entsprechenden mit @RequestMapping annotierten Methoden verteilt. Im Allgemeinen schließt es den Aufruf einer Servicemethode ab. Was ist also mit der MVC-Rückgabeseite und der Rückgabe von REST-Daten? Das Zurückgeben einer Seite bedeutet, dass die Seitendaten in den Antworttext geschrieben werden. Die Annotation @ResponseBody konvertiert den Rückgabewert der mit @RequestMapping annotierten Methode tatsächlich in eine JSON-Zeichenfolge und schreibt sie in den Antworttext. Der Antworttext bezieht sich hier auf den oben erwähnten Ausgabepuffer. Verantwortlichkeiten von Tomcat- und Servlet-Programmen In „So funktioniert Tomcat“ heißt es, dass die Aufgaben eines Servlet-Containers (Tomcat ist ein Servlet-Container) wie folgt zusammengefasst werden können: 1. Erstellen Sie ein Anforderungsobjekt und geben Sie relevante Informationen ein (Parameter, Header, Cookies, URI usw.). 2. Erstellen Sie ein Antwortobjekt 3. Rufen Sie die Servicemethode des mit dieser Anfrage verknüpften Servlets auf und übergeben Sie ihr die Anfrage und die Antwort. Hier erkläre ich es mit meinen eigenen Worten: Wenn ein Browser eine Anfrage an einen Server sendet, analysiert der Server den Inhalt des Anfragedatagramms, erstellt ein Anfrageobjekt, das mit den Anfrageinformationen gefüllt ist, und erstellt ein „leeres“ Antwortobjekt. Diese beiden Objekte werden dann an die Servicemethode des Servlets übergeben, damit dieses das Ausfüllen des Antwortobjekts abschließen und schließlich die Antwortdaten an den Client senden kann. Warum müssen wir das Request-Objekt übergeben? Wenn Sie das Request-Objekt nicht übergeben, weiß das Servlet-Programm nicht, was es eintragen soll. Mit anderen Worten: Es weiß nicht, welche Ressource Sie möchten. Wie findet Tomcat das einer Anforderung zugeordnete Servlet? Wir wissen, dass es bei der Entwicklung von Tomcat unmöglich ist, zu wissen, welches Projekt Sie darin bereitstellen werden oder wie das Servlet-Programm heißt. Daher ist es nicht möglich, den Aufruf der Servicemethode fest zu codieren, da sie den Reflexionsmechanismus verwendet. Überlegen Sie, wie wir das Projekt bereitgestellt haben, bevor wir das Spring Boot-Framework verwendet haben? Packen Sie das Projekt einfach und legen Sie es in das Webapp-Verzeichnis von Tomcat. Nach dem Ausführen lautet die dem Projekt entsprechende URL localhost:8080/projectName/xxx, richtig? Darüber hinaus wird im Projekt die Zuordnung des Servlet-Programms konfiguriert, unabhängig davon, ob es sich um den Annotation-Stil oder den web.xml-Stil handelt. Ordnen Sie einer Servlet-Klassendatei eine URL zu. Wenn eine Anforderung eingeht, suchen Sie zuerst das entsprechende Projekt anhand des Projektnamens und ordnen Sie es dann gemäß der nachfolgenden URL dem entsprechenden Servlet-Klassennamen zu. Tomcat verwendet dann den Reflexionsmechanismus, um die Servlet-Klassendatei zu laden, die Instanz abzurufen und dann die Servicemethode aufzurufen. Welche Beziehung besteht zwischen Coyote/Response, Connector/Response und Connector/ResponseFacade? coyote/Response ist hauptsächlich mit der zugrunde liegenden Datenübertragung verknüpft, und connector/Response ist der Wrapper der oberen Ebene von coyote/Response, der die Schnittstelle HttpServletResponse implementiert. Wenn es jedoch direkt an die Servicemethode übergeben wird, besteht die Befürchtung, dass der Benutzer die HttpServletResponse direkt in einen Connector/eine Antwort konvertiert und einige zugrunde liegende Methoden direkt aufruft. Daher wird ein „Fassadenmodus“ eingeführt, um alle öffentlichen Methoden des Connectors/der Antwort zu blockieren, außer denen, die in der Schnittstelle HttpServletResponse definiert sind. Mit anderen Worten, was an den Dienst übergeben wird, ist tatsächlich das Connector/ResponseFacade-Objekt. Selbst wenn es zwangsweise in den tatsächlichen Typ konvertiert wird, sind nur die von der HttpServletResponse-Schnittstelle definierten Methoden sichtbar. Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: Eine SQL-Anweisung schließt die MySQL-Deduplizierung ab und behält eine
>>: Detaillierte Erläuterung der Verwendung der Vue3-Statusverwaltung
Neun einfache Beispiele analysieren die Verwendun...
Der Ursprung des Problems Das erste Mal, dass ich...
Inhaltsverzeichnis Hintergrund Was ist das Metave...
In der Entwicklungsumgebung wird das Vue-Projekt ...
Ich habe eine Produktteiletabelle wie diese: Teil...
In diesem Artikel wird der spezifische Code für J...
Lassen Sie mich kurz das Funktionsszenario erklär...
Vorwort Führen Sie den Befehl show create table &...
Einführung in Docker Docker ist eine Open-Source-...
1.Mysql-Verbindungsmethode Um das MySQL-Kommunika...
1. Anforderungsbeschreibung Bei einem bestimmten ...
Erweiterte MySQL-SQL-Anweisungen benutze kgc; Tab...
Inhaltsverzeichnis 1. Docker installieren 2. Sona...
Herunterladen und installieren. Prüfen Sie zunäch...
Das Thema, das ich heute mit Ihnen teilen möchte,...