Matrix Variable یکی دیگر از انواع متغییر هایی که همراه با درخواست GET میتوان ارسال کرد Matrix Variable است و میتواند شامل تعداد زیادی پارامتر باشد
Spring از ورژن 3.2 از Matrix Variable حمایت میکند ولی ابتدا باید آنرا در تنظیمات فعال کنیم :
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
ساختار و نحوه استفاده از Matrix Variable :
Matrix Variable میتواند هر کجای URL قرار گیرد و کلید مقدار ها با '=' مشخص و با ';' از هم جدا میشوند و اگر یک کلید دارای مقادیر مختلفی باشد با ',' مشخص میشود
http://localhost:8080/spring-mvc-java/employeeArea/workingArea=rh,informatics,admin
http://localhost:8080/spring-mvc-java/employeeArea/workingArea=rh;workingArea=informatics;workingArea=admin
دو کلاس Model زیر را در نظر بگیرید :
public class Employee {
private long id;
private String name;
private String contactNumber;
// standard setters and getters
}
public class Company {
private long id;
private String name;
// standard setters and getters
}
و Matrix Variable زیر را در در نظر بگیرید که میخواهیم در Controller آنرا استخراج کنیم :
http://localhost:8080/spring-mvc-java/employeesContacts/contactNumber=223334411
@RequestMapping(value = "/employeesContacts/{contactNumber}",
method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<List<Employee>> getEmployeeBycontactNumber(
@MatrixVariable(required = true) String contactNumber) {
List<Employee> employeesList = new ArrayList<Employee>();
...
return new ResponseEntity<List<Employee>>(employeesList, HttpStatus.OK);
}
توسط MatrixVariable@ مقدار متغییر را دریافت و بعد تمامی Employee هایی که contact number آنها 223334411 است را دریافت میکنیم
MatrixVariable همراه با PathVaraible :
ساختار :
http://localhost:8080/spring-mvc-java/employees/John;beginContactNumber=22001
نحوه دریافت :
@RequestMapping(value = "/employees/{name}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<List<Employee>> getEmployeeByNameAndBeginContactNumber(
@PathVariable String name, @MatrixVariable String beginContactNumber) {
List<Employee> employeesList = new ArrayList<Employee>();
...
return new ResponseEntity<>(employeesList, HttpStatus.OK);
}
نحوه دریافت چند MatrixVariable در قالب Map بصورت کلید / مقدار :
http://localhost:8080/spring-mvc-java/employeeData/id=1;name=John;contactNumber=2200112334
@GetMapping("employeeData/{employee}")
@ResponseBody
public ResponseEntity<Map<String, String>> getEmployeeData(
@MatrixVariable Map<String, String> matrixVars) {
return new ResponseEntity<>(matrixVars, HttpStatus.OK);
}
دریافت MatrixVariable با جایگاه مختلف :
http://localhost:8080/spring-mvc-java/ companyEmployee/id=2;name=Xpto/employeeData/id=1;name=John; contactNumber=2200112334
@RequestMapping(
value = "/companyEmployee/{company}/employeeData/{employee}",
method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<Map<String, String>> getEmployeeDataFromCompany(
@MatrixVariable(pathVar = "employee") Map<String, String> matrixVars) {
...
}
MatrixVariable ها میتوانند ساختار منعطف تری هم داشته باشند مثلا میخواهیم از یک بخشی از URL مقدار یک متغییر را توسط نامش بدست آوریم :
http://localhost:8080/spring-mvc-java/ companyData/id=2;name=Xpto/employeeData/id=1;name=John; contactNumber=2200112334
و Bind کردن آن روی یک String :
@MatrixVariable(value="name", pathVar="company") String name