it-swarm.com.de

Übergeben Sie die Array-Daten von Javascript im Browser an den Spring MVC-Controller mithilfe von Ajax

Ich möchte ein Array von Javascript in einem Webbrowser an einen Spring MVC-Controller mit AJAX übergeben

In Javascript habe ich

var a = [];
a[0] = 1;
a[1] = 2;
a[2] = 3;

// how about multiple arrays as well?

$.ajax({
    type : "POST",
    url : "/myurl",
    data : //not sure how to write this, ("a="+a), ?
    success : function(response) {
       // do something ... 
    },
    error : function(e) {
       alert('Error: ' + e);
    }
}); 

In Java möchte ich eine Klasse erstellen, um Daten von AJAX zu empfangen, und eine Klasse, um Daten zu empfangen

package com.Amazon.infratool.ui;

import lombok.Getter;
import lombok.Setter;


@Setter @Getter
public class RepairInfomationParameters {
//how to write this variable?
    List<String> a = null; // is it something like this?
}

Was ist der richtige Weg, dies zu tun? Vielen Dank!

20
Alfred Zhong

Sie können dies von der JavaScript-Seite aus tun:

$.ajax({
    type : "POST",
    url : "/myurl",
    data : {
        myArray: a //notice that "myArray" matches the value for @RequestParam
                   //on the Java side
    },
    success : function(response) {
       // do something ... 
    },
    error : function(e) {
       alert('Error: ' + e);
    }
}); 

Dann auf der Java-Seite (in Spring 3), vorausgesetzt, dass diese Methode von /myurl zugeordnet wird:

public String controllerMethod(@RequestParam(value="myArray[]") Integer[] myArray){
    ....
}

Ich glaube, das Folgende wird auch funktionieren:

public String controllerMethod(@RequestParam(value="myArray[]") List<Integer> myArray){
    ....
}

Der Frühling ist klug genug, um herauszufinden, wie die Bindung durchgeführt wird.

Für mehrere Arrays möchten Sie vielleicht nur ein Befehlsobjekt haben:

public class MyData {
    private List<Integer> firstArray;
    private List<Integer> secondArray;
    private List<Integer> thirdArray;

    ...
    ...
}

Dann auf der JavaScript-Seite:

$.ajax({
    type : "POST",
    url : "/myurl",
    data : {            
        myData: {
           "firstArray": firstArray,
           "secondArray": secondArray,
           "thirdArray": thirdArray
        }            
    },
    success : function(response) {
       // do something ... 
    },
    error : function(e) {
       alert('Error: ' + e);
    }
}); 

Auf der Java-Seite können Sie mit @ModelAttribute eine Bindung herstellen:

public String controllerMethod(@ModelAttribute(value="myData") MyData myData) throws ParseException {
    ....
}

EDIT

Die @RequestParam-Anmerkung wurde dahin gehend geändert, dass myArray[] anstelle von myArray verwendet wird, da diese Änderung anscheinend im Frühjahr vorgenommen wurde, nachdem diese Antwort zum ersten Mal veröffentlicht wurde.

30
Vivin Paliath

Vivin Paliath funktioniert nur, wenn Sie myArray[] verwenden.

public String controllerMethod(@RequestParam(value="myArray[]") Integer[] myArray){
    ...
}
5
redochka

Es ist sehr einfach, solche Daten an den Spring MVC-Controller zu übergeben, wenn Sie daran denken, dass Daten aus einem String analysiert werden. Wenn Sie also ein Array/eine Liste im Controller erhalten möchten, übergeben Sie eine stringifizierte Version des Arrays:

public String method(
        @RequestParam(value = "stringParam") String stringParam,
        @RequestParam(value = "arrayParam") List<String> arrayParam) {
    ...
}

und das entsprechende Javascript mit jQuery wäre wie:

$.post("/urlToControllerMethod",
    {
        "stringParam" : "test",
        "arrayParam" : [1, 2, 3, "test"].toString()
    }
);

Hinweis: der Parametertyp

List<String> arrayParam

könnte genauso gut durch das entsprechende Array ersetzt werden

String[] arrayParam
4
a.valchev

Wenn Sie Spring MVC 4 verwenden, ist unten der beste Ansatz

Jquery-Code

var dataArrayToSend = []; dataArrayToSend.Push("a"); dataArrayToSend.Push("b"); dataArrayToSend.Push("c");

// Ajax-Code

$.ajax({ contentType: "application/json", type: "POST", data: JSON.stringify(dataArrayToSend), url: "/appUrl", success: function(data) { console.log('done'); }, error: function(jqXHR, textStatus, errorThrown) { console.log('error while post'); }
});

Federsteuerungscode

@RequestMapping(value = "/appUrl", method = RequestMethod.POST) public @ResponseBody void yourMethod(@RequestBody String[] dataArrayToSend) { for (String data : dataArrayToSend) { System.out.println("Your Data =>" + data); } }

Überprüfen Sie, ob dies Ihnen hilft oder nicht!

Prost!

2
Chetan Aher

Am Ende mache ich das und es funktioniert

In js

var a = [];
a[0] = 1;
a[1] = 2;
a[2] = 3;


$.ajax({
    type : "POST",
    url : "/myurl",
    data : "a="+a,  //multiple array, just add something like "&b="+b ...
    success : function(response) {
       // do something ... 
    },
    error : function(e) {
       alert('Error: ' + e);
    }
}); 

Java-Seite, erhalten Sie eine Klasse zum Empfangen von Daten mithilfe von Lombok

@Setter @Getter öffentliche Klasse MyData { private ArrayList a;
}

dann in der Steuerung

@RequestMapping(value = "/repair_info", method = RequestMethod.POST)
public ModelAndView myControl(MyData myData) {
    // get data with myData object
}
1
Alfred Zhong

Vollständig getestete Lösung

$.ajax({
    type : "POST",
    url : "/myurl",
    data : {
        myArray: a //notice that "myArray" matches the value for @RequestParam
                   //on the Java side
    },
    success : function(response) {
       // do something ... 
    },
    error : function(e) {
       alert('Error: ' + e);
    }
}); 

@RequestMapping(value = "/save/", method = RequestMethod.POST)
    public String controllerMethod(@RequestParam(value="myArray[]") List<Integer> myArray){
        System.out.println("My Array"+myArray.get(0));
        return "";
    }
0
Vikas Jain