2013-07-09 9 views
20

desidero passare una matrice da JavaScript nel browser per un controller Spring MVC utilizzando AJAXdati dell'array passaggio dalla JavaScript nel browser per molla controllore mvc usando ajax

In JavaScript, ho

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, vorrei creare una classe per ricevere dati da AJAX, e ho creare una classe per ricevere i dati

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? 
} 

Qual è il modo corretto di fare questo? Grazie!

risposta

25

È possibile farlo dal lato 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); 
    } 
}); 

Poi sul lato Java (a Spring 3), partendo dal presupposto che questo metodo è mappato da /myurl:

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

Credo che il seguendo lavorerà anche:

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

primavera è abbastanza intelligente per capire come fare il legame.

Per array multipli, si potrebbe desiderare di avere solo un oggetto di comando:

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

    ... 
    ... 
} 

Poi sul lato 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); 
    } 
}); 

Sul lato Java, è possibile associare utilizzando @ModelAttribute:

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

EDIT

Modificata l'annotazione @RequestParam per utilizzare myArray[] anziché solo myArray, poiché questa modifica sembra essere stata effettuata in primavera dopo che questa risposta è stata pubblicata per la prima volta.

+0

Grazie a @vivin, che ne dici di più array? dati: {myArray: a, myArray2: b, ...}? –

+0

@AlfredZhong Ho aggiornato la risposta. –

+0

dovrebbe myArray essere una stringa come "myArray"? –

1

io alla fine a fare questo e funziona

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); 
    } 
}); 

lato Java, avere una classe per ricevere i dati, utilizzando Lombok

@Setter @Getter public class MyData { private ArrayList a;
}

poi nel controller

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

E 'molto semplice, il passaggio di tali dati al controller Spring MVC, quando si ha a mente che i dati vengono analizzati da stringa.Quindi, se si vuole ottenere un array/lista nel controller - passare una versione stringata del matrice:

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

e il corrispondente JavaScript con jQuery sarebbe come:

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

Nota: il tipo di parametro

List<String> arrayParam 

potrebbe essere pure sostituito con la matrice equivalente

String[] arrayParam 
5

Vivin Paliath non funziona se non si utilizza myArray[]

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

Anche questo sembrava funzionare nel nostro caso, mentre la risposta di Vivin no. – Kayaman

+0

Sembra che sia stato aggiornato nelle ultime versioni in primavera. Aggiornerò la mia risposta –

2

Se si utilizza Spring MVC 4 e poi al di sotto sarà il miglior approccio codice

Jquery

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

// codice Ajax

$.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'); }
});

Primavera codice del controller

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

controllo questo ti aiuta o no!

Cheers!

Problemi correlati