web-dev-qa-db-fra.com

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

Exemple d'URL:

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

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

J'aimerais pouvoir faire quelque chose comme ça (ou similaire, ça m'est égal, aussi longtemps que j'ai accès à la carte de la requête name name -> value:

@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 atteindre cet objectif avec Spring MVC?

161
MDb

Bien que les autres réponses soient correctes, l'utilisation de l'objet HttpServletRequest directement n'est pas le "moyen printanier". La réponse est en fait assez simple et ce à quoi vous pouvez vous attendre si vous connaissez Spring MVC.

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

Modifier

Il a été signalé qu’il existe ( au moins à partir de la version 3. ) un mécanisme Spring Spring pur permettant d’obtenir ces données. Je ne vais pas détailler ici, car c'est la réponse d'un autre utilisateur. Voir @ AdamGent's answer pour plus de détails, et n'oubliez pas de le relire.

Dans la documentation Spring 3.2, ce mécanisme est mentionné à la fois dans la page RequestMapping JavaDoc et dans la page RequestParam JavaDoc, mais auparavant, il est uniquement mentionné dans la page RequestMapping. La documentation 2.5 ne mentionne pas ce mécanisme.

C'est probablement l'approche préférée par la plupart des développeurs car elle supprime (au moins cette) la liaison à l'objet HttpServletRequest définie par servlet-api jar.

/Modifier

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

En plus de getQueryString, les paramètres de requête peuvent également être extraits de request.getParameterMap () sous forme de carte.

32
nicholas.hauschild

L'objet HttpServletRequest fournit déjà une carte de paramètres. Voir request.getParameterMap () pour plus de détails.

13
Kevin

vous pouvez simplement utiliser ceci:

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

Cela devrait bien fonctionner

9
Biggy_java

Utilisez org.springframework.web.context.request.WebRequest en tant que paramètre de votre méthode de contrôleur. Il fournit la méthode getParameterMap(). L'avantage est que vous n'appliquez pas votre application à l'API Servlet. WebRequest est un exemple d'objet de contexte de modèle JavaEE.

7

Il y a deux interfaces

  1. org.springframework.web.context.request.WebRequest
  2. org.springframework.web.context.request.NativeWebRequest

Permet l’accès aux paramètres de requête génériques ainsi qu’à request/session accès aux attributs, sans liens avec l’API de servlet/portlet natif .

Ex.:

@RequestMapping(value = "/", method = GET)
public List<T> getAll(WebRequest webRequest){
    Map<String, String[]> params = webRequest.getParameterMap();
    //...
}

P.S. Il y a Docs sur les arguments qui peuvent être utilisés comme paramètres de contrôleur.

6
katoquro

Voici l'exemple simple de obtenir les paramètres de requête dans une carte.

 @RequestMapping(value="submitForm.html", method=RequestMethod.POST)
     public ModelAndView submitForm(@RequestParam Map<String, String> reqParam) 
       {
          String name  = reqParam.get("studentName");
          String email = reqParam.get("studentEmail");

          ModelAndView model = new ModelAndView("AdmissionSuccess");
          model.addObject("msg", "Details submitted by you::
          Name: " + name + ", Email: " + email );
       }

Dans ce cas, il liera la valeur de studentName et studentEmail avec les variables name et email, respectivement.

5
Shrirang Kadale

Je serais peut-être en retard à la fête, mais selon ma compréhension, vous recherchez quelque chose comme ceci:

for(String params : Collections.list(httpServletRequest.getParameterNames())) {
    // Whatever you want to do with your map
    // Key : params
    // Value : httpServletRequest.getParameter(params)                
}
5
goelanshul
        @SuppressWarnings("unchecked")
        Map<String,String[]> requestMapper=request.getParameterMap();
        JsonObject jsonObject=new JsonObject();
        for(String key:requestMapper.keySet()){
            jsonObject.addProperty(key, requestMapper.get(key)[0]);
        }

// tous les paramètres seront stockés dans jsonObject

2
Agyaey Tiwari

Il existe une différence fondamentale entre les paramètres de requête et les paramètres de chemin. Cela ressemble à ceci: www.your_domain?queryparam1=1&queryparam2=2 - paramètres de requête. www.your_domain/path_param1/entity/path_param2 - paramètres de chemin.

Ce qui m'a surpris, c'est qu'au printemps, dans le monde MVC, beaucoup de gens confondent l'un pour l'autre. Bien que les paramètres de requête ressemblent davantage à des critères de recherche, les paramètres de chemin identifieront probablement une ressource de manière unique. Cela dit, cela ne signifie pas que vous ne pouvez pas avoir plusieurs paramètres de chemin dans votre URI, car la structure de la ressource peut être imbriquée. Par exemple, supposons que vous ayez besoin d’une ressource spécifique en voiture d’une personne donnée:

www.my_site/customer/15/car/2 - recherche d'une deuxième voiture d'un 15ème client.

Quel serait un cas d'utilisation pour mettre tous les paramètres de chemin dans une carte? Les paramètres de chemin n'ont pas de "clé" lorsque vous regardez un URI lui-même, ces clés à l'intérieur de la carte seraient extraites de votre annotation @Mapping, par exemple:

@GetMapping("/booking/{param1}/{param2}")

Depuis HTTP/REST, les paramètres de chemin de perspective ne peuvent pas vraiment être projetés sur une carte. Tout dépend de la flexibilité de Spring et de son désir de répondre aux caprices des développeurs, à mon avis.

Je n'utiliserais jamais une carte pour les paramètres de chemin, mais cela peut être très utile pour les paramètres de requête.

1
yuranos87