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!
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.
Vivin Paliath funktioniert nur, wenn Sie myArray[]
verwenden.
public String controllerMethod(@RequestParam(value="myArray[]") Integer[] myArray){
...
}
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
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!
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
}
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 "";
}