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