Thông thường khi muốn request một thông tin cụ thể nào đó từ một RESTful Web Service, chúng ta thường sử dụng những request dạng như “/student/2” hay “product/5”, trong đó các giá trị 2 và 5 là những giá trị có thể thay đổi được tuỳ theo nhu cầu. Để xây dựng những request kiểu như vậy trong Spring MVC, chúng ta cần định nghĩa các biến trong request URI và sử dụng annotation @PathVariable để binding các tham số của phương thức với những biến này. Cụ thể như thế nào? Chúng ta hãy cùng nhau tìm hiểu trong bài viết này các bạn nhé!
Đầu tiên, mình sẽ tạo một Maven project để làm ví dụ:
Bạn nào chưa biết cách tạo thì làm theo hướng dẫn của bài viết này nhé các bạn!
Các dependencies mặc định mình đã thay đổi version như sau:
1 2 3 4 5 6 7 8 9 10 |
<properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <org.springframework-version>6.1.10</org.springframework-version> <org.aspectj-version>1.9.22.1</org.aspectj-version> <org.slf4j-version>2.0.13</org.slf4j-version> <org.junit-version>5.10.2</org.junit-version> <jakarta.servlet-api-version>6.1.0</jakarta.servlet-api-version> </properties> |
Để chạy project này, mình sẽ sử dụng Maven Jetty Plugin:
1 2 3 4 5 |
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>11.0.21</version> </plugin> |
Bây giờ, mình sẽ tạo mới một Controller tên là StudentController với nội dung ban đầu như sau:
1 2 3 4 5 6 7 8 |
package com.huongdanjava.springmvc; import org.springframework.web.bind.annotation.RestController; @RestController public class StudentController { } |
Giờ mình cần thêm một request để người dùng cho thể lấy thông tin theo ID của sinh viên có dạng “student/<student_id>”, mình sẽ thêm như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava.springmvc; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class StudentController { @GetMapping(value = "/student/{id}") String findById(@PathVariable String id) { return "Student ID: " + id; } } |
Như các bạn thấy, trong request URL, mình đã khai báo {id} để định nghĩa một biến id, và với việc sử dụng annotation @PathVariable trong tham số của phương thức, biến trong request URL sẽ được bind với tham số này. Nếu bây giờ, các bạn chạy ứng dụng và request tới URL “http://localhost:8080/student/1” thì kết quả sẽ là:
Các bạn chú ý là tên của biến trong request URL phải giống với tên của tham số được khai báo với annotation @PathVariable. Trong trường hợp, tên của tham số của phương thức không trùng với tên biến của request URL thì các bạn khai báo thêm thuộc tính value cho annotation @PathVariable là được:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava.springmvc; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class StudentController { @GetMapping(value = "/student/{id}") String findById(@PathVariable(value = "id") String studentId) { return "Student ID: " + studentId; } } |
Khi đó, nếu các bạn refresh lại URL trên thì kết quả vẫn như vậy.