Vorwort
Ich habe am Tag vor gestern auf ein solches Problem in meiner Arbeit gestoßen. Ich habe ein Pojo in den Schnittstellenparametern eingekapselt. Das ist sehr häufig. Wenn es viele Parameter gibt, besteht das Trägheitsdenken darin, ein Pojo zu verkörpern. Dann gibt es viele Anmerkungen, die Sie vor den Parametern hinzufügen können, wie z. Zunächst werde ich sagen, dass ich den Quellcode noch nie gelesen habe, aber ich verstehe ihn nur auf der Grundlage von Erfahrung. @RequestParam wird versucht, für GET -Anfragen zu verwenden. Die Parameter befinden sich auf der URL im Header von HTTP. Was ist der spezifische Ort? Das Folgende existiert in Form von Schlüssel = Wert. @RequestBody gilt für die Postanforderungsparameter in HTTP -Körper. @PathVariable ist insbesondere die Schreibmethode der Pastful. Setzen Sie Parameter auf die URL ohne Fragen, um zu unterscheiden, ob es sich um einen Parameter oder eine URL handelt. Vielleicht kann ich das nicht sehr genau sagen. Aber ich benutze es normalerweise so. Gleichzeitig gibt es auch eine gemeinsame Möglichkeit, die Parameter zu schreiben, nämlich keine Annotation vor den Parametern hinzuzufügen. Wenn die Parameter beispielsweise Grundtypen sind, fügen Sie nicht @RequestParam hinzu. Wenn die Parameter Beans sind, fügen Sie keine RequestBody hinzu, sie können auch von SpringMVC analysiert werden. Nachdem meine Schnittstelle vom Teamleiter gesehen worden war, bat er mich, den @RequestBody zu entfernen, da nach dem Hinzufügen des Backends die AJAX-Anfrage am vorderen Ende die Anweisung Inhaltstyp anzeigen muss: "Anwendung/JSON", um von SpringMVC analysiert zu werden, was etwas Unnötiges getan hat. Obwohl ich es nach seinen Anforderungen entfernt habe, muss ich herausfinden, was vor sich geht, was der Unterschied zwischen dem Hinzufügen oder nicht hinzuzufügen, welche Auswirkungen es auf die Leistung hat, oder die besten anwendbaren Szenarien für jeden. Neben Baidu muss ich auch die Meister fragen.
Spring MVC -Schnittstelle Parameteranalyseprozess
Zuerst habe ich den Quellcode langsam durch Debugging untersucht. Ohne Anmerkungen hinzuzufügen:
Während des Entwicklungsprozesses werden Verbrauchs und Erzeugnisse im Allgemeinen nicht hinzugefügt. Es sollte entsprechend hinzugefügt werden, da es den Suchbereich der Schnittstelle verringern kann. Dies ist eine einfache Demo, ich brauche ihn nur, um den Prozess der Empfangsanfragen von SpringMVC zu überprüfen.
Erstens, nachdem Tomcat gestartet wurde, sind die Anforderungswege in allen Controller -Klassen @RequestMapping und die Controller -Bohne in den Federbehälter geladen. Nach der Seitenanfrage wird das Senderservlet -Servlet gefunden. Nachdem die Anfrage zum Servlet gekommen ist, weiß jeder, dass es zwei Initialisierungsmethoden des Servlet gibt. Einer ist sofort zu laden, und das andere ist, verzögert zu laden. Unabhängig davon wird die Init -Methode jedoch nur einmal aufgerufen, und dann wird die Servicemethode jedes Mal direkt aufgerufen. Wenn Tomcat geschlossen ist, endet die Zerstörungsmethode des Servlets. Daher muss die SpringMVC -Kapselung von Servlet die Servicemethode erben, und das DispatcherServlet ist auch die Dodispatch -Methode. Bei dieser Methode wird der Anforderungspfad unter Verwendung des HTTPServletRequest -Objekts, das /Notjson, erhalten und dann mit allen URLs im Container verglichen, um die Schnittstelle im Controller schließlich zu erhalten. Nachdem Sie die Schnittstelle gefunden haben, werden Sie natürlich die Parameter der Schnittstelle kennen. Hier bin ich Anzeige. Aus Gründen der Einfachheit und Einfachheit sind nur zwei Parameter in der Anzeige enthalten, die die beiden in der Ajax -Anfrage unten sind.
SpringMVC erhält die Eigenschaften in Pojo durch Reflexion. In diesem Prozess wird SpringMVC zunächst ein Array deklarieren. Die Größe dieses Arrays ist die Anzahl der Parameter. Ich habe hier nur einen. Tatsächlich glaube ich, dass viele Menschen auf das gleiche Problem wie ich stoßen werden. Wie wird SpringMVC dies analysieren, wenn die Parameter von Bohnen und Grundtypen gleichzeitig existieren? Ich habe das mehrmals begegnet. Ohne den Quellcode zu betrachten, werden die Grundtypen auch in die Bean eingekapselt, und das Front-End schreibt auch die Attribute in ein Objekt. Natürlich glaube ich, dass dies nicht jeder akzeptieren kann. Wir alle hoffen, herauszufinden, wie es es analysiert, damit wir zu dieser Zeit damit fummeln können. Das Folgende ist der Reflexionsprozess. Nachdem ich mein Pojo reflektiert habe, bekomme ich die Eigenschaften und Methoden im Inneren. Nach Analyse der Parameter den Parametern Werte zuweisen. Dies ist vielleicht der wichtigste Ort. Wie genau wird zugewiesen?
Aus diesem Methodendebug habe ich gelernt, dass der Name Display ist, das der Kleinbuchstaben des POJO -Klasse -Namens ist. Ich weiß nicht, warum SpringMVC diese Verarbeitung durchführte (siehe später). Attribut ist ein Objekt mit Alter und Namen. Aber zu dieser Zeit ist alles null. WebDatabinding ist ein spezieller Datenbebinder, der für die Datenbindung von Webanforderungsparametern an Javabäe -Objekte verwendet wird. Nach der Methode von BindRequestParameters finden Sie einen sehr vertrauten Ort, wenn es die folgende Abbildung ist. Der Parametername wird unter Verwendung von String[] values = request.getParameterValues(paramName); Dies ist die Methode, um Parameter des Servlets zu erhalten, sodass Sie den Attributnamen und den Attributwert des angeforderten Parameters kennen.
Als nächstes ist es denkbar, dass dieser Parametername durch den Attributnamen der Bean ersetzt und das Alter des Parameternamens durch das Attributname -Alter ersetzt wird. Folgen Sie diesem Ort, die Oragina ist das von der oben genannte Bild erhaltene Eigenschaftsname -Wert, das diese Karte hier in PropertyValue konvertiert. (PropertyValue ist ein Objekt, das die Informationen und Werte einer einzelnen Bean -Eigenschaft enthält. Verwenden eines Objekts hier, anstatt nur alle Eigenschaften in einer vom Eigenschaft tippten Karte zu speichern, ermöglicht mehr Flexibilität und die Fähigkeit, indexierte Eigenschaften zu verarbeiten usw. In optimierter Weise. Auf optimierte Weise. Wenn der Wert nicht erforderlich ist. PropertyValue -Objekte.
Beim Konvertieren werden Sie unbekannte Attribute ignorieren
Das obige Bild zeigt die spezifische Konvertierungsmethode, die relativ lang ist. Der folgende Satz weist der Bean direkt Wert zu. Aus diesem Prozess. Solange die Eigenschaften des Front-End-JSON-Objekts mit den Beaneigenschaften des Back-Ends übereinstimmen, schreibt AJAX keinen Inhaltstyp und verwendet die Standardanwendung application/x-www-form-urlencoded; charset=UTF-8 , Sie können Werte direkt zuweisen.
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.