Sự khác biệt giữa @RequestParam
và @PathVariable
trong khi xử lý các ký tự đặc biệt là gì?
+
được chấp nhận bởi @RequestParam
không gian.
Trong trường hợp @PathVariable
, +
đã được chấp nhận là +
.
Sự khác biệt giữa @RequestParam
và @PathVariable
trong khi xử lý các ký tự đặc biệt là gì?
+
được chấp nhận bởi @RequestParam
không gian.
Trong trường hợp @PathVariable
, +
đã được chấp nhận là +
.
Câu trả lời:
@PathVariable
là để có được một số chỗ dành sẵn từ URI (Spring gọi nó là Mẫu URI) - xem Tham chiếu mùa xuân Chương 16.3.2.2 Các mẫu mẫu URI@RequestParam
cũng để có được một tham số từ URI - xem Spring Reference Chương 16.3.3.3 Tham số yêu cầu liên kết với các tham số phương thức với @RequestParamNếu URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
lấy hóa đơn cho người dùng 1234 vào ngày 5 tháng 12 năm 2013, phương thức điều khiển sẽ như sau:
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
Ngoài ra, các tham số yêu cầu có thể là tùy chọn và kể từ các biến đường dẫn của Spring 4.3.3 cũng có thể là tùy chọn . Hãy coi chừng, điều này có thể thay đổi hệ thống phân cấp đường dẫn URL và đưa ra xung đột ánh xạ yêu cầu. Ví dụ: sẽ /user/invoices
cung cấp hóa đơn cho người dùng null
hoặc chi tiết về người dùng có "hóa đơn" ID?
@PathParam
chỉ hoạt động nếu có một trình giữ chỗ trong mẫu uri)
@PathParam
là một chú thích javax.ws.rs. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Chú thích @RequestParam được sử dụng để truy cập các giá trị tham số truy vấn từ yêu cầu. Nhìn vào URL yêu cầu sau:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
Trong yêu cầu URL ở trên, các giá trị cho param1 và param2 có thể được truy cập như dưới đây:
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
Sau đây là danh sách các tham số được hỗ trợ bởi chú thích @RequestParam:
@PathVariable
@ PathVariable xác định mẫu được sử dụng trong URI cho yêu cầu đến. Hãy xem URL yêu cầu bên dưới:
http: // localhost: 8080 / springmvc / xin chào / 101? param1 = 10 & param2 = 20
Yêu cầu URL trên có thể được viết trong Spring MVC của bạn như sau:
@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){
.......
}
Chú thích @ PathVariable chỉ có một giá trị thuộc tính để liên kết mẫu URI yêu cầu. Nó được phép sử dụng nhiều chú thích @ PathVariable trong phương thức đơn. Nhưng, đảm bảo rằng không có nhiều hơn một phương thức có cùng một mẫu.
Ngoài ra còn có một chú thích thú vị hơn: @MatrixVariable
Và phương thức điều khiển cho nó
@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";
}
Nhưng bạn phải kích hoạt:
<mvc:annotation-driven enableMatrixVariables="true" >
userName
có một loại param hay không? Tôi đang nghiêng về việc biến nó thành một biến số, nhưng nó cũng có thể là một thông số.
@PathParam
và @RequestParam
được khai báo mà không cần sử dụng@RequestMapping
@RequestParam được sử dụng cho tham số truy vấn (giá trị tĩnh) như: http: // localhost: 8080 / tính toán / pow? Base = 2 & ext = 4
@PathVariable được sử dụng cho các giá trị động như: http: // localhost: 8080 / tính toán / 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
được sử dụng để trích xuất các tham số truy vấn
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);
}
while @PathVariable
được sử dụng để trích xuất dữ liệu ngay từ 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
hữu ích hơn trên một ứng dụng web truyền thống, nơi dữ liệu chủ yếu được truyền vào các tham số truy vấn trong khi @PathVariable
phù hợp hơn với các dịch vụ web RESTful nơi URL chứa các giá trị.
3) @RequestParam
chú thích có thể chỉ định các giá trị mặc định nếu tham số truy vấn không có hoặc trống bằng cách sử dụng một defaultValue
thuộc tính, với điều kiện thuộc tính bắt buộc là 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) {
}
Cả hai chú thích hành xử chính xác theo cùng một cách.
Chỉ có 2 ký tự đặc biệt '!' và '@' được chấp nhận bởi các chú thích @PathVariable và @RequestParam.
Để kiểm tra và xác nhận hành vi tôi đã tạo một ứng dụng khởi động lò xo chỉ chứa 1 bộ điều khiển.
@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;
}
}
Đánh theo các yêu cầu sau Tôi nhận được phản hồi tương tự:
! @ đã nhận được phản hồi trong cả hai yêu cầu
có thể là loại midia của ứng dụng / x-www-form-urlencoding chuyển đổi không gian thành + và người nhận sẽ giải mã dữ liệu bằng cách chuyển đổi + thành dấu cách. kiểm tra url để biết thêm thông tin. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
@PathVariable
có thể được sử dụng trong mọi RequestMethod