Подтвердить что ты не робот

SpringMVC RequestMapping для параметров GET

Как заставить RequestMapping обрабатывать параметры GET в URL-адресе? Например, у меня есть этот url

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

(из jqGrid)

Как должна выглядеть моя RequestMapping? Я хочу получить параметры с помощью HttpReqest

Пробовал это:

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

но это не сработает.

4b9b3361

Ответ 1

Используйте @RequestParam в аргументах метода, поэтому Spring может связывать их, а также использовать @RequestMapping.params, чтобы сузить метод, который будет использоваться spring. Пример кода:

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

Таким образом, Spring выполнит этот метод только в том случае, если присутствуют ВСЕ ПАРАМЕТРЫ, сохраняющие вас от нулевой проверки и связанных с ней вещей.

Ответ 2

Вы можете добавить @RequestMapping так:

@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) {

Ответ 3

Это получит ВСЕ параметры из запроса. Только для целей отладки:

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

Ответ 4

Если вы хотите изменить свой uri, вы также можете использовать 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: Первый foo является частью пути, второй - PathVariable

Ответ 5

Вы должны написать своего рода шаблон в @RequestMapping:

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

Теперь определите свой бизнес-метод следующим образом:

@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) {
...............
}

Итак, структура будет отображать ${foo} в соответствие с @RequestParam.

Так как сортировка может быть либо asc, либо desc, я бы определил ее как перечисление:

public enum Sort {
    asc, desc
}

Spring отлично работает с перечислениями.

Ответ 6

Это работает в моем случае:

@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) {
}