@RequestParam vs @PathVariable

В чем разница между @RequestParam и @PathVariable при обработке специальных символов?

+ был принят @RequestParam как пространство.

В случае @PathVariable, + был принят как +.

Ответ 1

Если 5 декабря 2013 г. URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 получит счета для пользователя 1234, метод контроллера будет выглядеть следующим образом:

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}

Кроме того, параметры запроса могут быть необязательными, а начиная с Spring 4.3.3 переменные пути также могут быть необязательными. Однако остерегайтесь, это может изменить иерархию пути URL и привести к конфликтам сопоставления запросов. Например, предоставит ли /user/invoices счета-фактуры для пользователя null или информацию о пользователе с идентификатором "счета-фактуры"?

Ответ 2

@RequestParam аннотация, используемая для доступа к значениям параметров запроса из запроса. Посмотрите на следующий URL-адрес запроса:

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

В приведенном выше запросе URL-адреса значения для param1 и param2 можно получить, как показано ниже:

public String getDetails(
    @RequestParam(value="param1", required=true) String param1,
        @RequestParam(value="param2", required=false) String param2){
...
}

Ниже перечислены параметры, поддерживаемые аннотацией @RequestParam:

  • defaultValue - это значение по умолчанию в качестве резервного механизма, если запрос не имеет значения или он пуст.
  • имя - имя параметра для привязки
  • required. Обязателен ли параметр или нет. Если это правда, не удается отправить этот параметр.
  • value - это псевдоним для атрибута name

@PathVariable

@PathVariable определяет шаблон, который используется в URI для входящего запроса. Давайте посмотрим на следующий URL-адрес запроса:

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

Вышеуказанный URL-запрос может быть записан в ваш Spring MVC, как показано ниже:

@RequestMapping("/hello/{id}")    public String getDetails(@PathVariable(value="id") String id,
    @RequestParam(value="param1", required=true) String param1,
    @RequestParam(value="param2", required=false) String param2){
.......
}

Аннотация @ PathVariable имеет только одно значение атрибута для привязки шаблона URI запроса. В одном методе разрешено использовать кратное @ PathVariable. Но убедитесь, что не более одного метода имеет один и тот же шаблон.

Также есть еще одна интересная аннотация: @MatrixVariable

http://localhost:8080/spring_3_2/matrixvars/stocks;BT.A=276.70,+10.40,+3.91;AZN=236.00,+103.00,+3.29;SBRY=375.50,+7.60,+2.07

И метод контроллера для него

 @RequestMapping(value = "/{stocks}", method = RequestMethod.GET)
  public String showPortfolioValues(@MatrixVariable Map<String, List<String>> matrixVars, Model model) {

    logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars });

    List<List<String>> outlist = map2List(matrixVars);
    model.addAttribute("stocks", outlist);

    return "stocks";
  }

Но вы должны включить:

<mvc:annotation-driven enableMatrixVariables="true" >

Ответ 3

@RequestParam используется для параметра запроса (статические значения), например: http://localhost:8080/calculation/pow?base=2&ext=4

@PathVariable используется для динамических значений, таких как: http://localhost:8080/calculation/sqrt/8

@RequestMapping(value="/pow", method=RequestMethod.GET)
public int pow(@RequestParam(value="base") int base1, @RequestParam(value="ext") int ext1){
    int pow = (int) Math.pow(base1, ext1);
    return pow;
}

@RequestMapping("/sqrt/{num}")
public double sqrt(@PathVariable(value="num") int num1){
    double sqrtnum=Math.sqrt(num1);
    return sqrtnum;
}

Ответ 4

может быть, что тип midi-приложения application/x-www-form-urlencoded преобразует пространство в +, и приемник будет декодировать данные, преобразовывая + в space.check url для получения дополнительной информации. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

Ответ 5

@PathVariable - must be placed in the endpoint uri and access the query parameter value from the request
@RequestParam - must be passed as method parameter (optional based on the required property)
 http://localhost:8080/employee/call/7865467

 @RequestMapping(value="/call/{callId}", method = RequestMethod.GET)
 public List<Calls> getAgentCallById(
            @PathVariable("callId") int callId,
            @RequestParam(value = "status", required = false) String callStatus) {

    }

http://localhost:8080/app/call/7865467?status=Cancelled

@RequestMapping(value="/call/{callId}", method = RequestMethod.GET)
public List<Calls> getAgentCallById(
            @PathVariable("callId") int callId,
            @RequestParam(value = "status", required = true) String callStatus) {

}