it-roy-ru.com

@RequestParam vs @PathVariable

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

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

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

294
user1857181

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

@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 или информацию о пользователе с идентификатором "счета-фактуры"?

450
Ralph

@ 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 - это значение по умолчанию в качестве резервного механизма, если запрос не имеет значения или он пустой.
  • name - Имя параметра для привязки
  • обязательно - является ли параметр обязательным или нет. Если это правда, не удастся отправить этот параметр.
  • значение - это псевдоним для атрибута имени

@ PathVariable

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

HTTP: // локальный: 8080/SpringMVC/Привет/101 param1 = 10 & param2 = 2

Приведенный выше 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: // локальный: 8080/spring_3_2/matrixvars/акции; 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" >
94
Xelian

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

@PathVariable используется для динамических значений, таких как: http: // localhost: 8080/analysis/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;
}
15
alok

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

0
andy