В чем разница между @ RequestParam
и @ PathVariable
при работе со специальными символами?
+
был принят @ RequestParam
как пробел.
В случае @ PathVariable
+
было принято как +
.
@ PathVariable
- это получить заполнитель из URI (весенний вызов - шаблон URI)@ RequestParam
также должен получить параметр из URI - см. Весенняя справочная глава 16.3.3.3 Связывание параметров запроса с параметрами метода с помощью @RequestParamЕсли 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
или подробности о пользователе с идентификационными «счетами»?
@ RequestParam аннотация, используемая для доступа к значениям параметров запроса из запроса. Посмотрите на следующий URL запроса:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
В приведенном выше запросе URL значения для param1 и param2 доступны, как показано ниже:
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
Ниже приведен список параметров, поддерживаемых аннотацией @RequestParam:
@ 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
И метод Контролера для этого
@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" >
@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;
}
может случиться так, что приложение / x-www-form-urlencoded midia типа преобразует пространство в + , и рецивер декодирует данные, преобразуя + в space.check URL для получения дополнительной информации. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
@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) {
}