Получить запрашиваемое значение (URL) при использовании аннотаций @RequestMapping
Когда я сопоставляю несколько значений с @RequestMapping (например Несколько Spring @RequestMapping аннотаций), могу ли я получить запрошенное значение (URL)?
Вот так:
@RequestMapping(value={"/center", "/left"}, method=RequestMethod.GET)
public String getCenter(Model model) throws Exception {
String requestedValue = getRequestedValue(); // I want this.
// I want to do something like this with requested value.
String result;
if (requestedValue.equals("center")
result = "center";
else if (requestedValue.equals("left")
result = "left";
return result;
}
Ответы
Ответ 1
Из Spring 3.1.0 вы можете использовать Шаблоны шаблонов URI с регулярными выражениями.
@RequestMapping(value={"/{path:[a-z-]+}"}, method=RequestMethod.GET)
public String getCenter(@PathVariable String path) throws Exception {
// "path" is what I want
}
Ответ 2
Вы можете сами запросить (HttpServletRequest
) как параметр метода обработчика. Поэтому вы можете проверить URL-адрес запроса, чтобы получить "значение".
@RequestMapping(value={"/center", "/left"}, method=RequestMethod.GET)
public String getCenter(Model model, HttpServletRequest request) throws Exception {
String whatYouCallValue = request.getServletPath();
....
Btw: когда я понимаю вас, вы хотите иметь разные URL-адреса, а не разные значения.
Ответ 3
Использовать аннотацию RequestParam. Вы также можете добавить к вашему методу параметр типа HttpServletRequest, а затем getParameters.
Ответ 4
Из Spring 3.1.0 вы можете использовать ServletUriComponentsBuilder
@RequestMapping(value={"/center", "/left"}, method=RequestMethod.GET)
public String getCenter(Model model) throws Exception {
UriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequest();
String requestedValue = builder.buildAndExpand().getPath(); // I want this.
System.out.println(requestedValue);
// I want to do something like this with requested value.
String result="fail";
if (requestedValue.equals("center"))
result = "center";
else if (requestedValue.equals("left"))
result = "left";
return result;
}
Ответ 5
Дополнение к лучшему ответу @Hugh_Lee:
Этот метод будет работать для всех не сопоставленных запросов. Если вы хотите использовать этот метод только для двух (или нескольких) случаев, например, "/center" и "/left", вы можете сделать следующее. Переименуйте "центр" в "positionCenter", "left" на "positionLeft" (или добавьте другое общее слово). Таким образом, код будет выглядеть следующим образом:
@RequestMapping(value={"/{path:position+[A-Za-z-]+}"}, method=RequestMethod.GET)
public String getCenter(@PathVariable String path) throws Exception {
// "path" is what I want
}
Ответ 6
Следующее регулярное выражение сделает ваш метод выполненным только для URL-адресов /center
и /left
. И вы можете получить значение с помощью аннотации @PathVariable
.
@GetMapping("/{path:^center$|^left$}")
public ResponseEntity<?> whatIsThePath(@PathVariable String path){
// path is either "center" or "left"
}