Wiązanie listy w @ RequestParam

Przesyłam kilka parametrów z formularza w ten sposób:

myparam[0]     : 'myValue1'
myparam[1]     : 'myValue2'
myparam[2]     : 'myValue3'
otherParam     : 'otherValue'
anotherParam   : 'anotherValue' 
...

Wiem, że mogę uzyskać wszystkie paramy w metodzie kontrolera dodając parametr jak

public String controllerMethod(@RequestParam Map<String, String> params){
    ....
}

Chcę powiązać parametry myParam [] (nie te pozostałe) z listą lub tablicą (cokolwiek, co utrzymuje porządek w indeksie), więc próbowałem z taką składnią jak:

public String controllerMethod(@RequestParam(value="myParam") List<String> myParams){
    ....
}

I

public String controllerMethod(@RequestParam(value="myParam") String[] myParams){
    ....
}
Ale żaden z nich nie wiąże myparamów. Nawet gdy dodam wartość do mapy nie jest w stanie powiązać "params": {]}
public String controllerMethod(@RequestParam(value="myParam") Map<String, String> params){
    ....
}

Czy istnieje jakakolwiek składnia pozwalająca powiązać niektóre paramy z listą lub tablicą bez konieczności tworzenia obiektu jako @ ModelAttribute z atrybutem list?

Dzięki

Author: Javi, 2011-01-04

6 answers

Tablice w @RequestParam są używane do wiązania kilku parametrów o tej samej nazwie:

myparam=myValue1&myparam=myValue2&myparam=myValue3

Jeśli potrzebujesz bindować @ModelAttribute - parametry indeksowane w stylu, myślę, że i tak potrzebujesz @ModelAttribute.

 59
Author: axtavt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-11 17:25:15

Albo możesz to zrobić w ten sposób:

public String controllerMethod(@RequestParam(value="myParam[]") String[] myParams){
    ....
}

To działa na przykład dla formularzy takich jak:

<input type="checkbox" name="myParam[]" value="myVal1" />
<input type="checkbox" name="myParam[]" value="myVal2" />

To najprostsze rozwiązanie:)

 102
Author: Bernhard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-11 15:54:39

Uzupełniając to, co powiedział Donal Fellows, możesz użyć listy z @RequestParam

public String controllerMethod(@RequestParam(value="myParam") List<ObjectToParse> myParam){
....
}
Mam nadzieję, że to pomoże!
 11
Author: Jorge Peres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-17 19:53:55

Jednym ze sposobów na osiągnięcie tego celu (w hakerski sposób) jest utworzenie klasy wrapper dla List. Tak:

class ListWrapper {
     List<String> myList; 
     // getters and setters
}

Wtedy podpis metody kontrolera będzie wyglądał następująco:

public String controllerMethod(ListWrapper wrapper) {
    ....
}

Nie ma potrzeby używania adnotacji @RequestParam lub @ModelAttribute Jeśli nazwa kolekcji, którą przekazujesz w żądaniu, pasuje do nazwy pola kolekcji klasy wrapper, w moim przykładzie parametry żądania powinny wyglądać tak:

myList[0]     : 'myValue1'
myList[1]     : 'myValue2'
myList[2]     : 'myValue3'
otherParam    : 'otherValue'
anotherParam  : 'anotherValue'
 9
Author: ggreiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-25 13:31:07

Subskrybując to, co powiedział basil w komentarzu do samego pytania, Jeśli method = RequestMethod.GET możesz użyć @RequestParam List<String> groupVal.

Następnie wywołanie usługi z listą param jest tak proste jak:

API_URL?groupVal=kkk,ccc,mmm
 1
Author: Juangui Jordán,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 12:31:26

Zmień wartość ukrytego pola za pomocą przełącznika checkbox jak poniżej...

HTML:

<input type='hidden' value='Unchecked' id="deleteAll" name='anyName'>
<input type="checkbox"  onclick="toggle(this)"/> Delete All

Skrypt:

function toggle(obj) {`var $input = $(obj);
    if ($input.prop('checked')) {

    $('#deleteAll').attr( 'value','Checked');

    } else {

    $('#deleteAll').attr( 'value','Unchecked');

    }

}
 -3
Author: Khomeni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-01 19:09:25