Maison  >  Article  >  Java  >  Introduction à la méthode de réception et de réponse SpringMVC aux données json (avec code)

Introduction à la méthode de réception et de réponse SpringMVC aux données json (avec code)

不言
不言avant
2019-03-12 15:41:284722parcourir

Cet article vous présente la méthode de réception et de réponse de SpringMVC aux données json (avec du code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

En plus de soumettre des données via le formulaire, l'interaction des données front-end et back-end peut également transmettre et recevoir des données au format json au back-end via ajax (cette méthode peut réaliser la séparation des requêtes données et page). Cet article résumera plusieurs façons de recevoir et de répondre aux données json dans Spring MVC.

Étapes de préparation :
1. Importez les dépendances des frameworks liés à json (tels que jackson).
2. La méthode du contrôleur de spring mvc est écrite normalement. Si vous devez répondre à json, ajoutez l'annotation @responsebody.
3. Avant d'accepter les paramètres d'entrée correspondant à json, ajoutez l'annotation @RequestBody.
Le serveur reçoit les données json et les restaure dans un objet java, ce qu'on appelle la désérialisation. Au contraire, convertir l'objet java en données json en réponse et le renvoyer au client est appelé sérialisation.

Remarque : Parce que vous souhaitez utiliser ajax, vous devez introduire jQuery, rappelez-vous !

Dépendance Jackson Maven :

        <!-- jackson依赖 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.7.0</version>
        </dependency>

1. Recevoir avec la classe d'entité

Contexte : Lorsque ajax transmet de nombreux paramètres, il n'est pas pratique d'utiliser la méthode de correspondance des noms de paramètres. S'il existe une classe d'entité correspondante en arrière-plan, vous pouvez choisir d'encapsuler les données au format json sur le client et de les transmettre à l'arrière-plan, et l'arrière-plan utilisera la classe d'entité correspondante pour les recevoir.

Client :

<button onclick="clickMe()">点我</button>
<script>
    function clickMe() {
        $.ajax({
            type : 'POST',
            url : "acceptJsonByEntity",
            contentType : "application/json;charset=utf-8",
            // 如果想以json格式把数据提交到后台的话,JSON.stringify()必须有,否则只会当做表单提交
            data : JSON.stringify({
                "bookId" : 1,
                "author" : "Jack"
            }),
            // 期待返回的数据类型
            dataType : "json",
            success : function(data) {
                var bookId = data.bookId;
                var author = data.author;
                alert("success:" + bookId+','+author);
            },
            error : function(data) {
                alert("error" + data);
            }
        });
</script>
L'annotation @responseBody convertit l'objet renvoyé par la méthode du contrôleur dans le format spécifié via un convertisseur approprié, puis l'écrit dans la zone du corps de la réponse objet Généralement utilisé pour renvoyer des données JSON ou XML.

L'annotation @RequestBody est souvent utilisée pour gérer du contenu dont le type de contenu n'est pas l'encodage application/x-www-form-urlcoded par défaut. De manière générale, il est couramment utilisé pour gérer les types application/json.

Contrôleur :

@Controller
public class PassJsonParam {
    @RequestMapping(value="acceptJsonByEntity",method = RequestMethod.POST)
    @ResponseBody
    public Book acceptJsonByEntity(@RequestBody Book book, HttpServletRequest request){
        System.out.println("当前http请求方式为:"+request.getMethod());
        System.out.println("bookId="+book.getBookId()+", author="+book.getAuthor());
        return book;
    }
}

Sortie de la console : La méthode de requête http actuelle est : POST bookId=1, author=Jack

Client (fenêtre contextuelle ) :success:1,Jack


Si toutes les méthodes du contrôleur doivent renvoyer des données au format json, vous pouvez utiliser l'annotation @RestController.

@RestController = @Controller + @ResponseBody

Contrôleur (le contrôleur ci-dessus peut être remplacé par le suivant) :

@RestController
public class PassJsonParam {
    @RequestMapping(value="acceptJsonByEntity",method = RequestMethod.POST)
    public Book acceptJsonByEntity(@RequestBody Book book, HttpServletRequest request){
        System.out.println("当前http请求方式为:"+request.getMethod());
        System.out.println("bookId="+book.getBookId()+", author="+book.getAuthor());
        return book;
    }
}

Remarque : après avoir utilisé le @RestController annotation , la méthode du Controller ne peut plus renvoyer de pages jsp ou HTML, et l'analyseur de vue configuré ne fonctionnera pas.

2. Recevoir en mode carte

Contexte : Le frontend envoie une requête ajax au backend et transporte de nombreux paramètres, mais le backend n'a pas la classe d'entité correspondante pour la recevoir. Je fais? Le plus courant est le formulaire, dans lequel vous pouvez envisager d'utiliser une carte pour le résoudre. Étant donné que la structure des données de la carte est au format clé-valeur, nous pouvons parcourir le formulaire de zone de recherche et utiliser le nom du formulaire comme clé de la carte et la valeur du formulaire comme valeur de la carte.

Client :

<form id="bookForm">
    <input type="text" name="bookName" id="bookName">
    <input type="text" name="author" id="author" >
    <button onclick="submitForm(event)">提交</button>
</form>

<script>
    function submitForm(event) {
        //阻止form默认事件
        event.preventDefault();
        //得到搜索框数据
        var map = new Map();
        $("#bookForm input").each(function () {
            var value = $(this).val();      //input 值
            var name = $(this).attr('name');
            map.set(name,value);
        })

        //Map转为Json的方法
        var obj= Object.create(null);
        for (var [k,v] of map) {
            obj[k] = v;
        }

        $.ajax({
            type: 'POST',
            contentType:'application/json',
            url: "acceptJsonByMap",
            data: JSON.stringify(obj),
            dataType: 'json',
            success: function (data) {
                var bookName = data.bookName;
                var author = data.author;
                alert("bookName ="+bookName+"; author="+author);
            },
            error: function (data) {
                alert("失败啦");
            }
        });
    }
</script>

Contrôleur :

    @RequestMapping(value="acceptJsonByMap")
    @ResponseBody
    public Map<String,Object> acceptJsonByMap(@RequestBody Map<String,Object> paramsMap, HttpServletRequest request){
        System.out.println("当前http请求方式为:"+request.getMethod());
        System.out.println(paramsMap);
        return paramsMap;
    }

Sortie de la console : La méthode de requête http actuelle est : POST {bookName=Love, author=Frank}

Client (fenêtre pop-up) : bookName =Love; author=Frank

3. Recevoir en mode liste (passé sous forme de tableau json)

Client :

<button onclick="clickHere()">clickHere</button>
<script>
    function clickHere() {
        var params1 = {
            "bookId":"123",
            "author":"Rose"
        };
        var params2 = {
            "bookId":"321",
            "author":"Jack"
        };
        var list = [];
        list.push(params1);
        list.push(params2);

        $.ajax({
            type: 'POST',
            contentType:'application/json',
            url: "acceptJsonByList",
            data: JSON.stringify(list),
            dataType: 'json',
            success: function (data) {
                for (let i = 0; i < data.length; i++) {
                    var bookId = data[i].bookId;
                    var author = data[i].author;
                    alert("bookId ="+bookId+"; author="+author);
                }
            },
            error: function (data) {
                alert("失败啦");
            }
        });
    }
</script>

Remarque : lorsqu'elle est transmise au backend, la liste doit être constituée de données au format json de [ { key1 : value1} { key2 : value2} ], sinon une erreur d'analyse Json peut se produire.

Contrôleur :

    @RequestMapping(value="acceptJsonByList")
    @ResponseBody
    public List<Book> acceptJsonByList(@RequestBody List<Book> book, HttpServletRequest request){
        System.out.println("当前http请求方式为:"+request.getMethod());
        System.out.println(book);
        return book;
    }

Remarque : La classe d'entité Book est requise ici pour recevoir.

Sortie de la console : la méthode de requête http actuelle est : POST [entity.Book@1138a75c,entity.Book@22d1cbcf]

Client (fenêtre contextuelle) : bookId =123 ; Rose bookId =321; auteur=Jack

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer