Получить запрашиваемое значение (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;
}

Ответ 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"
}