web-dev-qa-db-fra.com

SpringMVC RequestMapping pour les paramètres GET

Comment faire le RequestMapping pour gérer les paramètres GET dans l'URL? Par exemple j'ai cette url

http://localhost:8080/userGrid?_search=false&nd=1351972571018&rows=10&page=1&sidx=id&sord=desc

(de jqGrid)

à quoi devrait ressembler mon RequestMapping? Je veux obtenir les paramètres en utilisant HttpReqest

J'ai essayé ceci:

@RequestMapping("/userGrid")
    public @ResponseBody GridModel getUsersForGrid(HttpServletRequest request)

mais ça ne marche pas.

63
Evgeni Dimitrov

Utilisez @ RequestParam dans les arguments de votre méthode pour que Spring puisse les lier. Utilisez également le tableau @ RequestMapping.params pour affiner la méthode qui sera utilisée par spring. Exemple de code:

@RequestMapping("/userGrid", 
params = {"_search", "nd", "rows", "page", "sidx", "sort"})
public @ResponseBody GridModel getUsersForGrid(
@RequestParam(value = "_search") String search, 
@RequestParam(value = "nd") int nd, 
@RequestParam(value = "rows") int rows, 
@RequestParam(value = "page") int page, 
@RequestParam(value = "sidx") int sidx, 
@RequestParam(value = "sort") Sort sort) {
// Stuff here
}

De cette façon, Spring n’exécutera cette méthode que si TOUS LES PARAMÈTRES sont présents, ce qui vous évite toute vérification de la valeur NULL et les tâches connexes.

126
ElderMael

Vous pouvez ajouter @RequestMapping comme ceci:

@RequestMapping("/userGrid")
public @ResponseBody GridModel getUsersForGrid(
   @RequestParam("_search") String search,
   @RequestParam String nd,
   @RequestParam int rows,
   @RequestParam int page,
   @RequestParam String sidx) 
   @RequestParam String sord) {
30
Reimeus

Cela permettra d'obtenir TOUS les paramètres de la demande. À des fins de débogage uniquement:

@RequestMapping (value = "/promote", method = {RequestMethod.POST, RequestMethod.GET})
public ModelAndView renderPromotePage (HttpServletRequest request) {
    Map<String, String[]> parameters = request.getParameterMap();

    for(String key : parameters.keySet()) {
        System.out.println(key);
        String[] vals = parameters.get(key);
        for(String val : vals)
            System.out.println(" -> " + val);
    }

    ModelAndView mv = new ModelAndView();
    mv.setViewName("test");
    return mv;
}
13
Mircea Stanciu

Si vous voulez changer votre uri, vous pouvez aussi utiliser PathVariable.

@RequestMapping(value="/mapping/foo/{foo}/{bar}", method=RequestMethod.GET)
public String process(@PathVariable String foo,@PathVariable String bar) {
    //Perform logic with foo and bar
}

NB: Le premier toto fait partie du chemin, le second est le PathVariable

5
Amanuel Nega

Cela fonctionne dans mon cas:

@RequestMapping(value = "/savedata",
            params = {"textArea", "localKey", "localFile"})
    @ResponseBody
    public void saveData(@RequestParam(value = "textArea") String textArea,
                         @RequestParam(value = "localKey") String localKey,
                         @RequestParam(value = "localFile") String localFile) {
}
1
Kirill Ch

Vous devriez écrire une sorte de modèle dans le @RequestMapping:

http://localhost:8080/userGrid?_search=${search}&nd=${nd}&rows=${rows}&page=${page}&sidx=${sidx}&sord=${sord}

Définissez maintenant votre méthode commerciale comme suit:

@RequestMapping("/userGrid?_search=${search}&nd=${nd}&rows=${rows}&page=${page}&sidx=${sidx}&sord=${sord}")
public @ResponseBody GridModel getUsersForGrid(
@RequestParam(value = "search") String search, 
@RequestParam(value = "nd") int nd, 
@RequestParam(value = "rows") int rows, 
@RequestParam(value = "page") int page, 
@RequestParam(value = "sidx") int sidx, 
@RequestParam(value = "sort") Sort sort) {
...............
}

Le cadre mappera donc ${foo} à @RequestParam approprié.

Puisque sort peut être asc ou desc, je le définirais comme un enum:

public enum Sort {
    asc, desc
}

Le printemps traite très bien des enums.

0
AlexR