Кратко ръководство за променливи променливи MVC

1. Общ преглед

Спецификацията на URI RFC 3986 дефинира параметрите на пътя на URI като двойки име-стойност. Матричните променливи е измислен от Spring термин и алтернативно изпълнение за предаване и анализиране на параметрите на URI път.

Поддръжката на матрични променливи стана достъпна през Spring MVC 3.2 и има за цел да опрости заявките с голям брой параметри .

В тази статия ще покажем как можем да опростим сложни GET заявки, които използват или променливи, или незадължителни параметри на пътя вътре в различните сегменти на път на URI.

2. Конфигурация

За да активирате променливите Spring MVC Matrix, нека започнем с конфигурацията:

@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { UrlPathHelper urlPathHelper = new UrlPathHelper(); urlPathHelper.setRemoveSemicolonContent(false); configurer.setUrlPathHelper(urlPathHelper); } }

В противен случай те са деактивирани по подразбиране.

3. Как да използваме матрични променливи

Тези променливи могат да се появят във всяка част от пътя и знакът е равен („=“) се използва за даване на стойности, а точката с точка и запетая (';') за ограничаване на всяка матрична променлива. По същия път можем също да повторим едно и също име на променлива или да отделим различни стойности, като използваме символната запетая (',').

В нашия пример има контролер, който предоставя информация за служителите. Всеки служител има работна зона и ние можем да търсим по този атрибут. За търсене може да се използва следната заявка:

//localhost:8080/spring-mvc-java-2/employeeArea/workingArea=rh,informatics,admin

или по този начин:

//localhost:8080/spring-mvc-java-2 /employeeArea/workingArea=rh;workingArea=informatics;workingArea=admin

Когато искаме да се позовем на тези променливи в Spring MVC, трябва да използваме анотацията @MatrixVariable .

В нашите примери ще използваме класа Employee :

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 }

Тези два класа ще обвържат параметрите на заявката.

4. Определяне на свойствата на променливите на матрицата

Можем да посочим задължителни или стандартни свойства за променливата. В следващия пример се изисква contactNumber , така че трябва да бъде включен в нашия път, нещо подобно:

//localhost:8080/spring-mvc-java-2/employeesContacts/contactNumber=223334411

Заявката ще бъде обработена по следния метод:

@RequestMapping(value = "/employeesContacts/{contactNumber}", method = RequestMethod.GET) @ResponseBody public ResponseEntity
    
      getEmployeeBycontactNumber( @MatrixVariable(required = true) String contactNumber) { List employeesList = new ArrayList(); ... return new ResponseEntity
     
      (employeesList, HttpStatus.OK); }
     
    

В резултат на това ще получим всички служители, които имат контактния номер 223334411 .

5. Параметър за допълване

Матричните променливи могат да допълват променливите на пътя.

Например търсим служител за името му, но можем да включим и началните номера на неговия / нейния номер за контакт.

Заявката за това търсене трябва да бъде следната:

//localhost:8080/spring-mvc-java-2/employees/John;beginContactNumber=22001

Заявката ще бъде обработена по следния метод:

@RequestMapping(value = "/employees/{name}", method = RequestMethod.GET) @ResponseBody public ResponseEntity
    
      getEmployeeByNameAndBeginContactNumber( @PathVariable String name, @MatrixVariable String beginContactNumber) { List employeesList = new ArrayList(); ... return new ResponseEntity(employeesList, HttpStatus.OK); }
    

В резултат на това ще получим всички служители, които имат контактния номер 22001 или чието име е Джон .

6. Обвързване на всички матрични променливи

If for some reason, we want to get all the variables that are available on the path, we can bind them to a Map:

//localhost:8080/spring-mvc-java-2/employeeData/id=1;name=John;contactNumber=2200112334

This request will be handled by the following method:

@GetMapping("employeeData/{employee}") @ResponseBody public ResponseEntity getEmployeeData( @MatrixVariable Map matrixVars) { return new ResponseEntity(matrixVars, HttpStatus.OK); }

Of course, we can restrict binding to the matrix variables of a specific part of the path. For example, if we have a request like this:

//localhost:8080/spring-mvc-java-2/ companyEmployee/id=2;name=Xpto/employeeData/id=1;name=John; contactNumber=2200112334

And we only want to get all the variables that belong to employeeData; then we should use as an input parameter this:

@RequestMapping( value = "/companyEmployee/{company}/employeeData/{employee}", method = RequestMethod.GET) @ResponseBody public ResponseEntity getEmployeeDataFromCompany( @MatrixVariable(pathVar = "employee") Map matrixVars) { ... }

7. Partial Binding

Apart from simplicity, flexibility is another gain, matrix variables can be used in a variety of different ways. For example, we can get each variable from each path segment. Consider the following request:

//localhost:8080/spring-mvc-java-2/ companyData/id=2;name=Xpto/employeeData/id=1;name=John; contactNumber=2200112334

Ако искаме да знаем само името на матричната променлива на сегмента companyData , тогава трябва да използваме като входен параметър следното:

@MatrixVariable(value="name", pathVar="company") String name 

8. Заключение

Тази статия илюстрира някои от различните начини, по които могат да се използват матрични променливи.

Важно е да разберем как този нов инструмент може да се справи с твърде сложни заявки или да ни помогне да добавим повече параметри, за да ограничим търсенето си.

Изпълнението на всички тези примери и кодови фрагменти може да се намери в проект на GitHub - това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.