Je n'ai pas voulu utiliser la session récemment. Je veux découvrir un jeton de manière plus sûre et plus stable, et écrire une interface unifiée pour le navigateur et l'application. J'ai donc changé la réception d'un programme de formation en Ajax, puis j'ai sauté et utilisé SpringMVC pour contrôler le transfert. J'ai une compréhension plus approfondie de la transmission des données JSON. Je vais le partager et s'il vous plaît me corriger.
Dans SpringMVC, nous pouvons choisir plusieurs façons d'accepter JSON. Avant de parler de la façon dont SpringMVC accepte JSON, parlons de ce qu'est JSON. Je ne développerai pas la définition spécifique. En JavaScript, nous définissons souvent les objets JSON de cette manière.
var jsonObject = {"nom d'utilisateur": "admin", "mot de passe": 123}Dans cette forme, nous l'appelons l'objet JSON, et il y a aussi un concept appelé JSON String. Comme son nom l'indique, un tout enveloppé par '' ou "", nous l'appelons une chaîne. Nous savons que les chaînes peuvent être sorties directement, mais les objets ne peuvent pas être sortis directement. Donc, en javascript, nous pouvons
// Définir un objet JSONObjectVar JSONObject = {"Username": "Admin", "Mot de passe": 123}; alert (jsonObject);À l'heure actuelle, [l'objet objet] sera affiché sans sortir le contenu de l'objet JSON. JavaScript nous fournit deux outils
JSON.Parse () est utilisé pour convertir une chaîne JSON en un objet JavaScript. JSON.Stringify () est utilisé pour convertir les valeurs JavaScript en chaînes JSON.
Alors quand nous tapons
alert (json.stringify (jsonObject));
{"nom d'utilisateur": "admin", "mot de passe": 123} sera affiché;
* D'accord, c'est tout pour l'explication de JSON. Parlons de Springmvc *
Puisque JSON a les deux façons d'existence ci-dessus, laquelle devons-nous transmettre la valeur à SpringMVC via Ajax?
Nous essayons d'abord d'envoyer directement l'objet JSON directement
// Définir JSON Object var Username = $ ("# username"). Val (); var mot de passe = $ ("# mot de passe"). Val (); var json = {"nom d'utilisateur": nom d'utilisateur, "mot de passe": mot de passe}; // jQuery ajax request $ .ajax ({url: "jSonTest", type: "post", async: true, data: json, dataType: 'json', réussite: function (data) {if (data.ussertus === "Success") {$ ("# errorm"). } else {if ($ ("# errormsg"). Longueur <= 0) {$ ("form [name = loginform]"). APPEND (errormsg);Réfléchissons d'abord à ce que SpringMVC nous fournit. Il y a une annotation de @RequestParam. Pour cette annotation, sa fonction est fondamentalement la même que la request.getParameter dans notre servlet. Nous utilisons d'abord cette annotation pour l'obtenir
@RequestMapping ("/ jSonTest") public void test (@RequestParam (value = "username", required = true) String username, @RequestParam (value = "mot de passe", obligatoire = true) mot de passe de chaîne) {system.out.println ("username:" + username); System.out.println ("Mot de passe:" + mot de passe); }Nos paramètres ont réussi à sortir de l'arrière-plan ont été acceptés avec succès!
SpringMVC est si intelligent, si nous supprimons l'annotation @RequestParam, que se passera-t-il si nous mettons deux valeurs directement?
@RequestMapping ("/ jSonTest") Public Void Test (String Username, String Motway) {System.out.println ("Username:" + Username); System.out.println ("Mot de passe:" + mot de passe); }C'était en fait un succès. Je n'élaborerai pas le principe ici. Les amis intéressés peuvent briser le point et jeter un œil.
SpringMVC fournit un @Requestbody, qui est utilisé pour traiter les données envoyées par le type de contenu de définition de premier plan: pas l'application / x-www-form-urlencoded Encoding, tel que l'application / JSON, l'application / xml, etc.;
Des amis prudents ont peut-être découvert que dans le précédent AJAX, nous n'avons pas défini le type de type contenu, et JQuery utilise le type d'application / x-www-form-urlencoded par défaut. Cela signifie que l'annotation @ReQuestParam de SpringMVC, et la demande de servlet.GetParameter peut accepter les objets JSON transmis dans ce format.
Pourquoi! ? Je crois que tout le monde connaît les demandes de GET. Il envoie des paramètres au serveur sous la forme d'URL? Username = ”admin” & mot de passe = 123, et request.getParameter peut recevoir ce paramètre. Nous pouvons également le voir dans la barre d'adresse du navigateur. Quant au message que nous utilisons dans Ajax et envoie un objet JSON, comment pouvons-nous l'obtenir en arrière-plan? La réponse réside dans la méthode de codage de contenu de type contenu x-www-form-urlencod convertit les données JSON en une chaîne, (username = ”admin” & mot de passe = 123) et ajoute cette chaîne à l'URL et utilise? Segmentation (est-ce très similaire à la méthode GET). Lorsque la méthode de soumission est post, le navigateur résume les données dans le corps HTTP, puis l'envoie au serveur. Il ne sera donc pas affiché sur l'URL. (Ce paragraphe peut être un peu une touche, j'espère que tout le monde pourra le comprendre attentivement.)
Finalement fini de parler, poussé un long soupir. Ainsi, lorsque nous utilisons l'annotation @Requestbody, le type de contenu de la réception doit être modifié en application / json. S'il n'y a pas de modification, la réception rapportera une erreur de 415 (type de support non soutenu). Le journal d'arrière-plan rapportera un type de contenu d'erreur 'application / x-www-form-urlencoded; charset = utf-8' non pris en charge. Ces erreurs ne seront pas affichées dans Tomcat sous Eclipse. Il ne sera affiché que lorsque le journal sera utilisé. Vous pouvez lire mon article précédent sur la configuration du journal. Ensuite, configurons-le correctement. Ce qui précède a mentionné que le type de contenu doit être modifié et que nos données doivent également être modifiées. Cette méthode d'annotation n'accepte que des chaînes JSON au lieu d'objets JSON.
$ .ajax ({url: "jSonTest", type: "post", async: true, contentType: "application / json", data: json.stringify (json), dataType: 'json', réussite: fonction (data) {if (data.userstatus === "Success") {$ ("# errormsg"). ($ ("# errormsg"). Longueur <= 0) {$ ("form [name = loginform]").L'arrière-plan change également. JSON peut en fait être comprise comme une paire de valeurs clés, nous utilisons donc la carte pour la recevoir, puis traitez davantage la chaîne ou d'autres types de données.
@RequestMapping ("/ jSonTest") public void test (@Requestbody (required = true) map <string, object> map) {String username = map.get ("username"). ToString (); String mot de passe = map.get ("mot de passe"). ToString (); System.out.println ("nom d'utilisateur:" + nom d'utilisateur); System.out.println ("Mot de passe:" + mot de passe); }En même temps, je me suis de nouveau souvenu du SpringMVC magique, j'ai donc décidé de retirer l'annotation et de l'essayer. Ok, j'ai été explosé de manière décisive avec une erreur de pointeur nul ... J'ai essayé de l'arrêter.
SpringMVC fournit également une méthode pour lier directement les paramètres à POJO, essayons-le. La réception est la même, donc je ne le publierai pas.
@RequestMapping ("/ jSonTest") public void test (@RequestBody User utilisateur) {String username = user.getUserName (); String mot de passe = user.getPassword (); System.out.println ("nom d'utilisateur:" + nom d'utilisateur); System.out.println ("Mot de passe:" + mot de passe); }Ok, cette fois, vous pouvez obtenir la valeur. Personnellement, je n'aime pas cette méthode pour télécharger de petits volumes de données comme la connexion. Il existe de nombreuses variables dans l'utilisateur. Je n'en ai utilisé que deux. Il n'est pas nécessaire de créer un objet utilisateur. Généralement, lorsque le volume de données est petit, je préfère toujours utiliser des valeurs distinctes pour l'obtenir. Réfléchissons-y à nouveau, si nous téléchargeons des objets JSON, pouvons-nous lier Pojo? La réponse est oui. N'utilisez pas l'annotation @RequestParam, sinon le paramètre utilisateur requis «l'utilisateur» n'est pas une erreur présente. L'explication est essentiellement là ici, résumons-la ci-dessous.
Nous parlons d'abord des objets JSON et des cordes JSON
Ensuite, lorsque SpringMVC accepte deux ou deux formats JSON, le paramètre de contenu frontal et si le back-end utilise des annotations pour l'accepter, il a également mentionné un petit servlet.
Lorsque AJAX est téléchargé dans le format application / x-www-form-urlencoced, il est nécessaire d'utiliser @RequestParam ou un servlet pour l'obtenir en arrière-plan. Lorsque AJAX est téléchargé au format Application / JSON, il est utilisé pour utiliser les chaînes JSON, l'arrière-plan doit utiliser @RQuestBody pour l'obtenir.
Ce sont un résumé de mes expériences pour une journée. J'espère que cela peut vous aider. S'il y a des erreurs, pardonnez-moi et corrigez-moi.
L'explication détaillée ci-dessus des paramètres JSON acceptée par SpringMVC et le résumé des erreurs communes est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.