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)
но это не сработает.
Ответы
Ответ 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) {
}