Передайте данные массива из javascript в браузере на spring контроллер mvc с помощью ajax
Я хотел бы передать массив из javascript в веб-браузере в контроллер Spring MVC с помощью AJAX
В javascript у меня есть
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);
}
});
В Java я хотел бы создать класс для приема данных из AJAX, и я создаю класс для приема данных
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?
}
Каков правильный способ сделать это? Спасибо!
Ответы
Ответ 1
Вы можете сделать это со стороны JavaScript:
$.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);
}
});
Затем на стороне Java (в Spring 3), предполагая, что этот метод отображается на /myurl
:
public String controllerMethod(@RequestParam(value="myArray[]") Integer[] myArray){
....
}
Я считаю, что следующее также будет работать:
public String controllerMethod(@RequestParam(value="myArray[]") List<Integer> myArray){
....
}
Spring достаточно умен, чтобы понять, как сделать привязку.
Для нескольких массивов вы можете просто иметь объект команды:
public class MyData {
private List<Integer> firstArray;
private List<Integer> secondArray;
private List<Integer> thirdArray;
...
...
}
Затем со стороны JavaScript:
$.ajax({
type : "POST",
url : "/myurl",
data : {
myData: {
"firstArray": firstArray,
"secondArray": secondArray,
"thirdArray": thirdArray
}
},
success : function(response) {
// do something ...
},
error : function(e) {
alert('Error: ' + e);
}
});
На стороне Java вы можете связать с помощью @ModelAttribute
:
public String controllerMethod(@ModelAttribute(value="myData") MyData myData) throws ParseException {
....
}
ИЗМЕНИТЬ
Изменена аннотация @RequestParam
, чтобы использовать myArray[]
вместо myArray
, поскольку это изменение, по-видимому, было сделано в Spring после того, как этот ответ был впервые опубликован.
Ответ 2
Vivin Paliath не работает, если вы не используете myArray[]
public String controllerMethod(@RequestParam(value="myArray[]") Integer[] myArray){
...
}
Ответ 3
Очень просто передавать такие данные в контроллер Spring MVC, когда вы помните, что данные анализируются из строки. Поэтому, если вы хотите получить массив/список в контроллере - передайте стробированную версию массива:
public String method(
@RequestParam(value = "stringParam") String stringParam,
@RequestParam(value = "arrayParam") List<String> arrayParam) {
...
}
и соответствующий javascript с jQuery будет выглядеть следующим образом:
$.post("/urlToControllerMethod",
{
"stringParam" : "test",
"arrayParam" : [1, 2, 3, "test"].toString()
}
);
Примечание: тип параметра
List<String> arrayParam
может быть также заменен эквивалентом массива
String[] arrayParam
Ответ 4
Если вы используете spring mvc 4, то ниже будет лучший подход
Код JQuery
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');
}
});
Spring код контроллера
@RequestMapping(value = "/appUrl", method = RequestMethod.POST)
public @ResponseBody
void yourMethod(@RequestBody String[] dataArrayToSend) {
for (String data : dataArrayToSend) {
System.out.println("Your Data =>" + data);
}
}
проверить это поможет вам или нет!
Ура!
Ответ 5
В итоге я делаю это, и он работает
В 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 side, получите класс для приема данных, используя lombok
@Setter @Getter открытый класс MyData { private ArrayList a;
}
затем в контроллере
@RequestMapping(value = "/repair_info", method = RequestMethod.POST)
public ModelAndView myControl(MyData myData) {
// get data with myData object
}