У чому різниця між @RequestParam
та @PathVariable
обробкою спеціальних символів?
+
було прийнято @RequestParam
як простір.
У разі @PathVariable
, +
було прийнято як +
.
У чому різниця між @RequestParam
та @PathVariable
обробкою спеціальних символів?
+
було прийнято @RequestParam
як простір.
У разі @PathVariable
, +
було прийнято як +
.
Відповіді:
@PathVariable
полягає в тому, щоб отримати деякий заповнювач з URI (Spring називає його шаблоном URI) - див. Весняний довідник Розділ 16.3.2.2 Шаблони шаблонів 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
або реквізити про користувача з ідентифікаційними "рахунками"?
@PathParam
працює лише за умови, що в шаблоні урі є заповнювач)
@PathParam
це примітка javax.ws.rs docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Анотація @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-адресу можна записати у ваш весняний 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
І метод Controller для цього
@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" >
userName
параметр типу, чи ні? Я схиляюся до того, щоб зробити його змінною, але це може бути і парам.
@PathParam
і @RequestParam
оголосити без використання@RequestMapping
@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;
}
1) @RequestParam
використовується для отримання параметрів запиту
http://localhost:3000/api/group/test?id=4
@GetMapping("/group/test")
public ResponseEntity<?> test(@RequestParam Long id) {
System.out.println("This is test");
return ResponseEntity.ok().body(id);
}
при цьому @PathVariable
використовується для отримання даних безпосередньо з URI:
http://localhost:3000/api/group/test/4
@GetMapping("/group/test/{id}")
public ResponseEntity<?> test(@PathVariable Long id) {
System.out.println("This is test");
return ResponseEntity.ok().body(id);
}
2) @RequestParam
є більш корисним у традиційному веб-додатку, коли дані здебільшого передаються в параметрах запиту@PathVariable
більше підходить для RESTful веб-служб, де URL містить значення.
3) в @RequestParam
анотації можна вказати значення за замовчуванням, якщо параметр запиту відсутній або порожній за допомогою defaultValue
атрибута, за умови, що необхідний атрибут false
:
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping(value = "/name")
String getName(@RequestParam(value = "person", defaultValue = "John") String personName) {
return "Required element of request param";
}
}
@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) {
}
Обидва анотації поводяться точно однаково.
Лише 2 спеціальні символи "!" та "@" приймаються до коментарів @PathVariable та @RequestParam.
Для перевірки та підтвердження поведінки я створив додаток для весняного завантаження, яке містить лише 1 контролер.
@RestController
public class Controller
{
@GetMapping("/pvar/{pdata}")
public @ResponseBody String testPathVariable(@PathVariable(name="pdata") String pathdata)
{
return pathdata;
}
@GetMapping("/rpvar")
public @ResponseBody String testRequestParam(@RequestParam("param") String paramdata)
{
return paramdata;
}
}
Натискаючи на запити, я отримав таку ж відповідь:
! @ отримали відповідь в обох запитах
можливо, що додаток / x-www-form-urlencoded тип midia перетворює простір у + , а реципієнт буде декодувати дані, перетворюючи + у space.check URL для отримання додаткової інформації. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
@PathVariable
може використовуватися в будь-якому RequestMethod