223 votes

Spring MVC - Comment obtenir tous les paramètres d'une requête dans une carte dans un contrôleur Spring ?

Exemple d'URL :

../search/?attr1=value1&attr2=value2&attr4=value4

Je ne connais pas les noms de attr1, att2 et attr4.

J'aimerais pouvoir faire quelque chose comme ça (ou similaire, peu importe, du moment que j'ai accès à la carte de la requête nom du paramètre -> valeur :

@RequestMapping(value = "/search/{parameters}", method = RequestMethod.GET)
public void search(HttpServletRequest request, 
@PathVariable Map<String,String> allRequestParams, ModelMap model)
throws Exception {//TODO: implement}

Comment puis-je réaliser cela avec Spring MVC ?

352voto

Adam Gent Points 15055

Bien que les autres réponses soient correctes, ce n'est certainement pas la "manière Spring" d'utiliser directement l'objet HttpServletRequest. La réponse est en fait assez simple et ce à quoi on peut s'attendre si vous êtes familier avec Spring MVC.

@RequestMapping(value = {"/search/", "/search"}, method = RequestMethod.GET)
public String search(
@RequestParam Map<String,String> allRequestParams, ModelMap model) {
   return "viewName";
}

58 votes

Si vous cherchez à traiter des valeurs de liste, comme celles d'un groupe de cases à cocher portant le même nom, utilisez : @RequestParam MultiValueMap<String, String>

1 votes

Merci pour cela. Vous pouvez également faire la même chose avec les en-têtes : stackoverflow.com/a/19556291/2599745

4 votes

Cela ne fonctionne que lorsque la méthode de requête est GET ou POST. Il ne fonctionne pas pour les méthodes de demande PUT, DELETE, etc.

36voto

nicholas.hauschild Points 21796

Editar

Il a été souligné qu'il existe ( au moins à partir de 3.0 ) un mécanisme Spring MVC pur par lequel on pourrait obtenir ces données. Je ne le détaillerai pas ici, car c'est la réponse d'un autre utilisateur. Voir La réponse de @AdamGent pour plus de détails, et n'oubliez pas de l'upvoter.

Dans la documentation de Spring 3.2, ce mécanisme est mentionné à la fois sur la page d'accueil et sur le site Web. RequestMapping et la page JavaDoc RequestParam mais avant, il n'est mentionné que dans la page de la JavaDoc RequestMapping page. Dans la documentation de la version 2.5, il n'est pas fait mention de ce mécanisme.

Il s'agit probablement de l'approche préférée de la plupart des développeurs, car elle supprime (au moins cette) liaison avec l'élément HttpServletRequest défini par le jar servlet-api.

/Edit

Vous devriez avoir accès à la chaîne de requête des requêtes via request.getQueryString() .

En plus de getQueryString, les paramètres de la requête peuvent également être récupérés à partir de [request.getParameterMap()](http://docs.oracle.com/cd/E17802_01/products/products/servlet/2.3/javadoc/javax/servlet/ServletRequest.html#getParameterMap()) comme une carte.

13 votes

Je soupçonne que quelqu'un a déclassé cette réponse simplement parce que getQueryString renvoie une chaîne et non une carte. L'opérateur recherchait une carte de paramètres. J'ai ajouté getParameterMap à votre réponse pour aider à la rendre plus correcte :) +1

0 votes

Non, j'ai rétrogradé parce que ce n'est pas la façon de faire de Spring MVC. @RequestParam sera heureux de prendre un Map comme paramètre (voir ma réponse).

0 votes

@AdamGent La question a été posée à un moment où Spring 3.2 n'était pas encore publié. Revenez en arrière et jetez un coup d'œil à la JavaDoc de la version 3.1, et vous remarquerez qu'il n'y a aucune mention de l'utilisation de Spring 3.2. @RequestParam sur un Map<String,String> pour récupérer tous les paramètres de la chaîne de requête. Et s'il vous plaît, ne vous sentez pas donc abhorré par les réponses que vous voyez ici... elles ne sont pas que mauvais :) static.springsource.org/spring/docs/3.1.x/javadoc-api/org/

14voto

Kevin Points 10204

L'objet HttpServletRequest fournit déjà une carte des paramètres. Voir [request.getParameterMap()](http://docs.oracle.com/cd/E17802_01/products/products/servlet/2.3/javadoc/javax/servlet/ServletRequest.html#getParameterMap()) pour plus de détails.

1 votes

La carte de paramètres Get contiendra également les données de formulaire d'une demande POST. Si l'utilisateur ne connaît pas les clés de la chaîne de requête, comment pourra-t-il faire la distinction entre ce qui provient de la chaîne de requête et ce qui provient des données d'un corps POST ?

0 votes

Vous êtes en train de me dire que vous allez traiter un formulaire mais que vous n'avez aucune idée des paramètres réels du formulaire ?

2 votes

La question indique qu'il ne sait pas quels sont les noms des paramètres. Moi non plus, je ne sais pas ce qu'ils sont ;)

12voto

Biggy_java Points 162

Vous pouvez simplement utiliser ceci :

Map<String, String[]> parameters = request.getParameterMap();

Cela devrait fonctionner correctement.

8voto

Utilice org.springframework.web.context.request.WebRequest comme paramètre dans votre méthode de contrôleur, il fournit la méthode getParameterMap() L'avantage est que vous ne contraignez pas votre application à l'API des servlets. Le WebRequest est un exemple d'objet contextuel du modèle JavaEE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X